LFB 发表于 2023-3-16 18:51:56

关于 STC8H3K64S2 看门狗

关于 STC8H3K64S2 看门狗的应用
看到有硬件(ISP)与软件启动方式2种.
    我的疑问是:
    如果由硬件(ISP)配置,启动看门狗,同时设置分频系数,
在程序里,软件是不能再关闭的,那分频系数这个软件还能修改吗?

LFB 发表于 2023-3-16 19:10:27

本帖最后由 LFB 于 2023-3-16 20:05 编辑



#define MAIN_Fosc                   22118400L   //定义主时钟(精确计算9600波特率)

#define D_WDT_FLAG          (1<<7)
#define D_EN_WDT            (1<<5)
#define D_CLR_WDT         (1<<4)// auto clear
#define D_IDLE_WDT          (1<<3)// WDT counter when Idle
#define D_WDT_SCALE_2       0
#define D_WDT_SCALE_4       1
#define D_WDT_SCALE_8       2       // T=393216*N/fo
#define D_WDT_SCALE_16      3
#define D_WDT_SCALE_32      4
#define D_WDT_SCALE_64      5
#define D_WDT_SCALE_128   6
#define D_WDT_SCALE_256   7
#define WDT_PS_Set(n)   do{ WDT_CONTR = (WDT_CONTR & ~0x07) | (n & 0x07); } while(0)      // 看门狗定时器时钟分频系数设置
#define WDT_reset(n)    do{ WDT_CONTR = D_EN_WDT + D_CLR_WDT + D_IDLE_WDT + (n); } while(0)   // 初始化WDT,喂狗
#define CLRWDT()      do{ WDT_CONTR |= D_CLR_WDT; } while(0)

CLRWDT()      do{ WDT_CONTR |= D_CLR_WDT; } while(0)                              // 清看门狗

通过ISP启用WDT,64分频(20M主频时,约1.26秒,我这个应该差不多),程序中通过 CLRWDT() 清看门够,发现不起作用(会复位).但同一个程序通过ISP关闭WDT方式重新烧录是正常.
这种清看门狗方式不对?


-----------------------------编辑增加说明-----------------------------
程序中有EEPROM操作(FLASH模拟)



-----------------------------再编辑增加说明-----------------------------
上面的清WDT方式(WDT_CONTR |= D_CLR_WDT;)没问题,关于同一个程序通过ISP关闭WDT方式重新烧录是正常,是乌龙,程序修改有错,没注意看,直接在STC-ISP软件点下载.
但关于ISP配置WDT分频,软件能不能修改这个暂时未测试.

神农鼎 发表于 2023-3-16 19:46:11

启动看门狗后:
1,看门狗就不能被关闭,除非停电===这才是尽职的狗
2,喂狗时间可以被反复修改====灵活性

LFB 发表于 2023-3-16 20:07:48

神农鼎 发表于 2023-3-16 19:46
启动看门狗后:
1,看门狗就不能被关闭,除非停电===这才是尽职的狗
2,喂狗时间可以被反复修改====灵活性 ...

感谢,已经确认是软件问题.

LFB 发表于 2023-3-16 20:13:17

本帖最后由 LFB 于 2023-3-16 20:15 编辑

有个奇怪的问题还没想到哪不对


void F_ShowAll(void)
{
    volatile u16 u16Xms = 500;
    App_AllDisplayData(0xff);
    App_TM1640Display();

    //F_DelayXms(250);
    //F_DelayXms(250);

    fTick1ms = 0;
    while(u16Xms)
    {
      if(1 == fTick1ms)
      {
            fTick1ms = 0;

            CLRWDT();
            u16Xms--;
      }
    }

    App_AllDisplayData(0x00);
    App_TM1640Display();
}

这段程序就会死机(WDT复位),效果就是一直全显示.fTick1ms在定时中断置位.

LFB 发表于 2023-3-16 20:18:14


             ; FUNCTION F_ShowAll (BEGIN)
                                           ; SOURCE LINE # 398
                                           ; SOURCE LINE # 399
                                           ; SOURCE LINE # 400
0000 750001      R   MOV   u16Xms,#01H
0003 7500F4      R   MOV   u16Xms+01H,#0F4H
                                           ; SOURCE LINE # 401
0006 7FFF            MOV   R7,#0FFH
0008 120000      E   LCALL   _App_AllDisplayData
                                           ; SOURCE LINE # 402
000B 120000      E   LCALL   App_TM1640Display
                                           ; SOURCE LINE # 407
000E C200      E   CLR   fTick1ms
0010         ?C0098:
                                           ; SOURCE LINE # 408
0010 E500      R   MOV   A,u16Xms+01H
0012 4500      R   ORL   A,u16Xms
0014 6012            JZ      ?C0099
                                           ; SOURCE LINE # 409
C51 COMPILER V9.60.0.0   APP_UI                                                            03/16/2023 20:08:07 PAGE 25

                                           ; SOURCE LINE # 410
0016 3000F7      E   JNB   fTick1ms,?C0098
                                           ; SOURCE LINE # 411
                                           ; SOURCE LINE # 412
0019 C200      E   CLR   fTick1ms
                                           ; SOURCE LINE # 414
001B 120000      E   LCALL   CLRWDT
                                           ; SOURCE LINE # 415
001E E500      R   MOV   A,u16Xms+01H
0020 1500      R   DEC   u16Xms+01H
0022 70EC            JNZ   ?C0098
0024 1500      R   DEC   u16Xms
0026         ?C0104:
                                           ; SOURCE LINE # 416
                                           ; SOURCE LINE # 417
0026 80E8            SJMP    ?C0098
0028         ?C0099:
                                           ; SOURCE LINE # 419
0028 E4                CLR   A
0029 FF                MOV   R7,A
002A 120000      E   LCALL   _App_AllDisplayData
                                           ; SOURCE LINE # 420
002D 020000      E   LJMP    App_TM1640Display
             ; FUNCTION F_ShowAll (END)
这是反汇编


void F_DelayXms(u8 u8Xms)
{
    fTick1ms = 0;
    while(u8Xms)
    {
      if(1 == fTick1ms)
      {
            fTick1ms = 0;

            CLRWDT();
            u8Xms--;
      }
    }
}
但通过调用上面函数的方式[调用2次F_DelayXms(250)]就没问题.

梁工 发表于 2023-3-16 23:26:26

我一般建议再程序里启动看门狗,只在主循环喂狗一次。
硬件启动也可以,程序运行后,在看门狗溢出之前一定要喂狗。碰到个别客户,用硬件启动看门都,但初始化时间太长,没有及时喂狗,导致不断复位。

特别提醒:不要在中断中喂狗。研发程序时先不要启动看门狗,研发完成最后再启动。

LFB 发表于 2023-3-17 10:28:39

梁工 发表于 2023-3-16 23:26
我一般建议再程序里启动看门狗,只在主循环喂狗一次。
硬件启动也可以,程序运行后,在看门狗溢出之前一定 ...

没在中断喂狗,肯定不会在中断这样操作的.
因为就是上电全显示,所以简单处理,直接延时个0.5秒(延时过程中清WDT),
页: [1]
查看完整版本: 关于 STC8H3K64S2 看门狗