看门狗监控模式

看门狗在嵌入式系统中的应用

一、看门狗监控模式详细描述

看门狗(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;

       }

   }

}

代码说明

  1. 看门狗初始化:配置 IWDG 超时时间为 1s(LSI 时钟 40kHz,预分频 64 后时钟 625Hz,重装载值 625 → 625/625=1s);

  2. 主逻辑:每隔 500ms 采集并上报温湿度,每 800ms(两次采集)喂狗一次,确保在 1s 超时前重置看门狗;

  3. 异常测试:取消DHT11_Read中死循环的注释后,程序卡死无法喂狗,1s 后看门狗触发复位,系统重启并打印 “系统启动”,验证看门狗功能。

关键注意事项

  1. 喂狗周期必须小于看门狗超时时间(示例中 800ms < 1s),避免误触发;

  2. 喂狗操作需放在主循环 / 关键任务中,避免被优先级过高的中断阻塞;

  3. 硬件看门狗启动后无法关闭(STM32 IWDG),需确保程序逻辑稳定,避免频繁复位。

posted @ 2025-12-10 16:42  Afangdong  阅读(103)  评论(0)    收藏  举报