wenbo2005.online

学习记录 / STM32

看门狗本质是递减计数器

STM322024-11-04

(一),独立看门狗

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");
}