1 定义:
窗口看门狗 WWDG 其实和独立看门狗类似似,它是一个 7 位递减计数器不断的往下递减计数,当减到一个固定值 0X40 时还不喂狗的话,产生一个 MCU 复位,这个值叫窗口的下限,是固定的值,不能改变。
窗口看门狗的计数器是一个7位的递减计数器,当7个位全为1时是0x7F,这个是最大值。当从0x40变为0x3F时,会产生看门狗复位。这个值0x40是看门狗能够递减到的最小值,所以计数器的值只能是:0x40 ~ 0x7F之间。
T[6:0] 就是窗口看门狗的计数器,而 W[6:0]则是窗口看门狗的上窗口,下窗口值是固定的(0X40),喂狗时间为上窗口和下窗口之间才能喂狗。
窗口看门狗的超时公式如下:
Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /Fpclk1;
其中:
- Twwdg:WWDG 超时时间(单位为 ms)
- Fpclk1:APB1 的时钟频率(单位为 Khz)
- WDGTB:WWDG 的预分频系数
- T[5:0]:窗口看门狗的计数器低 6 位
2 CUBMAX设置
3 函数
窗口看门狗中断服务函数为:
void WWDG_IRQHandler(void);
在 HAL 库中,喂狗函数为:
HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg)
窗口看门狗唤醒中断处理回调函数:
void HAL_WWDG_EarlyWakeupCallback (WWDG_HandleTypeDef* hwwdg);跟串口和外部中断一样,首先,HAL 库定义了一个中断处理共用函数 HAL_WWDG_IRQHandler,在 WWDG 中断服务函数中会调用该函数。
同时该函数内部, 会经过一系列判断,最后调用回调函数 HAL_WWDG_WakeupCallback,所以提前唤醒中断逻辑 我们一般些在回调函数 HAL_WWDG_WakeupCallback 中。
4 代码
main.c
/* USER CODE BEGIN 0 */ //中断服务函数处理过程 //此函数会被 HAL_WWDG_IRQHandler()调用 void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef* hwwdg) { HAL_WWDG_Refresh(hwwdg);//更新窗口看门狗值 HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_5); } /* USER CODE END 0 */
/* USER CODE BEGIN 2 */ HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET); //点亮 LED0 HAL_Delay(300); //延时 300ms 再初始化看门狗,LED0 的变化"可见 /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET); //熄灭 LED 灯 /* USER CODE BEGIN 3 */ }
将代码下载到精英 STM32 开发板后,可以看到 DS0 亮一下之后熄灭,紧接着 DS1 开始不停的闪烁。
标签:HAL,函数,门狗,看门狗,WWDG,GPIO,窗口 From: https://www.cnblogs.com/CC-C/p/17040651.html