目录
[二、独立看门狗 IWDG(最常用、量产首选)](#二、独立看门狗 IWDG(最常用、量产首选))
[1. 原理特性](#1. 原理特性)
[2. 核心优缺点](#2. 核心优缺点)
[3. 工程完整代码](#3. 工程完整代码)
[4. 使用规范](#4. 使用规范)
[三、窗口看门狗 WWDG(高级容错、防跑飞专用)](#三、窗口看门狗 WWDG(高级容错、防跑飞专用))
[1. 原理特性](#1. 原理特性)
[2. 为什么需要窗口看门狗?](#2. 为什么需要窗口看门狗?)
[3. 核心特点](#3. 核心特点)
[4. 工程初始化代码](#4. 工程初始化代码)
[四、IWDG 与 WWDG 终极选型(量产必看)](#四、IWDG 与 WWDG 终极选型(量产必看))
[1、独立看门狗 IWDG](#1、独立看门狗 IWDG)
[2、窗口看门狗 WWDG](#2、窗口看门狗 WWDG)
[五、看门狗十大玄学 Bug 深度解析](#五、看门狗十大玄学 Bug 深度解析)
[1. 设备偶尔莫名复位](#1. 设备偶尔莫名复位)
[2. 中断里喂狗导致看门狗失效](#2. 中断里喂狗导致看门狗失效)
[3. 上电瞬间直接复位](#3. 上电瞬间直接复位)
[4. 窗口看门狗一直复位](#4. 窗口看门狗一直复位)
[5. 业务阻塞导致复位](#5. 业务阻塞导致复位)
[6. 死机不复位](#6. 死机不复位)
[7. 频繁复位但程序正常](#7. 频繁复位但程序正常)
[8. RTOS 任务卡死不复位](#8. RTOS 任务卡死不复位)
[9. 关闭全局中断导致看门狗复位](#9. 关闭全局中断导致看门狗复位)
[10. 看门狗开启后无法下载程序](#10. 看门狗开启后无法下载程序)
前言
在量产设备 中,比功能实现更重要的是:设备不能死机、不能卡死、不能挂机、必须永久自恢复。
嵌入式设备长期跑现场:干扰、电源抖动、程序跑飞、堆栈溢出、硬件异常、总线卡死,都会导致单片机卡死死机。一旦死机,设备永久瘫痪,只能断电重启。
解决这个问题的唯一硬件方案:看门狗(WatchDog)
很多新手只会随便开个看门狗喂狗,完全不懂: 独立看门狗和窗口看门狗区别、为什么偶尔复位、喂狗过快也会复位、卡死不喂狗、中断卡死导致看门狗失效。
本篇彻底讲透两种看门狗原理、适配场景、标准工程代码、所有玄学复位坑点,根治设备现场死机、卡死、挂机问题。
一、看门狗核心本质
看门狗就是一个硬件独立递减计数器
核心逻辑:
- 计数器不断减,减到 0 ------ 单片机直接硬件复位
- 想要不死机,必须定时喂狗(重装载计数器数值)
作用:
- 程序正常运行 → 按时喂狗 → 永不复位
- 程序跑飞、卡死、死循环、阻塞 → 无法喂狗 → 计数器清零 → 硬件自动重启
重点:看门狗是硬件外设,不受程序 Bug、卡死、中断异常影响,是最后一道生命线。
二、独立看门狗 IWDG(最常用、量产首选)
1. 原理特性
- 独立时钟:由内部 LSI 低速时钟驱动,不受系统时钟影响
- 系统死机、时钟异常、主程序跑飞,IWDG 依旧工作
- 适合:全局死机监测、防卡死、现场设备保活
2. 核心优缺点
- 优点: 完全独立、极其可靠、不会失效
- 缺点: 时钟精度低,定时时间不准,只能做秒级监测
3. 工程完整代码
#include "wwdg.h"
//独立看门狗初始化 1秒超时
void IWDG_Init(void)
{
IWDG_HandleTypeDef hiwdg;
hiwdg.Instance = IWDG;
//分频64,重载值625,超时约1s
hiwdg.Init.Prescaler = IWDG_PRESCALER_64;
hiwdg.Init.Reload = 625;
HAL_IWDG_Init(&hiwdg);
}
//定时喂狗,100ms~800ms调用一次即可
void IWDG_Feed(void)
{
HAL_IWDG_Refresh(&hiwdg);
}
4. 使用规范
- 必须在主循环正常业务中喂狗
- 禁止在定时器中断、后台定时中断喂狗
- 中断喂狗:主程序卡死依旧能喂狗,看门狗彻底失效
三、窗口看门狗 WWDG(高级容错、防跑飞专用)
1. 原理特性
- 挂载在系统 PCLK1 时钟
- 有窗口限制:只能在指定时间段喂狗
- 喂狗太早、喂狗太晚,全部直接复位
2. 为什么需要窗口看门狗?
独立看门狗有一个致命漏洞:
程序跑飞但依旧在执行喂狗代码 ,假死不复位。
例如:
堆栈异常、指针跑飞、程序乱飞,刚好跳到喂狗函数,一直喂狗。
设备卡死、功能失效、但是永不复位。
窗口看门狗根治这个问题:
不允许无脑频繁喂狗,必须在合法时间窗口内喂狗
3. 核心特点
- 喂狗太快 → 复位
- 喂狗太慢 → 复位
- 只有程序正常、时序正常、调度正常,才能成功喂狗
专治:程序跑飞、指针异常、代码乱飞
4. 工程初始化代码
void WWDG_Init(void)
{
WWDG_HandleTypeDef hwwdg;
hwwdg.Instance = WWDG;
hwwdg.Init.Prescaler = WWDG_PRESCALER_8;
hwwdg.Init.Window = 0x50;
hwwdg.Init.Counter = 0x7F;
hwwdg.Init.EWIMode = WWDG_EWI_DISABLE;
HAL_WWDG_Init(&hwwdg);
}
void WWDG_Feed(void)
{
HAL_WWDG_Refresh(&hwwdg);
}
四、IWDG 与 WWDG 终极选型(量产必看)
1、独立看门狗 IWDG
适用场景:
- 工业设备长期运行防死机
- 电源干扰、时钟异常防护
- RTOS、裸机通用 90% 量产项目首选
2、窗口看门狗 WWDG
适用场景:
- 高可靠设备、医疗、工控、精密仪器
- 需要防程序跑飞、防异常喂狗
- 对安全性要求极高的产品
五、看门狗十大玄学 Bug 深度解析
1. 设备偶尔莫名复位
- 原因:喂狗间隔不稳定,偶尔超时
- 解决:拉长最大喂狗间隔,保证业务阻塞不超时
2. 中断里喂狗导致看门狗失效
- 原因:主循环卡死,中断依旧运行,永久喂狗
- 解决:禁止中断喂狗,必须主业务喂狗
3. 上电瞬间直接复位
- 原因:初始化完看门狗未立刻喂狗
- 解决:初始化结束立即喂一次狗
4. 窗口看门狗一直复位
- 原因:喂狗时机不对,过早或过晚
- 解决:严格遵守窗口时间,固定周期喂狗
5. 业务阻塞导致复位
- 原因:SPI/I2C/Flash 操作阻塞太久
- 解决:底层操作加超时,禁止永久阻塞
6. 死机不复位
- 100% 原因:用了中断喂狗!
7. 频繁复位但程序正常
- 原因:LSI 时钟偏差,独立看门狗超时提前
8. RTOS 任务卡死不复位
- 原因:喂狗放在空闲任务,卡死依旧空闲运行
- 解决:喂狗放在核心业务任务
9. 关闭全局中断导致看门狗复位
- 长时间关中断,主循环卡死,无法喂狗
10. 看门狗开启后无法下载程序
- 原因:上电太快复位,拖死下载链路
- 解决:下载时屏蔽看门狗,或者上电延时初始化
六、量产级标准看门狗架构(推荐所有项目套用)
1、正确架构
- 上电延时 1s 初始化看门狗
- 核心业务任务 / 主循环喂狗
- 底层阻塞操作全部加超时
- 异常故障自动复位、重启日志记录
2、绝对禁止架构
- 中断喂狗
- 空闲任务喂狗
- 初始化不立刻喂狗
- 无超时底层阻塞代码
七、如何判断复位来源(故障定位神器)
工程中可以读取复位标志位,判断设备为什么重启:
- 上电复位
- 硬件复位
- 看门狗复位
- 独立看门狗复位
- 窗口看门狗复位
通过标志位可以精准定位现场偶现死机问题。
小结
独立看门狗保「设备不死」
窗口看门狗保「程序不飞」
普通开发者用看门狗防死机, 高级开发者用看门狗做系统容错、故障自愈、现场稳定性兜底。
只要是量产设备,必须标配看门狗,否则现场死机、返工、售后无解。