一、IWDG 简介IWDG 的全称是Independent Watchdog即独立看门狗。从本质上看IWDG 是一个能够产生系统复位信号的递减计数器。当 IWDG 被启动后计数器会不断向下计数如果计数到0x000还没有被刷新系统就会产生复位。1. IWDG 的核心特性IWDG 具有以下特点特性说明独立时钟时钟由独立 RC 振荡器提供可在低功耗模式运行可在待机模式、停止模式下继续工作递减计数计数器从重装载值向下计数溢出复位计数到0x000时产生系统复位启动后持续工作一旦启用通常不能随意关闭因为 IWDG 使用独立的 RC 时钟所以即使主系统时钟异常它仍然有机会继续运行并在程序异常时复位系统。2. 什么是“喂狗”“喂狗”就是在 IWDG 计数器计数到 0 之前重新装载计数器的值防止系统复位。可以这样理解程序正常运行 - 周期性喂狗 - IWDG 不复位系统 程序跑飞或卡死 - 无法及时喂狗 - IWDG 计数到 0 - 系统复位因此喂狗操作必须放在程序确认“系统仍然正常运行”的位置而不是随意放在定时器中断里无条件执行。3. IWDG 的作用IWDG 主要用于处理程序异常运行问题例如外界电磁干扰导致程序跑飞硬件异常导致系统状态错误软件异常导致程序陷入死循环主循环或关键任务长时间无法正常执行IWDG 的应用场景通常是对稳定性要求较高、但对超时时间精度要求不高的产品。需要注意独立看门狗是异常处理的最后手段不能依赖它来掩盖程序设计问题。真正可靠的系统应该尽量在硬件设计、软件结构、异常处理和任务调度上避免异常发生。二、IWDG 工作原理IWDG 的工作过程可以概括为启动 IWDG。配置预分频系数和重装载值。IWDG 使用 LSI 时钟驱动递减计数器。程序在超时时间内周期性刷新计数器。如果没有及时刷新计数器递减到0x000系统复位。IWDG 的关键点在于“超时时间”。如果超时时间设置太短正常程序可能还没来得及喂狗就复位如果设置太长程序异常后系统恢复速度会变慢。三、IWDG 框图理解启用 IWDG 后LSI 时钟会自动开启。IWDG 的基本结构可以理解为LSI 时钟 - 预分频器 - 递减计数器 - 计数到 0 - 系统复位 ^ | 重装载寄存器其中LSI 为低速内部 RC 时钟。预分频器用于降低 IWDG 计数频率。重装载寄存器保存计数器重新加载的值。喂狗时计数器会重新装载重装载寄存器中的值。LSI 时钟频率并不精确计算时通常按系列估算系列LSI 计算频率STM32F140 kHzSTM32F4/F7/H732 kHz实际项目中如果对看门狗超时时间要求较严格需要结合芯片手册中的 LSI 误差范围进行裕量设计。四、IWDG 寄存器IWDG 常见寄存器包括键寄存器、预分频器寄存器、重装载寄存器和状态寄存器。1. 键寄存器 IWDG_KRIWDG_KR通过写入特定值完成关键控制操作。写入值作用0xAAAA喂狗刷新计数器0x5555解除PR和RLR寄存器写访问保护0xCCCC启动 IWDG 工作这三个值需要重点记住启动0xCCCC解锁0x5555喂狗0xAAAA2. 预分频器寄存器 IWDG_PRIWDG_PR用于设置 IWDG 时钟预分频系数。常见预分频关系如下PR 设置值分频系数0418216332464512862567256预分频系数越大计数器递减越慢IWDG 超时时间越长。3. 重装载寄存器 IWDG_RLRIWDG_RLR用于存放重装载值低 12 位有效。因此重装载值范围通常为0x000 ~ 0xFFF也就是最大值为 4095。如果按可计数数量理解则最多约为 4096 个计数周期。4. 状态寄存器 IWDG_SRIWDG_SR用于判断预分频值和重装载值是否已经更新完成。在寄存器方式配置 IWDG 时修改PR和RLR后需要等待更新完成再刷新计数器。5. 寄存器配置步骤使用寄存器配置 IWDG 的典型步骤如下向IWDG_KR写入0xCCCC使能 IWDG。向IWDG_KR写入0x5555使能寄存器访问。配置IWDG_PR设置预分频器。配置IWDG_RLR设置重装载值。等待寄存器更新完成即IWDG_SR 0x00000000。向IWDG_KR写入0xAAAA刷新计数器。五、IWDG 溢出时间计算IWDG 超时时间由 LSI 时钟、预分频系数和重装载值共同决定。1. 基本计算关系计数器时钟频率IWDG计数频率 LSI频率 / 预分频系数溢出时间IWDG溢出时间 计数次数 / IWDG计数频率结合起来IWDG溢出时间 计数次数 * 预分频系数 / LSI频率在实际计算时计数次数通常按重装载值 1理解Tout (Reload 1) * Prescaler / LSI其中ToutIWDG 溢出时间单位为秒。Reload重装载寄存器值。Prescaler预分频系数。LSIIWDG 使用的低速内部时钟频率。2. HAL 库参数理解使用 HAL 库时常见配置项包括hiwdg.Instance IWDG; hiwdg.Init.Prescaler IWDG_PRESCALER_xxx; hiwdg.Init.Reload reload_value; HAL_IWDG_Init(hiwdg);其中Prescaler对应预分频系数。Reload对应重装载值。HAL_IWDG_Init()会完成 IWDG 初始化并启动。3. 计算示例假设使用 STM32F1按 LSI 40 kHz 计算Prescaler 64 Reload 2499则Tout (2499 1) * 64 / 40000 2500 * 64 / 40000 4 s也就是说如果程序超过约 4 秒没有喂狗IWDG 就会触发系统复位。4. 最短与最长超时时间IWDG 的最短和最长超时时间由 LSI 频率、最小/最大分频系数以及重装载值范围决定。以常见范围估算系列LSI最短时间估算最长时间估算STM32F140 kHz1 * 4 / 40000 0.1 ms4096 * 256 / 40000 ≈ 26.2 sSTM32F4/F7/H732 kHz1 * 4 / 32000 0.125 ms4096 * 256 / 32000 ≈ 32.8 s这些时间是按典型 LSI 频率估算的。由于 LSI 本身不精确实际复位时间会有偏差工程中要留足裕量。六、IWDG 配置步骤使用 HAL 库配置 IWDG 的步骤比直接操作寄存器更简单重点掌握两个函数。1. 初始化并启动 IWDG调用HAL_IWDG_Init();该函数主要完成取消PR/RLR寄存器写保护。设置 IWDG 预分频系数。设置 IWDG 重装载值。启动 IWDG。典型配置结构IWDG_HandleTypeDef hiwdg; ​ hiwdg.Instance IWDG; hiwdg.Init.Prescaler IWDG_PRESCALER_64; hiwdg.Init.Reload 2499; ​ HAL_IWDG_Init(hiwdg);2. 及时喂狗调用HAL_IWDG_Refresh();该函数本质上就是向IWDG_KR写入0xAAAA让计数器重新装载IWDG_RLR中的值。典型用法while (1) { /* 确认关键任务运行正常后再喂狗 */ HAL_IWDG_Refresh(hiwdg); }更推荐的思路是只有当系统关键任务都正常运行后才执行喂狗操作。例如可以设置多个任务运行标志主循环检查所有标志均正常后再统一喂狗。3. HAL 库相关函数函数作用HAL_IWDG_Init()初始化并启动 IWDGHAL_IWDG_Refresh()刷新 IWDG 计数器也就是喂狗附IWDG 使用注意事项1. 不要过度依赖看门狗IWDG 是系统异常后的兜底手段不应该成为软件设计粗糙的理由。程序跑飞、死循环、任务阻塞等问题仍然应该从根因上解决。2. 喂狗位置要合理不建议在固定定时器中断中无条件喂狗。否则即使主循环或关键任务已经异常只要定时器中断还在运行系统仍然会持续喂狗看门狗就失去了意义。更合理的方式是关键任务正常运行 - 设置状态标志 主循环检查所有状态标志 - 全部正常才喂狗3. 超时时间要留裕量IWDG 使用 LSI 时钟而 LSI 精度较低因此计算出的超时时间只是估算值。实际项目中超时时间应大于系统正常最大执行周期并考虑 LSI 误差、任务阻塞、通信等待等情况。4. 启动后调试要谨慎IWDG 启动后如果程序没有及时喂狗调试过程中也可能频繁复位。调试 IWDG 相关代码时应先确认喂狗逻辑和超时时间配置合理。