这一章在干嘛?
独立看门狗 IWDG 实验:LSI 32 kHz 时钟、12 位递减计数器、喂狗时机。学会在 main 里周期性喂狗,系统卡死后自动复位。
18.1 IWDG 简介
IWDG(Independent Watchdog)= 独立看门狗。
- 时钟源:LSI(内部 RC 32 kHz,独立于主时钟);
- 计数器:12 位递减计数器(0~4095);
- 行为:计数到 0 → 复位 MCU。
原书图 18.1.1:IWDG 框图
核心公式:
其中 为预分频值, 为重装载值。
| prv | 分频 | 最小超时 | 最大 |
|---|---|---|---|
| 0 | /4 | 0.125 ms | 512 ms |
| 1 | /8 | 0.25 ms | 1024 ms |
| 2 | /16 | 0.5 ms | 2048 ms |
| 3 | /32 | 1 ms | 4096 ms |
| 4 | /64 | 2 ms | 8192 ms |
| 5 | /128 | 4 ms | 16384 ms |
| 6 | /256 | 8 ms | 32768 ms |
| 7 | /256 | 8 ms | 32768 ms(手册表有重复,最大算 32 秒) |
典型:prv=64 (2 ms),rlr=2500 → Tout ≈ 5 秒。
18.2 硬件设计
无外部电路,纯片内外设。
18.3 程序设计
18.3.1 编程步骤
IWDG_HandleTypeDef hiwdg;定义;hiwdg.Instance = IWDG; hiwdg.Init.Prescaler = 64; hiwdg.Init.Reload = 2500;配置;HAL_IWDG_Init(&hiwdg);- 主循环里
HAL_IWDG_Refresh(&hiwdg);喂狗。
18.3.2 关键代码
while (1) {
delay_ms(1000);
HAL_IWDG_Refresh(&hiwdg); // 喂狗,告诉 MCU「我还活着」
}
原书图 18.3.2.1:IWDG 喂狗流程图
IWDG 一旦启动无法关闭,只能刷新。要停止 IWDG 必须系统复位。
实验: 注释掉喂狗代码 → 5 秒后开发板自动复位,看 LED 停止闪烁。
18.4 下载验证
正常运行时 LED 闪烁;注释掉 HAL_IWDG_Refresh 后 5 秒 LED 全部灭掉重启。
原书图 18.4.1:喂狗失败导致复位现象
IWDG 的时钟源是什么?
LSI 内部 32 kHz RC,独立于主时钟。
IWDG 启动后还能关闭吗?
不能,只能刷新。
喂狗函数?
HAL_IWDG_Refresh(&hiwdg);。