(一),独立看门狗
IWDG down-counter reload value ==> 4095(最大)----->0(固定)
//程序实现=============================================================================
/* USER CODE BEGIN 2 */
if(__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET) //判断复位类型,如果是独立看门狗复位
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,0);
__HAL_RCC_CLEAR_RESET_FLAGS(); //复位标志为清除
}
else
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* T = PSC * CNT / 32k STM32G431 LSI大约为32KHz(C8T6的是40k) */ //计算公式
HAL_Delay(1200);//该设置大于1秒,所以会复位
HAL_IWDG_Refresh(&hiwdg); //给独立看门狗喂狗,就是写入0XAAA
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
//===================================================================================
(二),窗口看门狗
WWDG free-running downcounter value==0X7F(最大)---->0X3F(固定)
如果0X5F是窗口期,则在(0X7F---->0X5F)与0X3F之后(实际也达不到)喂狗则复位,时间控制比独立看门狗更精准,用于软件检查;
//WWDG window value ==> G431的AHB1最高是170MHz,这里选80MHz,WWDG counter clock prescaler ==> PSC选32分频
T = 4096 * PSC * (0X7F - 0X3F)/ 80 * 1e6 //最大时间
T = 4096 * PSC * (0X7F - 0X5F)/ 80 * 1e6 //=======窗口时间点(最小时间)
所以,在104.9ms >= time > 52.4ms 内喂狗不会复位
//程序实现=============================================================================
/* USER CODE BEGIN 2 */
if(__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) != RESET)//判断复位类型,如果是窗口看门狗复位
{
printf("WWDG\r\n");
__HAL_RCC_CLEAR_RESET_FLAGS();//复位标志为清除
}
else
{
printf("NO WWDG\r\n");
}
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_Delay(80);//该设置大于52.4ms,所以会复位
HAL_WWDG_Refresh(&hwwdg);//给窗口看门狗喂狗
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
//====================================================================================
开启 WWDG 的窗口中断,在数到0X40(0X3F上一个数)时,会进入中断回调函数:
使能 Early wakeup interrupt , 设置中断优先级
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
HAL_WWDG_Refresh(hwwdg); //在中断里喂狗,永远不会复位
printf("NVIC\r\n");
}