一、看门狗基础概念:什么是看门狗定时器(WDT),为什么制氧机需要它,以及看门狗的核心工作原理

各位工程师朋友,咱们今天聊一个看似简单、但实际坑特别多的东西——看门狗定时器(WDT)。

说实话,我刚入行那会儿,觉得看门狗就是个“定时器+复位”的组合,没啥技术含量。直到有一次,我负责的一款制氧机在客户现场频繁死机,售后反馈说“机器运行几天就罢工,必须断电重启”。嗯,那次排查让我彻底明白了——看门狗不是可有可无的装饰品,它是嵌入式系统的最后一道防线。

1.1 什么是看门狗定时器?

看门狗定时器,英文叫 Watchdog Timer,简称 WDT。它本质上是一个硬件计数器,从某个初始值开始递减计数。当计数减到 0 时,它会触发一个复位信号,强制 MCU 重启。

你想想看,这像不像一个“监工”?你必须在它倒计时结束之前,给它一个“喂狗”信号(也就是重新装载计数值)。如果你没及时喂狗,它就认为系统出问题了,直接重启。

核心要点:看门狗不是用来检测“程序跑飞”的,它是用来检测“程序是否还在正常执行”的。这两者有本质区别。

1.2 为什么制氧机需要看门狗?

制氧机不是手机,也不是智能音箱。它是一台医疗设备,直接关系到病人的生命安全。我个人认为,制氧机对看门狗的需求,比普通消费电子产品要严苛得多。

原因有三:

  • 连续运行要求高:制氧机经常 7×24 小时不间断运行。你想想,一个病人晚上睡觉时戴着制氧机,如果机器半夜死机了,没人知道。没有看门狗,机器就永远停在那里了。
  • 电磁环境复杂:制氧机内部有压缩机、电磁阀、风扇等大功率器件。这些家伙启动时会产生强烈的电磁干扰,很容易让 MCU 的程序指针跑飞。我在项目中遇到过,压缩机一启动,ADC 采样值就乱跳,严重时直接死机。
  • 安全等级要求:按照医疗设备标准(比如 IEC 60601),系统必须能在异常情况下自动恢复。看门狗是实现“自动恢复”最直接、最可靠的手段。

我的经验:曾经有一款制氧机,客户反馈“用着用着就不出氧了”。排查后发现,是 MCU 在某个极端条件下进入了死循环,但看门狗没开。从那以后,我所有项目的看门狗都是默认开启的,而且喂狗位置必须精心设计。

1.3 看门狗的核心工作原理

看门狗的工作原理,说白了就三步:

  1. 启动计数器:系统初始化时,设置看门狗的溢出时间(比如 1 秒),然后启动计数器。
  2. 喂狗:主循环中,在关键位置调用“喂狗”函数,重新装载计数值。
  3. 超时复位:如果计数器减到 0 还没被喂狗,看门狗就触发系统复位。

这里有个关键点:喂狗的位置不能太随意。我曾经见过有人把喂狗放在定时器中断里,结果主程序死循环了,中断还在跑,看门狗永远不超时。这叫什么?这叫“掩耳盗铃”。

避坑指南:千万不要在中断服务函数里喂狗!我曾经犯过这个错误,排查了整整两天才发现。正确的做法是:喂狗放在主循环的末尾,确保所有关键任务都执行完毕后再喂。

1.4 看门狗的硬件实现方式

看门狗有两种常见实现方式:

类型 特点 典型芯片
内部看门狗 集成在 MCU 内部,使用方便,但精度一般 STM32、GD32、NXP LPC 系列
外部看门狗 独立芯片,精度高,不受 MCU 故障影响 MAX706、TPS3823、SP706

我个人习惯:能用外部看门狗,尽量用外部看门狗。为什么?因为内部看门狗依赖 MCU 的时钟系统。如果 MCU 的晶振坏了或者 PLL 锁相环失锁,内部看门狗也跟着失效。外部看门狗有自己的独立振荡器,MCU 挂了它还能正常工作。

实战建议:对于制氧机这类医疗设备,我建议采用“内部+外部”双看门狗方案。内部看门狗负责快速响应(比如 100ms 超时),外部看门狗负责兜底(比如 2 秒超时)。这样既有速度,又有可靠性。

1.5 看门狗的典型配置代码

以 STM32F103 为例,内部看门狗的配置代码大概是这样:

// 初始化看门狗,超时时间约 1 秒
void WDT_Init(void)
{
    // 使能看门狗
    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
    
    // 设置预分频系数为 64,时钟频率约 40kHz / 64 = 625Hz
    IWDG_SetPrescaler(IWDG_Prescaler_64);
    
    // 设置重装载值,625 * 1 = 625,约 1 秒
    IWDG_SetReload(625);
    
    // 重装载计数器
    IWDG_ReloadCounter();
    
    // 使能看门狗
    IWDG_Enable();
}

// 喂狗函数
void WDT_Feed(void)
{
    IWDG_ReloadCounter();
}

注意看,喂狗函数就一行代码。但这一行代码放在哪里,学问就大了。

1.6 喂狗策略:不是随便喂的

我总结了一套喂狗策略,分享给大家:

  • 分层喂狗:主循环喂一次,关键任务完成后喂一次。比如传感器采集完、阀门控制完、通信处理完,各喂一次。
  • 时间窗口:看门狗的超时时间要大于主循环的最长执行时间,但也不能太大。我一般设置为最长执行时间的 1.5 倍。
  • 异常处理:如果某个任务执行超时,不要喂狗,让看门狗复位。这样能暴露问题。

一个小技巧:在调试阶段,可以把看门狗的超时时间设得很短(比如 100ms),这样一旦程序卡住,马上就能发现。量产时再改回正常值(比如 1 秒)。

1.7 总结

看门狗不是什么高深的技术,但它是一个“平时用不上,用上就救命”的功能。对于制氧机这种连续运行、安全要求高的设备,看门狗是必须的,而且必须设计好。

嗯,这一章就到这里。下一章我们聊聊看门狗在实际项目中容易踩的坑,以及如何设计一个健壮的喂狗机制。