当前位置:   article > 正文

窗口看门狗WWDG

窗口看门狗WWDG

窗口看门狗介绍

窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运
行序列而产生的软件故障。除非递减计数器的值在 T6 位变成 0 前被刷新,看门狗电路在达到预置
的时间周期时,会产生一个 MCU 复位。在递减计数器达到窗口寄存器数值之前,如果 7 位的递减
计数器数值 ( 在控制寄存器中 ) 被刷新, 那么也将产生一个 MCU 复位。这表明递减计数器需要在
一个有限的时间窗口中被刷新。
窗口看门狗用于监测单片机程序运行时效是否精准,主要检测软件异常(独立看门狗检测的是硬件异常),一般用于需要精准检测(独立看门狗不太精准)程序运行时间的场合。

窗口看门狗的本质

窗口看门狗的本质是一个能产生系统复位信号提前唤醒中断6位计数器

产生复位条件:

1. 当递减计数器值从 0x40(64) 减到 0x3F(63) 时复位(即T6位跳变到0)

2. 计数器的值大于 W[6:0] 值时喂狗会复位。

产生中断条件:

1. 当递减计数器等于 0x40 时可产生提前唤醒中断 (EWI)。

窗口看门狗工作原理

在窗口期内重装载计数器的值,防止复位,也就是所谓的喂狗。

WWDG框图

WWDG寄存器

控制寄存器(WWDG_CR)

配置寄存器(WWDG_CFR)

状态寄存器(WWDG_SR)(中断唤醒标志)

超时时间计算 :

Tout 是WWDG超时时间(没喂狗)

Fwwdg 是WWDG的时钟源频率(最大36M(默认))

4096 是WWDG固定的预分频系数

2^WDGTB 是WWDG_CFR寄存器设置的预分频系数值

T[5:0] 是WWDG计数器低6位,最多63

(T[5:0]+1)就是计数次数;

剩下部分是记一次数用的时间,相乘就是超时时间(1/(Fwwdg/4096*2^WDGTB))

                                                                                        (这里计算的是频率,倒数才是T)

窗口看门狗实验

需求

开启窗口看门狗,计数器值设置为 0X7F ,窗口值设置为 0X5F ,预分频系数为 8(WDGTB=3)程序启动时点 亮 LED1 ,300ms 后熄灭。在提前唤醒中断服务函数进行喂狗,同时翻转 LED2 状态。

此时Tout1 = (4096*8*64)/36000(ms) 约等于58.25ms

Tout2 = (4096*8*42)/36000(ms) 约等于29.13ms

 CubeMx

1.常规配置

SYS->Debug->Serial Wire

RCC->High Speed Clock(HSE)->Crystal/Ceramic Resonator

时钟树HSE、PLLCLK打开,HCLK设置成72MHz、

2.可看到时钟树的PCLK1最大也就36MHz

3.

4.打开中断

 

Keil

1.查看WWDG的初始化

2.通过stm32f1xx_it.c --> WWDG_IRQHandler() --> HAL_WWDG_IRQHandler() --> HAL_WWDG_EarlyWakeupCallback()这就是提前唤醒中断的处理函数,需要在Main.c中重写:

3.编写代码

注意,这部分的代码不再是完全写在系统提示的用户代码区间,因为项目要求在启动时点亮LED1 300ms,而这句话如果写在看门狗的初始化的后面,显然会导致直接Time out复位,所以LED1点亮的代码不得不写在窗口看门狗初始化函数的前面。

但是在之后代码的编写中,还是要注意尽量把代码都写在系统提示的用户代码区间。

 

  1. void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
  2. {
  3. HAL_WWDG_Refresh(hwwdg); //喂狗
  4. HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);
  5. }
  6. int main(void)
  7. {
  8. MX_GPIO_Init();
  9. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
  10. HAL_Delay(300);
  11. MX_WWDG_Init();
  12. while (1)
  13. {
  14. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
  15. HAL_Delay(40);
  16. }
  17. }

 实验现象:程序开始运行时,LED1亮一下,然后LED2不断闪烁,表现在代码中就是窗口看门狗不断向下计数,每当快要复位时触发提前唤醒中断,进行喂狗并翻转LED状态

独立看门狗 和 窗口看门狗 的异同

对比点
独立看门狗
窗口看门狗
时钟源
独立时钟, LSI (40KHz) ,不精确
PCLK1 PCLK3 ,精
复位条件
递减计数到 0
窗口期外喂狗或减到 0x3F
中断
没有中断
计数值减到 0x40 可产生中断
递减计数器位数
12 位(最大计数范: 4096~0
7 位(最大计数范围: 127~63
应用场合
防止程序跑飞,死循环,死机(硬件)
检测程序时效,防止软件异常(软件)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/431647
推荐阅读
相关标签
  

闽ICP备14008679号