HAL_IWDG
文章目录
一、IWDG 简介
1、什么是 IWDG
IWDG(Independent Watchdog,独立看门狗):
STM32 内置的独立硬件容错外设,用于解决程序死机、跑飞、卡死问题。
核心机制:
硬件自动倒计时,若程序长时间不喂狗(刷新倒计时),系统判定程序异常,自动复位单片机,让设备恢复正常运行。
2、看门狗分类
IWDG 独立看门狗:依靠内部 LSI 时钟,独立工作,不受系统死机影响,可靠性极高。
WWDG 窗口看门狗:依靠系统总线时钟,有窗口时间限制,可检测程序跑飞、异常喂狗。
3、IWDG 核心特点
完全独立运行:时钟源自内部 LSI(40KHz),不依赖系统主时钟。
不死机监控:即使系统总线卡死、主循环死机,IWDG 依旧正常计数。
硬件自动复位,无需软件干预。
超低功耗,全程硬件自主运行。
适用于工业设备、无人值守设备,防止设备卡死宕机。
4、核心作用
防止程序死循环、数组越界、硬件干扰导致死机。
无人值守设备自动故障恢复。
提高产品稳定性、抗干扰能力(工业设备必备)。
二、IWDG 模块详解
1、IWDG功能框图

① LSI 内部低速时钟源
时钟频率:典型 40kHz,独立 RC 振荡,不受 HSE/HSI 主时钟失效影响。
供电分区:虚线框分为 VDD 供电区(数字逻辑)与 1.8V 独立供电区(寄存器模拟单元);
即使 MCU 主电源异常,LSI 与看门狗核心仍可维持工作。
作用:给预分频器提供基础计数时钟。
② 8 位预分频器(寄存器 IWGD_PR 控制)
输入 40kHz 原始时钟,通过预分频寄存器配置分频系数:4/8/16/32/64/128/256;
输出分频后时钟给 12 位递减计数器,决定计数器递减速度;
分频越大,计数器递减越慢,看门狗溢出复位时间越长。
③ 12 位递减计数器
计数范围:0 ~ 4095;
工作逻辑:每个分频时钟脉冲数值 - 1;
临界逻辑:计数器递减到 0 时,硬件直接输出 IWDG 系统复位信号,重启 MCU;
喂狗机制:写入重装值可重新填充计数器,避免归零复位。
④ 12 位重装寄存器 IWGD_RLR
存储喂狗时写入的重装初值(0~4095);
每次执行喂狗操作(写键寄存器 0xAAAA),会把 RLR 内数值加载到递减计数器,重置计数倒计时。
⑤ 键寄存器 IWGD_KR(核心操作寄存器)
软件操作看门狗唯一入口,写入不同密钥实现 3 种功能:
0xCCCC:开启 IWDG,计数器立刻开始递减;
0xAAAA:喂狗,将 RLR 值重载到计数器,刷新倒计时;
0x5555:解除 PR、RLR 寄存器写保护,允许修改分频与重装初值;
其他数值:无任何作用,保护寄存器防止误写。
⑥ 状态寄存器 IWGD_SR
仅 2 个只读标志位,用于等待硬件操作完成:
RVU:RLR 寄存器更新完成标志;
PVU:PR 预分频寄存器更新完成标志;
修改分频 / 重装值后,必须轮询等待对应标志清零,才算写入生效。
2、IWDG 完整工作流程
1.上电,LSI 输出 40kHz 时钟进入预分频器;
2.软件向IWGD_KR写入0xCCCC,启动看门狗计数器递减;
3.如需修改分频 / 溢出时间:先写0x5555解锁 → 修改PR/RLR → 等待SR标志位就绪;
4.程序正常运行时,定时向IWGD_KR写入0xAAAA喂狗,计数器重新加载 RLR 数值;
5.若程序死机、卡死,未及时喂狗,12 位计数器递减至 0 → 硬件产生 IWDG 复位,MCU 重启。
3、IWDG 工作原理
内部LSI时钟源 → 预分频器 → 递减计数器 → 计数为0触发系统复位 → 正常喂狗重载计数值,阻止复位。
IWDG 是递减计数器,启动后计数器不断减1,减到0时立即复位单片机。程序需要在超时时间内定期执行「喂狗」操作,重置计数器数值。
4、核心寄存器(底层原理)
KR 关键字寄存器:写入0x5555解锁配置;写入0xAAAA喂狗重载;写入0xCCCC启动看门狗。
PR 预分频寄存器:设置时钟分频,决定计数速度。
RLR 重装载寄存器:设置倒计时最大值,决定超时时间。
SR 状态寄存器:等待配置就绪标志。
5、超时时间计算公式
LSI 典型时钟:40KHz。

超时时间 T = (预分频系数 × 重装载值) / 40000。
工程常用配置:分频64、重装载值625 → 超时1s,需1s内至少喂狗一次。
三、CubeMX 标准 IWDG 配置步骤
1、基础配置流程

打开 System Core → IWDG。
勾选 Activate 。
配置预分频系数、重装载值,设置超时时间。
Prescaler:64分频
Counter Reload Value:625
超时时间:1000ms。
无需配置中断、无需配置引脚。
2、配置注意事项
IWDG 一旦启动无法关闭,只能复位关闭。
喂狗间隔必须小于超时时间,否则设备频繁复位。
LSI时钟无需外部晶振,内部自动开启。
四、编程模块
1、IWDG 硬件整体结构
内部LSI时钟源 → 预分频模块 → 递减计数器 → 重载寄存器 → 控制寄存器 → 复位输出单元。
2、IWDG 结构体
IWDG_HandleTypeDef:IWDG 顶层句柄(外设总控制器)。
全局外设句柄,绑定寄存器基地址、初始化参数、运行状态、互斥锁。
typedef struct
{
IWDG_TypeDef *Instance; // IWDG寄存器基地址:IWDG
IWDG_InitTypeDef Init; // 看门狗配置参数(分频+重装值)
HAL_LockTypeDef Lock; // 多任务互斥锁,防止并发操作冲突
__IO uint32_t State; // IWDG运行状态机
__IO uint32_t ErrorCode; // 错误标志位
} IWDG_HandleTypeDef;
IWDG_InitTypeDef:看门狗初始化配置(预分频、重装值,对应 PR/RLR 寄存器)。
对应框图预分频器、重装计数器,CubeMX 直接填充此结构体。
typedef struct
{
uint32_t Prescaler; // 预分频系数(控制计数器递减速度,PR寄存器)
uint32_t Reload; // 12位重装计数值(0~4095,RLR寄存器)
} IWDG_InitTypeDef;
3、HAL_IWDG_API
HAL_IWDG
| HAL API | 对应模块 | 底层硬件操作 |
|---|---|---|
| HAL_IWDG_Init | PR、RLR、KR、SR | 解锁→写分频 / 重装值→启动计数器。 |
| HAL_IWDG_Refresh | 计数器、KR | 写入 0xAAAA,重载计数初值。 |
| HAL_IWDG_GetState | 软件句柄 State 成员 | 读取软件运行状态标记。 |
| HAL_IWDG_GetError | 软件句柄 ErrorCode 成员 | 获取寄存器写入超时故障。 |
| HAL_IWDG_MspInit | LSI 时钟源 | 开启 40kHz 内部 RC 振荡时钟。 |
五、IWDG 应用实例
1、正常喂狗
配置1秒超时,主循环持续喂狗,设备永不复位。
CubeMX配置同上(三)。
#include "main.h"
#include "iwdg.h"
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_IWDG_Init(); // 初始化并启动IWDG,1秒超时
while (1)
{
// 模拟业务逻辑(500ms处理一次任务,小于1秒超时,安全)
HAL_Delay(500);
// 正常喂狗,重置倒计时,永远不会触发复位
HAL_IWDG_Refresh(&hiwdg);
}
}
2、模拟程序死机复位
屏蔽喂狗代码,1秒后自动复位,验证看门狗功能。
CubeMX配置同上(三)。
代码同上,将喂狗代码屏蔽。
复位标志判断代码:
重启后读取 RCC 复位标志,区分是看门狗复位还是上电复位:
void Check_Reset_Source(void)
{
if(__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET)
{
// 本次重启由独立看门狗溢出复位产生
__HAL_RCC_CLEAR_RESET_FLAGS(); // 清除复位标志
}
else if(__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) != RESET)
{
// 上电/掉电复位
__HAL_RCC_CLEAR_RESET_FLAGS();
}
}
在main开头调用Check_Reset_Source(),可确认本次重启是 IWDG 看门狗导致。
3、定时器定时喂狗(工程常用)
避免主循环卡死导致不喂狗,使用定时器中断固定喂狗,稳定性最高。
1.参数配置
IWDG:预分频 64,重装值 625,溢出超时 1s(超过 1s 未喂狗自动复位)。
TIM 基础定时器(TIM7,无外部引脚占用):
APB1 时钟 72MHz,预分频 71,重载 4999。
计数时钟 = 72M/(71+1) = 1MHz。
中断周期 = (4999+1)/1MHz = 5ms × 100 次计数 = 500ms 中断一次喂狗。
2.CubeMX 完整配置
IWDG 配置:
Prescaler divider:64。
Counter reload value:625。
开启 LSI 时钟。
TIM7 定时器配置:
开启 TIM7。
勾选Activated。
Parameter Settings:

Prescaler:71
Counter Period:4999
Counter Mode:Up
NVIC 设置:

勾选 TIM7 global interrupt,配置中断优先级(低于业务中断,高于硬件故障中断)
DMA 全部关闭,仅使用更新中断。
3.定时器中断服务函数 + 喂狗逻辑
stm32f1xx_it.c
#include "main.h"
extern TIM_HandleTypeDef htim7;
extern IWDG_HandleTypeDef hiwdg;
// TIM7更新中断入口
void TIM7_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htim7);
}
// 定时器更新中断回调,每500ms自动执行喂狗
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM7)
{
// 定时喂狗,独立于主循环运行
HAL_IWDG_Refresh(&hiwdg);
}
}
4.主函数
#include "main.h"
#include "iwdg.h"
#include "tim.h"
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_IWDG_Init();
MX_TIM7_Init();
// 启动TIM7更新中断,500ms定时喂狗
HAL_TIM_Base_Start_IT(&htim7);
while (1)
{
// 模拟超长阻塞业务、死循环,不会触发看门狗复位
HAL_Delay(2000);
// 此处即使屏蔽所有喂狗代码,定时器中断依然自动喂狗
}
}
六、IWDG 核心要点与避坑大全
1、核心知识点
IWDG 独立看门狗,基于内部LSI时钟,完全独立于系统。
核心机制:递减计数,倒计时结束自动复位单片机。
必须在超时时间内定期喂狗,否则设备复位。
IWDG启动后不可关闭,只能断电/复位关闭。
适用无人值守、工业设备,提升死机自愈能力。
2、高频坑点
喂狗间隔大于超时时间,导致设备频繁莫名复位。
主循环卡死、阻塞延时过长,来不及喂狗触发复位。
在中断中长时间阻塞,导致主循环无法喂狗。
忘记初始化直接调用喂狗函数,程序报错死机。
LSI时钟漂移,实际超时时间与理论值有偏差。
3、工程最佳实践
禁止主循环喂狗:主循环卡死会导致不喂狗。
统一使用定时器中断定时喂狗,稳定性拉满。
超时时间预留充足余量,避免时钟漂移误复位。
初始化放在程序最开头,尽早启动监控。
4、IWDG 与 WWDG 核心区别(面试必问)
IWDG:独立LSI时钟、无窗口、纯超时复位、可靠性高。
WWDG:系统时钟、有窗口、可检测异常喂狗、功能更强。
5、面试一句话总结
IWDG独立看门狗是基于内部LSI时钟的硬件容错外设,独立于系统运行,通过递减倒计时机制监控程序运行,超时未喂狗则自动复位单片机,解决程序死机、跑飞问题,广泛用于工业无人值守设备提升稳定性。
七、全篇总结
IWDG 是嵌入式程序容错、故障自愈的核心外设,配置简单、可靠性极高,是所有工业产品、智能设备、无人值守项目的标配功能。
掌握IWDG原理、CubeMX配置、定时喂狗机制,即可彻底解决设备死机卡死问题,大幅提升项目稳定性。
更多推荐

所有评论(0)