3、硬件看门狗设计:外部看门狗芯片选型、典型电路设计(MAX706/SP706)、复位信号时序分析

聊完软件看门狗,咱们得面对一个现实——软件看门狗本身也会死。CPU 死机了,喂狗任务自然也停了。所以真正可靠的系统,我习惯在板子上加一颗硬件看门狗芯片。它独立于主控运行,你死它不死的。

这一节,咱们就掰开揉碎讲讲外部看门狗芯片怎么选、怎么接、时序怎么对。我会拿 MAX706 和 SP706 这对经典芯片当例子,这两颗我用了不下十年,皮实得很。

3.1 为什么非要用外部看门狗?

内部看门狗虽然方便,但有个致命弱点:它和 CPU 共用同一个时钟源和电源域。CPU 的晶振停振了,看门狗也跟着停;CPU 电源塌了,看门狗也歇菜。

外部看门狗芯片自带独立的振荡器和电压检测电路。说白了,它就是个不吃你家米、自己带干粮的保安。哪怕主控芯片挂了、晶振不跑了、电源掉到 2V 了,它照样能输出干净的复位信号。

核心原则:在工业控制、汽车电子、医疗设备这类不允许死机的场合,外部看门狗是标配,不是选配。

3.2 看门狗芯片选型要点

选芯片其实就盯住几个参数。我列个表,你照着筛就行:

参数 说明 我的建议值
看门狗超时时间 WDI 引脚多久没收到喂狗信号就触发复位 1.6s(MAX706 典型值)
复位阈值电压 检测 VCC 掉到多少伏时输出复位 4.40V / 4.65V(5V 系统)
复位脉冲宽度 复位信号持续拉低的时间 ≥140ms(保证所有外设复位到位)
手动复位输入 MR 引脚,允许按键或外部信号强制复位 最好有,调试时救命用
输出类型 推挽输出还是开漏输出 推挽更省事,开漏需要上拉

MAX706 和 SP706 基本就是照着这个表做的。它们引脚兼容,可以直接替换。我一般看哪个便宜用哪个,性能没差别。

3.3 典型电路设计:MAX706 / SP706

先看引脚定义。这芯片 8 个脚,功能很清晰:

  • VCC:电源,接 5V 或 3.3V(看型号后缀)
  • GND:地
  • RST:复位输出,低电平有效
  • WDI:看门狗输入,喂狗信号从这里进去
  • MR:手动复位输入,低电平有效
  • PFI / PFO:电源故障检测输入/输出(可选功能)
  • WDO:看门狗超时输出(早期版本有,新版本集成到 RST)

下面是我最常用的电路,你直接抄就行:

// MAX706 典型应用电路(5V 系统)
// VCC —— 0.1μF 陶瓷电容 —— GND(紧靠芯片引脚)
// VCC —— 10μF 电解电容 —— GND(板级滤波)
// 
// MR 引脚:接按键到 GND,外部上拉 10kΩ 到 VCC
// WDI 引脚:接主控 GPIO,用于喂狗
// RST 引脚:接主控 RESET 引脚
// PFI 引脚:接 VCC(不使用电源故障检测时)
// PFO 引脚:悬空
// WDO 引脚:悬空(或接 MR 实现超时自动复位)

我的经验:WDI 引脚不要直接悬空。如果程序里暂时不想喂狗,把 WDI 拉高或拉低都行,但别让它浮空。浮空时芯片内部逻辑可能误判,导致随机复位。我曾经因为这个排查了三天,最后发现是 WDI 没做上下拉。

喂狗信号怎么给?很简单,主控在 main 循环里定期翻转 WDI 引脚的电平:

// 喂狗示例代码(伪代码)
void feed_watchdog(void) {
    static uint8_t toggle = 0;
    if (toggle) {
        WDI_PIN = 1;
    } else {
        WDI_PIN = 0;
    }
    toggle = !toggle;
}

// 在主循环中调用,间隔不超过 1.2s
while(1) {
    feed_watchdog();
    // 其他任务...
    delay_ms(500);  // 确保喂狗间隔小于 1.6s
}

注意看,喂狗间隔必须小于芯片的超时时间。MAX706 典型值是 1.6s,我一般留 50% 余量,每 800ms 喂一次。这样即使某个任务卡了 500ms,系统也不会被误复位。

3.4 复位信号时序分析

时序这东西,你看着波形图就全明白了。我画了一张典型的复位时序图:

MAX706 复位信号时序图 VCC Vth=4.40V RST WDI t1 t2 t3 t1: 正常喂狗,RST 保持高电平 t2: 喂狗停止超过 1.6s,RST 拉低 140ms 复位 t3: 复位完成后恢复喂狗,系统正常运行

时序分三个阶段:

  1. 正常阶段:主控每 800ms 给 WDI 一个脉冲,RST 保持高电平,系统正常运行。
  2. 超时阶段:主控死机,WDI 超过 1.6s 没有翻转。芯片内部计数器溢出,RST 引脚拉低,输出一个宽度约 140ms 的复位脉冲。
  3. 恢复阶段:复位脉冲结束后,主控重新启动。如果程序正常,恢复喂狗,RST 回到高电平。

注意:复位脉冲宽度不能太短。有些外设(比如 LCD 控制器、电机驱动)需要几十毫秒才能完成内部初始化。140ms 是 MAX706 的典型值,足够覆盖绝大多数外设。如果你用的外设复位时间特别长,可以考虑外接 RC 延时或选复位脉宽更长的芯片。

3.5 避坑指南

硬件看门狗看着简单,但坑不少。我把自己踩过的坑列出来,你绕开走:

  • 喂狗位置不对:别把喂狗放在中断里。中断还能跑,主循环已经死了,看门狗照样不触发。喂狗必须放在主循环的关键路径上。
  • 电源滤波不够:VCC 引脚上的 0.1μF 电容必须紧靠芯片,远了就没效果了。电源纹波大时,复位阈值电压检测会误触发。
  • MR 引脚悬空:手动复位引脚如果不使用,必须接上拉电阻到 VCC。悬空时可能被噪声误触发。
  • WDI 引脚电平不确定:上电瞬间,主控 GPIO 可能是高阻态。WDI 浮空时,看门狗可能在上电过程中就超时复位。我习惯在 WDI 上加一个 10kΩ 下拉电阻,确保上电时是低电平。

我的经验:调试阶段,我经常在 MR 引脚上接一个按键。程序跑飞了,按一下就能手动复位,不用反复插拔电源。这个按键在量产板上可以去掉,但开发板上一定要留。

3.6 小结

硬件看门狗芯片,说白了就是给系统买了一份「意外险」。MAX706 和 SP706 这类芯片,选型简单、电路成熟、时序清晰,是嵌入式工程师的必备技能。

你只要记住三点:选对阈值电压、接好滤波电容、喂狗位置放对。做到这三点,系统死机后自动恢复就不是玄学,而是板上钉钉的事。