看门狗监控模式
看门狗在嵌入式系统中的应用
一、看门狗监控模式详细描述
看门狗(Watchdog Timer,WDT)监控模式是嵌入式系统中保障程序稳定运行的核心容错机制,本质是带超时触发逻辑的定时器:程序正常运行时需定期向看门狗发送 “喂狗” 信号以重置定时器;若程序因死循环、跑飞、异常中断等原因无法按时 “喂狗”,定时器超时后会触发系统复位(部分支持先中断预警),使系统恢复到正常运行状态。
根据实现方式,看门狗分为两类:
1. 硬件看门狗(主流)
-
特性:独立于 CPU 的硬件模块(片内 / 外置芯片,如 STM32 的 IWDG、外置 MAX813),由独立低速时钟(LSI)驱动,不受 CPU 状态影响,即使 CPU 寄存器错乱、程序卡死,仍能正常工作,可靠性极高。
-
工作流程:
① 初始化:配置看门狗超时时间(需大于程序正常 “喂狗” 周期,避免误触发);
② 正常运行:程序在主循环 / 关键任务中定期执行 “喂狗” 操作(写硬件寄存器);
③ 异常处理:超时未喂狗→硬件触发系统复位→系统重启后重新初始化外设、恢复业务逻辑。
2. 软件看门狗(辅助)
-
特性:基于 CPU 内核定时器(如 SysTick)实现的纯软件逻辑,无额外硬件成本,灵活度高,但依赖 CPU 正常运行(若 CPU 完全卡死,软件看门狗失效)。
-
工作流程:
① 初始化:配置定时器超时时间,开启定时器中断;
② 正常运行:主程序定期清除 “异常标记”;
③ 异常处理:定时器超时触发中断→检测到 “异常标记未清除”→执行软件复位指令(如 NVIC_SystemReset ())。
核心特性
-
超时可配置:根据业务周期设置(如工业控制常用 100ms~5s,物联网节点常用 1~10s);
-
触发分级:优先中断预警(保存关键数据、记录异常日志),再触发复位;
-
独立性:硬件看门狗是核心,软件看门狗仅作为补充。
二、看门狗监控模式典型使用场景
| 场景类型 | 应用场景举例 | 使用原因 |
|---|---|---|
| 工业控制设备 | PLC、变频器、电机控制器 | 现场电磁干扰强,程序易跑飞;设备需 7×24 小时运行,中断会导致生产事故 |
| 物联网终端 | 智能电表、温湿度采集节点 | 无人值守,长期电池供电 / 联网;程序卡死会导致数据上报中断,看门狗复位恢复通信 |
| 车载电子 | 车载导航、ECU、行车记录仪 | 行车过程中系统不能宕机;路况颠簸 / 电磁干扰易导致程序异常,复位保障行车安全 |
| 消费电子 | 智能家居网关、智能音箱 | 24 小时运行,程序卡死会导致设备无响应,看门狗自动复位提升用户体验 |
| 医疗便携设备 | 血糖检测仪、心电监护仪 | 关键场景下系统稳定优先,程序异常可能导致检测结果错误,复位恢复正常检测逻辑 |
三、单片机 C 语言示例(硬件看门狗)
场景说明
以物联网温湿度采集节点为例:基于 STM32F103 单片机,使用片内独立硬件看门狗(IWDG)监控程序运行;程序每隔 500ms 采集一次温湿度数据并上报,每 800ms “喂狗” 一次;若采集 / 上报逻辑卡死(如死循环),看门狗超时(1s)后触发复位,恢复节点正常工作。
代码实现(简化版,基于 STM32 标准库)
#include "stm32f10x.h"
#include "delay.h" // 简易延时函数(需自行实现,如基于SysTick)
// 硬件看门狗(IWDG)初始化:超时时间约1s(LSI时钟40kHz,预分频64,重装载值625)
void IWDG_Init(void)
{
// 取消写保护:必须先解锁才能配置IWDG寄存器
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
// 设置预分频器:64(IWDG_PR = 0x05),时钟分频后为40kHz/64=625Hz
IWDG_SetPrescaler(IWDG_Prescaler_64);
// 设置重装载值:625 → 超时时间 = 625 / 625Hz = 1s
IWDG_SetReload(625);
// 重载计数器(喂狗):立即重置看门狗计数
IWDG_ReloadCounter();
// 启动看门狗
IWDG_Enable();
}
// 喂狗函数:重置看门狗计数器
void IWDG_Feed(void)
{
IWDG_ReloadCounter(); // 向IWDG_KR寄存器写入0xAAAA,重置计数
}
// 模拟温湿度采集函数
void DHT11_Read(float *temp, float *humi)
{
// 实际场景需对接DHT11硬件,此处简化为模拟值
*temp = 25.5f;
*humi = 60.2f;
// 【测试用】模拟程序卡死:取消注释后,程序进入死循环,看门狗超时复位
// while(1);
}
// 模拟数据上报函数
void Data_Report(float temp, float humi)
{
// 实际场景需对接串口/无线模块(如ESP8266),此处简化为串口打印
printf("Temp: %.1f°C, Humi: %.1f%%rn", temp, humi);
}
int main(void)
{
// 系统初始化:时钟、串口、延时
SystemInit();
USART1_Init(9600); // 串口初始化(需自行实现)
delay_init(); // 延时初始化(需自行实现)
// 初始化硬件看门狗
IWDG_Init();
printf("系统启动,看门狗已开启rn");
float temp, humi;
uint32_t feed_cnt = 0; // 喂狗计数
while(1)
{
// 1. 采集温湿度数据
DHT11_Read(&temp, &humi);
// 2. 上报数据
Data_Report(temp, humi);
// 3. 延时500ms(采集周期)
delay_ms(500);
// 4. 每800ms喂狗一次(两次采集周期后喂狗,小于1s超时时间)
feed_cnt++;
if(feed_cnt >= 2)
{
IWDG_Feed();
printf("喂狗成功rn");
feed_cnt = 0;
}
}
}
代码说明
-
看门狗初始化:配置 IWDG 超时时间为 1s(LSI 时钟 40kHz,预分频 64 后时钟 625Hz,重装载值 625 → 625/625=1s);
-
主逻辑:每隔 500ms 采集并上报温湿度,每 800ms(两次采集)喂狗一次,确保在 1s 超时前重置看门狗;
-
异常测试:取消
DHT11_Read中死循环的注释后,程序卡死无法喂狗,1s 后看门狗触发复位,系统重启并打印 “系统启动”,验证看门狗功能。
关键注意事项
-
喂狗周期必须小于看门狗超时时间(示例中 800ms < 1s),避免误触发;
-
喂狗操作需放在主循环 / 关键任务中,避免被优先级过高的中断阻塞;
-
硬件看门狗启动后无法关闭(STM32 IWDG),需确保程序逻辑稳定,避免频繁复位。

浙公网安备 33010602011771号