STM32 看门狗:IWDG 和 WWDG 怎么用

📅 2026/7/10 21:41:25
STM32 看门狗:IWDG 和 WWDG 怎么用
场景程序跑飞了进入了 HardFault 或死循环没人按复位键设备就永远卡死了。看门狗的作用程序必须定期喂狗如果超时不喂硬件自动复位。IWDG独立看门狗使用独立的 40kHz 内部 RC 振荡器LSI即使主时钟挂了IWDG 依然工作。CubeMX 配置IWDG→ 勾选ActivatedIWDG prescaler分频系数IWDG Counter Reload重装载值超时时间 (4 × 2^prescaler) / 40kHz × reloadPrescaler分频系数最大超时reload0xFFF464~6.55s6256~26.2s实际使用最大超时约 26.2sPrescaler6, reload0xFFF通常设到几秒Prescaler 4÷64Counter 3125 → 64 / 40000 × (31251) 5.0 秒Prescaler4 对应分频系数 64无需额外乘 4代码// 启动 IWDGCubeMX 默认已生成 MX_IWDG_Init(); ​ // 主循环中喂狗 while (1) { HAL_IWDG_Refresh(hiwdg); // 喂狗重置计数器 // ... 执行其他任务 ... HAL_Delay(1000); }如果程序在某处卡住超过 20 秒没喂狗系统自动复位。WWDG窗口看门狗比 IWDG 复杂但能更早检测到异常。挂在 APB1 上有时钟才能工作。窗口的含义必须在窗口期内喂狗——太早或太晚都会触发复位。复位 ┌────────────────────┐ │ 不能喂狗的区域 │ ← 太早了也会复位 │计数器 窗口值 │ ├────────────────────┤ │ 可以喂狗的区域 │ ← 在这里喂才安全 │窗口值 计数值 0x40│ ├────────────────────┤ │ 产生复位 │ ← 没及时喂计数器降到 0x3F └────────────────────┘CubeMX 配置左侧WWDGActivateCounter初始值127~64Window value窗口值Prescaler分频/1、/2、/4、/8超时公式T_WWDG T_PCLK1 × 4096 × 2^WDGTB × (T[5:0] 1)推导说明T_PCLK1 为 APB1 时钟周期4096 为固定预分频系数WDGTB 为分频因子0~3 对应 2^0~2^3T[5:0] 为递减计数器低 6 位范围 0~63代码// 喂狗设到 TR 寄存器 HAL_WWDG_Refresh(hwwdg);怎么选看门狗特点适合场景IWDG独立时钟、简单、超时范围大大多数项目——防止死机WWDG依赖系统时钟、窗口机制安全关键系统工业/医疗两个同时用IWDG 防死机WWDG 防时序错乱高可靠性要求调试时的坑调试器暂停时IWDG 也在跑你停在断点那不动IWDG 超时复位了。CubeMX 默认生成代码中IWDG 在调试模式下是停止的但如果自己配置过的注意// 调试时停止 IWDG在 HAL_Init 后加 __HAL_DBGMCU_FREEZE_IWDG(); // 调试时停止 WWDG __HAL_DBGMCU_FREEZE_WWDG();推荐做法int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); ​ // 所有初始化完成后才打开看门狗 MX_IWDG_Init(); ​ while (1) { HAL_IWDG_Refresh(hiwdg); // 主循环喂狗 ​ // 如果有长的阻塞操作中间也要喂狗 Long_Operation(); HAL_IWDG_Refresh(hiwdg); // 再次喂狗 } }初始化没完成前不要开看门狗否则因为初始化时间太长而反复复位。