19 窗口看门狗 (WWDG)
除非特别说明,否则本部分适用于整个 STM32F4xx 系列。
19.1 WWDG 简介
窗口看门狗通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在 T6 位变成 0 前被刷新,看门狗电路在 达到预置的时间周期时,会产生一个 MCU 复位。如果在递减计数器达到窗口寄存器值之前 刷新控制寄存器中的 7 位递减计数器值,也会产生 MCU 复位。这意味着必须在限定的时间 窗口内刷新计数器。
19.2 WWDG 主要特性
● 可编程的自由运行递减计数器
● 复位条件
— 当递减计数器值小于 0x40 时复位(如果看门狗已激活)
— 在窗口之外重载递减计数器时复位(如果看门狗已激活)(请参见图 200) ● 提前唤醒中断 (EWI):当递减计数器等于 0x40 时触发(如果已使能且看门狗已激活)
由下图得知WWDG挂在APB1总线上,最大时钟频率42MHZ
看门狗使用的时候要慎重,因为在正常情况下使用,会导致之前的数据没有保存而复位mcu。
外设总线时钟频率并不直接驱动看门狗,看下图:
经过了WWDG内部预分频器的分频之后,驱动WWDG内部递减计数器计数。
0-6bit:窗口值,在窗口值之下,大于0x40之间可以喂狗
窗口值之上,重载值之下不能喂狗,喂狗就复位mcu(使能看门狗的情况下)
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
curent_value = WWDG->CR;
if(curent_value < window_value)
{
/*喂狗*/
HAL_WWDG_Refresh(&hwwdg);
}
}
/* USER CODE END 3 */
}
来了个按键中断,延时等待看门狗早期中断唤醒
/* USER CODE BEGIN 2 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_0)
{
/*消除抖动*/
HAL_Delay(10);
/*确认按键按下*/
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET)
{
printf("系统崩溃\n");
/*点亮LED4*/
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,GPIO_PIN_RESET);
HAL_Delay(3000);
}
}
}
早期中断函数入口
/* USER CODE BEGIN 1 */
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef* hwwdg)
{
if(hwwdg->Instance == WWDG)
{
printf("早期唤醒中断进入\n");
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,GPIO_PIN_SET);
printf("早期唤醒中断退出\n");
}
}
/* USER CODE END 1 */