找回密码
 立即注册
查看: 1359|回复: 7

关于 STC8H3K64S2 看门狗

[复制链接]
  • TA的每日心情
    郁闷
    2024-1-18 18:18
  • 签到天数: 1 天

    [LV.1]初来乍到

    6

    主题

    22

    回帖

    138

    积分

    注册会员

    积分
    138
    发表于 2023-3-16 18:51:56 | 显示全部楼层 |阅读模式
    关于 STC8H3K64S2 看门狗的应用
    看到有硬件(ISP)与软件启动方式2种.
        我的疑问是:
        如果由硬件(ISP)配置,启动看门狗,同时设置分频系数,
    在程序里,软件是不能再关闭的,那分频系数这个软件还能修改吗?
    回复 送花

    使用道具 举报

  • TA的每日心情
    郁闷
    2024-1-18 18:18
  • 签到天数: 1 天

    [LV.1]初来乍到

    6

    主题

    22

    回帖

    138

    积分

    注册会员

    积分
    138
     楼主| 发表于 2023-3-16 19:10:27 | 显示全部楼层
    本帖最后由 LFB 于 2023-3-16 20:05 编辑
    1. #define MAIN_Fosc                   22118400L   //定义主时钟(精确计算9600波特率)
    2. #define D_WDT_FLAG          (1<<7)
    3. #define D_EN_WDT            (1<<5)
    4. #define D_CLR_WDT           (1<<4)  // auto clear
    5. #define D_IDLE_WDT          (1<<3)  // WDT counter when Idle
    6. #define D_WDT_SCALE_2       0
    7. #define D_WDT_SCALE_4       1
    8. #define D_WDT_SCALE_8       2       // T=393216*N/fo
    9. #define D_WDT_SCALE_16      3
    10. #define D_WDT_SCALE_32      4
    11. #define D_WDT_SCALE_64      5
    12. #define D_WDT_SCALE_128     6
    13. #define D_WDT_SCALE_256     7
    14. #define WDT_PS_Set(n)   do{ WDT_CONTR = (WDT_CONTR & ~0x07) | (n & 0x07); } while(0)        // 看门狗定时器时钟分频系数设置
    15. #define WDT_reset(n)    do{ WDT_CONTR = D_EN_WDT + D_CLR_WDT + D_IDLE_WDT + (n); } while(0)     // 初始化WDT,喂狗
    16. #define CLRWDT()        do{ WDT_CONTR |= D_CLR_WDT; } while(0)
    17. 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分频,软件能不能修改这个暂时未测试.

    该用户从未签到

    565

    主题

    9931

    回帖

    1万

    积分

    管理员

    积分
    14444
    发表于 2023-3-16 19:46:11 | 显示全部楼层
    启动看门狗后:
    1,看门狗就不能被关闭,除非停电===这才是尽职的狗
    2,喂狗时间可以被反复修改====灵活性
  • TA的每日心情
    郁闷
    2024-1-18 18:18
  • 签到天数: 1 天

    [LV.1]初来乍到

    6

    主题

    22

    回帖

    138

    积分

    注册会员

    积分
    138
     楼主| 发表于 2023-3-16 20:07:48 | 显示全部楼层
    神农鼎 发表于 2023-3-16 19:46
    启动看门狗后:
    1,看门狗就不能被关闭,除非停电===这才是尽职的狗
    2,喂狗时间可以被反复修改====灵活性 ...

    感谢,已经确认是软件问题.
  • TA的每日心情
    郁闷
    2024-1-18 18:18
  • 签到天数: 1 天

    [LV.1]初来乍到

    6

    主题

    22

    回帖

    138

    积分

    注册会员

    积分
    138
     楼主| 发表于 2023-3-16 20:13:17 | 显示全部楼层
    本帖最后由 LFB 于 2023-3-16 20:15 编辑

    有个奇怪的问题还没想到哪不对
    1. void F_ShowAll(void)
    2. {
    3.     volatile u16 u16Xms = 500;
    4.     App_AllDisplayData(0xff);
    5.     App_TM1640Display();
    6.     //F_DelayXms(250);
    7.     //F_DelayXms(250);
    8.     fTick1ms = 0;
    9.     while(u16Xms)
    10.     {
    11.         if(1 == fTick1ms)
    12.         {
    13.             fTick1ms = 0;
    14.             CLRWDT();
    15.             u16Xms--;
    16.         }
    17.     }
    18.     App_AllDisplayData(0x00);
    19.     App_TM1640Display();
    20. }
    21. 这段程序就会死机(WDT复位),效果就是一直全显示.fTick1ms在定时中断置位.
    复制代码
  • TA的每日心情
    郁闷
    2024-1-18 18:18
  • 签到天数: 1 天

    [LV.1]初来乍到

    6

    主题

    22

    回帖

    138

    积分

    注册会员

    积分
    138
     楼主| 发表于 2023-3-16 20:18:14 | 显示全部楼层
    1.              ; FUNCTION F_ShowAll (BEGIN)
    2.                                            ; SOURCE LINE # 398
    3.                                            ; SOURCE LINE # 399
    4.                                            ; SOURCE LINE # 400
    5. 0000 750001      R     MOV     u16Xms,#01H
    6. 0003 7500F4      R     MOV     u16Xms+01H,#0F4H
    7.                                            ; SOURCE LINE # 401
    8. 0006 7FFF              MOV     R7,#0FFH
    9. 0008 120000      E     LCALL   _App_AllDisplayData
    10.                                            ; SOURCE LINE # 402
    11. 000B 120000      E     LCALL   App_TM1640Display
    12.                                            ; SOURCE LINE # 407
    13. 000E C200        E     CLR     fTick1ms
    14. 0010         ?C0098:
    15.                                            ; SOURCE LINE # 408
    16. 0010 E500        R     MOV     A,u16Xms+01H
    17. 0012 4500        R     ORL     A,u16Xms
    18. 0014 6012              JZ      ?C0099
    19.                                            ; SOURCE LINE # 409
    20. C51 COMPILER V9.60.0.0   APP_UI                                                            03/16/2023 20:08:07 PAGE 25  
    21.                                            ; SOURCE LINE # 410
    22. 0016 3000F7      E     JNB     fTick1ms,?C0098
    23.                                            ; SOURCE LINE # 411
    24.                                            ; SOURCE LINE # 412
    25. 0019 C200        E     CLR     fTick1ms
    26.                                            ; SOURCE LINE # 414
    27. 001B 120000      E     LCALL   CLRWDT
    28.                                            ; SOURCE LINE # 415
    29. 001E E500        R     MOV     A,u16Xms+01H
    30. 0020 1500        R     DEC     u16Xms+01H
    31. 0022 70EC              JNZ     ?C0098
    32. 0024 1500        R     DEC     u16Xms
    33. 0026         ?C0104:
    34.                                            ; SOURCE LINE # 416
    35.                                            ; SOURCE LINE # 417
    36. 0026 80E8              SJMP    ?C0098
    37. 0028         ?C0099:
    38.                                            ; SOURCE LINE # 419
    39. 0028 E4                CLR     A
    40. 0029 FF                MOV     R7,A
    41. 002A 120000      E     LCALL   _App_AllDisplayData
    42.                                            ; SOURCE LINE # 420
    43. 002D 020000      E     LJMP    App_TM1640Display
    44.              ; FUNCTION F_ShowAll (END)
    45. 这是反汇编
    46. void F_DelayXms(u8 u8Xms)
    47. {
    48.     fTick1ms = 0;
    49.     while(u8Xms)
    50.     {
    51.         if(1 == fTick1ms)
    52.         {
    53.             fTick1ms = 0;
    54.             CLRWDT();
    55.             u8Xms--;
    56.         }
    57.     }
    58. }
    59. 但通过调用上面函数的方式[调用2次F_DelayXms(250)]就没问题.
    复制代码

    该用户从未签到

    46

    主题

    3174

    回帖

    7173

    积分

    超级版主

    积分
    7173
    发表于 2023-3-16 23:26:26 | 显示全部楼层
    我一般建议再程序里启动看门狗,只在主循环喂狗一次。
    硬件启动也可以,程序运行后,在看门狗溢出之前一定要喂狗。碰到个别客户,用硬件启动看门都,但初始化时间太长,没有及时喂狗,导致不断复位。

    特别提醒:不要在中断中喂狗。研发程序时先不要启动看门狗,研发完成最后再启动。
  • TA的每日心情
    郁闷
    2024-1-18 18:18
  • 签到天数: 1 天

    [LV.1]初来乍到

    6

    主题

    22

    回帖

    138

    积分

    注册会员

    积分
    138
     楼主| 发表于 2023-3-17 10:28:39 | 显示全部楼层
    梁工 发表于 2023-3-16 23:26
    我一般建议再程序里启动看门狗,只在主循环喂狗一次。
    硬件启动也可以,程序运行后,在看门狗溢出之前一定 ...

    没在中断喂狗,肯定不会在中断这样操作的.
    因为就是上电全显示,所以简单处理,直接延时个0.5秒(延时过程中清WDT),
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-6-14 11:55 , Processed in 0.067377 second(s), 56 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表