1、WWDG超出时间计算
1.1 、WWDG的示意图
相比于独立看门狗,窗口看门狗(WWDG)是一个既能产生系统复位信号和提前唤醒中断的六位递减计数器。
(1)复位的条件: 1.当递减计数器值从0x40递减到0x3F时复位(即T6位跳变到0)
2. 计数器的值大于W[6:0]值时喂狗会复位。
(2)中断的条件: 1.当递减计数器等于0x40时可产生提前唤醒中断 (EWI)。
(3)喂狗条件 : 需要在窗口期(0x3F<窗口期< W[6:0])重装载计数器的值,才能防止复位。
1.2、 WWDG的cubemx的相关配置
其中
WWDG counter clock prescaler:预分频系数
WWDG window value:窗口上限值
WWDG free-running downcounter value :重装载计数值(计数器初始值)
Early wakeup interrupt :早期唤醒中断,在看门狗全局中断打开的基础上,开启后当计数器到达0x40时会进入早期唤醒回调函数(即中断函数),可以在早期唤醒中断回调函数中进行喂狗或者函数操作。
1.3、WWDG的超出时间计算
例子:系统时钟频率:42KHZ
固定预分频系数:4096
设置预分频系数:8
T[6:0]:0x7F(127)
W[6:0]:0x60(96)
计一个数的频率:PCLK1/8/4096 = 42KHZ/8/4096 = 1281Hz;
T[6:0]~W[6:0]所需时间:(0x7F-0x60)/ 1281 = (127-96)/1281=24.199ms;
W[6:0]~0x40所需时间:(0x60-0x3F)/ 1281= (96-63)/1281 = 25.76ms;
按照上述方法可算出窗口时间和计数值到窗口上限的时间,WWDG只能在窗口期喂狗,在窗口期之前和0x3f之后喂狗都会产生复位
2、WWDG中断
WWDG中断:需要配置stm32cubemx中的Early wakeup interrupt
Early wakeup interrupt :早期唤醒中断,在看门狗全局中断打开的基础上,开启后当计数器到达0x40时会进入早期唤醒回调函数,可以在早期唤醒中断回调函数中进行喂狗或者函数操作。
在计数器自减到0x40的过程中,始终都没有喂狗,当到0x40(64)的时候会触发中断,进入中断在中断函数的回调函数中我们可以实现----喂狗/其他函数操作。
中断函数如下(stm32f4xx_hal_wwdg.c中):
__weak void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(hwwdg);
/* NOTE: This function should not be modified, when the callback is needed,
the HAL_WWDG_EarlyWakeupCallback could be implemented in the user file
*/
}
可以看出前面有__weak,即虚函数,我们可以复制此函数到main.c中,自己去编写回调函数的逻辑(记得需要将前面的__weak去掉)