一、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配置、定时喂狗机制,即可彻底解决设备死机卡死问题,大幅提升项目稳定性。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐