[牛人杂谈] 窗口看门狗是什么

[复制链接]
1402|9
 楼主| jiekou001 发表于 2019-1-22 20:34 | 显示全部楼层 |阅读模式
窗看门狗定时器用来在一个指定的窗周期中实现系统复位,避免软件无限期进入不可控状态。
992665c470d713c532.png
        6位向下计数值(CNTDAT) 和6位比较值(CMPDAT),使得窗口周期更加灵活。
        支持4位值(PSCSEL)选择看门狗预分频值,预分频计数器最大可达11位。

M451系列开发板:使能窗口看门狗,设计程序让窗口看门狗3次超时中断后复位芯片。

 楼主| jiekou001 发表于 2019-1-22 20:36 | 显示全部楼层
函数分析
void CLK_EnableModuleClock(uint32_t u32ModuleIdx) 位置:clk.c
功能:使能当前硬件对应的时钟模块参数:
u32ModuleIdx:使能当前哪个时钟模块,若使能定时器0,填入参数为TMR0_MODULE;若使能串口0,填入参数为 UART0_MODULE,更多的参数值参考clk.c。

——————————————————————————————————————————
void CLK_SetModuleClock(uint32_t u32ModuleIdx, uint32_t u32ClkSrc, uint32_t u32ClkDiv) 位置:clk.c
功能:设置硬件模块的时钟源参数:
u32ModuleIdx:使能当前哪个时钟模块,若使能定时器0,填入参数为TMR0_MODULE;若使能串口0,填入参数为
UART0_MODULE,更多的参数值参考clk.c。
u32ClkSrc:设置模块的时钟源。 u32ClkDiv:设置时钟源输入分频值。


 楼主| jiekou001 发表于 2019-1-22 20:37 | 显示全部楼层
void WWDT_Open(uint32_t u32PreScale,uint32_t u32CmpValue, uint32_t u32EnableInt) 位置:wwdt.c
功能:设置硬件模块的时钟源参数: u32PreScale:设置窗口看门狗的分频值,亦即对应窗口看门狗超时时间。 u32CmpValue:设置窗口看门狗的比较值,亦即通知我们现在该去喂狗了。 u32EnableInt:设置时钟源输入分频值。
————————————————————————————————————
WWDT_GET_RESET_FLAG() 位置:wwdt.h
功能:获取当前是否窗口看门狗导致复位。
参数:无。

—————————————————————————————————————
WWDT_CLEAR_RESET_FLAG() 位置:wwdt.h 功能:清除当前窗口狗复位标志位。参数:无。
—————————————————————————————————————
WWDT_GET_INT_FLAG() 位置:wwdt.h
功能:判断当前窗口看门狗是否产生中断。
参数:无。

——————————————————————————————————
WWDT_CLEAR_INT_FLAG() 位置:wwdt.h 功能:清除当前窗口看门狗中断标志位。参数:无。

 楼主| jiekou001 发表于 2019-1-22 20:40 | 显示全部楼层
  1. /************************* Copyright (c) 2014 SmartMcu Team *****************************
  2. *项目名称:窗看门狗超时复位
  3.                         *产生比较匹配中断时,进入喂狗10次
  4.                         *超过10次后,就不喂狗,直接复位

  5. *开发平台:SmartM-M4系列开发板
  6. ****************************************************************************************/
  7. #include "SmartM_M4.h"

  8. /*-------------------------------------------------------*/
  9. /*                     全局变量                          */
  10. /*-------------------------------------------------------*/
  11. EXTERN_C  INT32 IsDebugFifoEmpty(VOID);

  12. STATIC VOLATILE UINT8 g_unWWDTINTCounts;


  13. /*-------------------------------------------------------*/
  14. /*                        函数                           */
  15. /*-------------------------------------------------------*/

  16. /****************************************
  17. *函数名称:main
  18. *输    入:无
  19. *输    出:无
  20. *功    能:函数主体
  21. ******************************************/
  22. INT32 main(VOID)
  23. {
  24.        
  25.         PROTECT_REG
  26.         (
  27.                 /* 系统时钟初始化 */
  28.                 SYS_Init(PLL_CLOCK);
  29.                
  30.                 /* 使能窗口看门狗时钟 */
  31.                 CLK_EnableModuleClock(WWDT_MODULE);
  32.                
  33.                 /* 窗口看门狗时钟源为10KHz内部低速RC振荡器 */
  34.                 CLK_SetModuleClock(WWDT_MODULE, CLK_CLKSEL1_WWDTSEL_LIRC, 0);
  35.                
  36.                 /* 串口0波特率设置为115200bps */
  37.                 UART0_Init(115200);
  38.         )

  39.         printf("+------------------------------------------------+\n");
  40.         printf("|    WWDT Compare March Interrupt Sample Code    |\n");
  41.         printf("+------------------------------------------------+\n\n");

  42.         /* 检查芯片复位是否窗口看门狗复位 */
  43.         if(WWDT_GET_RESET_FLAG() == 1)
  44.         {
  45.                         WWDT_CLEAR_RESET_FLAG();
  46.                
  47.                         printf("当前复位是窗口看门狗超时复位触发\r\n");
  48.                
  49.         }


  50.         /* 使能窗口看门狗嵌套向量中断控制位 */
  51.         NVIC_EnableIRQ(WWDT_IRQn);

  52.         g_unWWDTINTCounts = 0;


  53.         /* 设置窗口看门狗超时时间为3.2768 s,当计数值从0x3F计数到0时,则超时时间为3.2768s,
  54.                  当前设置比较匹配时间为超时时间的一半,则比较匹配值=0x3F/2=32,并使能窗口看门狗中断
  55.          */
  56.         WWDT_Open(WWDT_PRESCALER_512, 32, TRUE);

  57.        
  58.         while(1);
  59. }


  60. /*-------------------------------------------------------*/
  61. /*                   中断服务函数                        */
  62. /*-------------------------------------------------------*/
  63. /****************************************
  64. *函数名称:WWDT_IRQHandler
  65. *输    入:无
  66. *输    出:无
  67. *功    能:窗口看门狗中断服务函数
  68. ******************************************/
  69. VOID WWDT_IRQHandler(VOID)
  70. {
  71.         if(WWDT_GET_INT_FLAG() == 1)
  72.         {
  73.                 /* 清除窗口看门狗比较匹配中断标志位 */
  74.                 WWDT_CLEAR_INT_FLAG();


  75.                 g_unWWDTINTCounts++;

  76.                 /* 若窗口看门狗比较匹配超过3次时,则不进行喂狗 */
  77.                 if(g_unWWDTINTCounts < 3)
  78.                 {
  79.                                 /* 重载看门狗计数值为0x3F */
  80.                                 WWDT_RELOAD_COUNTER();
  81.                 }

  82.                 printf("WWDT compare match interrupt occurred. (%d)\n", g_unWWDTINTCounts);
  83.         }
  84.          
  85. }



mintspring 发表于 2019-1-22 23:30 | 显示全部楼层
多谢分享,以前只知道看门狗,没想到还有这个。
heisexingqisi 发表于 2019-1-23 15:46 | 显示全部楼层
不是太明白。同样是复位系统吗
xinpian101 发表于 2019-1-25 17:15 | 显示全部楼层
WWDG与IWDG的主要区别是有一个窗口控制,WWDG的中断不是用于日常喂狗的,如果用于日常喂狗动作,那WWDG的相对于IWDG,功能也就没什么特别了。WWDG的中断是给程序员最后一次喂狗的机会,一般进入这个中断时,表示你在其他地方安排的喂狗操不能凑效了,而发生这种现象时,肯定是系统有问题了,或者程序有Bug或者干扰,在这种情况下,这个中断时为了让你的程序在发生真正的看门狗复位前,有一个紧急处理的机会,如保存重要数据,或者系统刹车,说白了,就是让CPU写“遗嘱”;

由此看出,简单的再WWDG中断中喂狗,既没有发挥WWDG相对于IWDG的优势,又因为在中断中喂狗,而为以后的产品留下了隐患。
捉虫天师 发表于 2019-1-27 15:29 | 显示全部楼层
6位向下计数值(CNTDAT) 和6位比较值(CMPDAT),使得窗口周期更加灵活。
huahuagg 发表于 2019-1-28 20:06 | 显示全部楼层
什么机制导致复位呢
天灵灵地灵灵 发表于 2019-1-29 11:46 | 显示全部楼层
这个貌似用的人不多
您需要登录后才可以回帖 登录 | 注册

本版积分规则

148

主题

1542

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部