目录
【窗口看门狗】
独立看门狗主要用于检测硬件异常,串口看门狗主要用于检测软件异常
窗口看门狗用于监测单片机程序运行时效是否精准,主要检测软件异常,一般用于需要精准检测程序运行时间的场合。
提前唤醒中断一般用于保存数据,因为即将复位
【窗口看门狗工作原理】
【窗口看门狗框图】
PCLK1_MAX = 36 MHz
【控制寄存器WWDG_CR】
【配置寄存器WWDG_CFR】
【状态寄存器WWDG_SR】
超时时间计算公式:
● 4096是WWDG固定的预分频系数
【demo · WWDG】
demo概述:
开启窗口看门狗,计数器值设置为 0X7F ,窗口值设置为 0X5F ,预分频系数为 8 。程序启动时循环点亮、熄灭LED,设置时间间隔。在提前唤醒中断服务函数进行喂狗。
其中0X7F(即127)为计数器最大值,8为预分频系数最大值,通过下面的计算可知喂狗间隔需小于58.25 ms,且因为Early wakeup interrupt 和普通NVIC不一样,无法设置其NVIC优先级,故demo现象如下:
当循环点亮、熄灭LED的时间间隔<58ms时,程序喂狗正常,LED时钟闪烁
当循环点亮、熄灭LED的时间间隔≥58.25ms时,程序喂狗异常,LED常量
计算:
T_out = 4096 * 8 * 64 ÷ (36 * 1000000) = 0.058254 s = 58.25 ms
T_window = 4096 * 8 * 32 ÷ (36 * 1000000)= 29.13 ms
其中:
64 = 127-63
32 = 127-95
由此可知,在36MHz的条件下,58.25 ms为喂狗间隔的最大值
接线:LED——PC13
注意:Early wakeup interrupt 和普通NVIC不一样,在NVIC设置中找不到该项
初始化函数
MX_WWDG_Init();
喂狗函数
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
HAL_WWDG_Refresh(hwwdg);
}
demo代码
/* wwdg.c */
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
HAL_WWDG_Refresh(hwwdg);
}
/* main.c */
#include "main.h"
#include "wwdg.h"
#include "gpio.h"
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_WWDG_Init();
while (1)
{
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin,GPIO_PIN_RESET);
HAL_Delay(40);
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin,GPIO_PIN_SET);
HAL_Delay(40);
}
}