STM32 IWDG与WWDG看门狗深度解析:代码实战与系统自救策略指南

摘要:看门狗(Watchdog)是STM32系统中重要的故障恢复机制。本文将深入讲解独立看门狗(IWDG)和窗口看门狗(WWDG)的工作原理,并提供基于HAL库的配置例程,帮助开发者快速实现系统异常复位功能。


一、看门狗是什么?为什么需要它?

看门狗本质是一个递减计数器,当计数器减到0时会触发系统复位。正常运行时,程序需定期"喂狗"(重置计数器),若程序跑飞或陷入死循环无法及时喂狗,看门狗将强制复位系统。

典型应用场景

  • 防止程序死锁

  • 检测软件故障

  • 应对硬件异常


  • 二、独立看门狗(IWDG)配置

    2.1 IWDG特性

  • 使用独立的32kHz LSI时钟(不受主时钟影响)

  • 自由运行递减计数器

  • 复位条件:计数器值减至0x000

  • 2.2 配置步骤(CubeMX+HAL库)

    硬件配置
    1. 使能IWDG:在CubeMX中Analog → IWDG激活

    2. 设置分频系数(Prescaler)

    3. 设置重载值(Reload)

    核心代码
    /* IWDG初始化 */
    IWDG_HandleTypeDef hiwdg;
    
    void MX_IWDG_Init(void)
    {
      hiwdg.Instance = IWDG;
      hiwdg.Init.Prescaler = IWDG_PRESCALER_32;  // 32分频
      hiwdg.Init.Reload = 0xFFF;                 // 重载值
      if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
      {
        Error_Handler();
      }
    }
    
    /* 喂狗函数 */
    void Feed_IWDG(void)
    {
      HAL_IWDG_Refresh(&hiwdg);
    }
    
    /* 主函数示例 */
    int main(void)
    {
      HAL_Init();
      SystemClock_Config();
      MX_IWDG_Init();
    
      while (1)
      {
        // 业务代码...
        Feed_IWDG();  // 定期喂狗
        HAL_Delay(500);
      }
    }

    2.3 超时时间计算

    公式:
    Timeout = (Prescaler / LSI_freq) * Reload
    以LSI=32kHz,Prescaler=32,Reload=0xFFF为例:
    Timeout = (32 / 32000) * 4095 ≈ 4.095秒


    三、窗口看门狗(WWDG)配置

    3.1 WWDG特性

  • 时钟来自APB1(通常36MHz)

  • 必须在指定时间窗口内喂狗

  • 复位条件:

  • 计数器值 > 0x7F(过早喂狗)

  • 计数器减至0x3F(未及时喂狗)

  • 3.2 配置步骤

    CubeMX设置
    1. 激活WWDG

    2. 配置Prescaler

    3. 设置窗口值(Window Value)

    4. 设置计数器初值(Counter)

    核心代码
    WWDG_HandleTypeDef hwwdg;
    
    void MX_WWDG_Init(void)
    {
      hwwdg.Instance = WWDG;
      hwwdg.Init.Prescaler = WWDG_PRESCALER_8;
      hwwdg.Init.Window = 0x5F;      // 窗口上限
      hwwdg.Init.Counter = 0x7F;     // 初始计数器值
      hwwdg.Init.EWIMode = WWDG_EWI_DISABLE; // 是否启用提前唤醒中断
      if (HAL_WWDG_Init(&hwwdg) != HAL_OK)
      {
        Error_Handler();
      }
    }
    
    /* 喂狗函数 */
    void Feed_WWDG(void)
    {
      HAL_WWDG_Refresh(&hwwdg);
    }
    
    /* 中断回调函数(可选) */
    void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
    {
      // 提前唤醒处理
    }

    3.3 超时计算

    计算公式:
    T_wwdg = (4096 × 2^Prescaler × (Counter – 0x3F)) / PCLK1
    示例:PCLK1=36MHz,Prescaler=8,Counter=0x7F
    T_wwdg = (4096 × 256 × 64) / 36,000,000 ≈ 18.2ms


    四、两种看门狗对比

    特性 IWDG WWDG
    时钟源 LSI (~32kHz) APB1 (PCLK1)
    复位条件 计数器到0 窗口外喂狗/超时
    配置复杂度 简单 较复杂
    典型应用场景 防止系统死锁 监测程序时序
    唤醒中断 不支持 支持

    五、开发注意事项

    1. 喂狗时机:在多个关键任务中分散喂狗操作

    2. 中断处理:避免在中断中频繁喂狗

    3. 调试影响:调试模式下看门狗可能暂停,需配置DBMC寄存器

    4. 功耗管理:在低功耗模式前禁用看门狗


    六、常见问题解答

    Q1:喂狗后系统仍复位?
    A:检查时钟配置,确保计数器参数设置正确

    Q2:如何检测看门狗复位?

    if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST)) {
      // 处理IWDG复位
      __HAL_RCC_CLEAR_RESET_FLAGS();
    }

    Q3:窗口看门狗窗口值如何设置?
    建议值:窗口值 = 计数器初值 – 预期喂狗时间对应的计数值

    作者:DOMINICHZL

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 IWDG与WWDG看门狗深度解析:代码实战与系统自救策略指南

    发表回复