2、硬件看门狗电路设计:看门狗芯片选型、喂狗信号设计、复位输出设计、电源域隔离
硬件看门狗,说白了就是给系统请了个「监工」。这个监工不吃不喝,只盯着一个事:你有没有按时来报到(喂狗)。一旦你迟到了,它二话不说,直接给你一棍子(复位)。
我在项目中见过太多「软件看门狗失效」的惨案——CPU挂了,软件看门狗也跟着挂了,这叫「监守自盗」。所以,真正可靠的系统,必须上硬件看门狗。今天我就把硬件看门狗电路设计的四个核心环节掰开揉碎了讲。
2.1 看门狗芯片选型:别只看价格
选芯片这事,我踩过不少坑。有一次图便宜选了个没窗口功能的狗,结果系统在正常运行时频繁误复位,查了三天才发现是喂狗信号毛刺太多。嗯,从那以后我选型就老实多了。
看门狗芯片的核心参数,我列个表给你看:
| 参数 | 说明 | 我的建议 |
|---|---|---|
| 超时时间 | 从最后一次喂狗到复位输出的时间 | 1.6s~3.2s 最常用,太短容易误触发 |
| 窗口看门狗 | 允许在特定时间窗口内喂狗 | 强烈推荐,能防「死循环喂狗」 |
| 复位输出类型 | 推挽输出或开漏输出 | 开漏输出更灵活,方便多源复位 |
| 工作电压 | 芯片供电范围 | 选宽压的,1.8V~5.5V 最稳妥 |
| 使能引脚 | 是否支持外部控制看门狗启停 | 调试阶段必备,否则你哭都来不及 |
我个人习惯用 MAX6369 或 TPS3823 系列。为什么?因为它们的窗口功能做得扎实,而且有手动复位输入,调试时特别方便。你想想看,如果芯片没有使能引脚,你在 bootloader 阶段想停掉看门狗,还得改硬件,多麻烦。
核心原则:看门狗芯片的「超时时间」必须大于系统最长的正常喂狗间隔,同时小于系统能容忍的「死机时间」。一般取 2~3 倍的安全裕量。
2.2 喂狗信号设计:别让毛刺害了你
喂狗信号,就是 CPU 定期给看门狗芯片发送的「我还活着」脉冲。这个信号看似简单,其实门道很多。
喂狗信号通常有两种方式:
- GPIO 翻转喂狗:CPU 通过一个 GPIO 输出方波,每次电平变化就是一次喂狗。这种方式最常用,但要注意 GPIO 的初始化状态。
- WDI 引脚直接喂狗:有些芯片支持直接检测 WDI 引脚上的脉冲。这种方式更直接,但抗干扰能力稍弱。
我在项目中遇到过一个问题:系统上电时,GPIO 默认是高电平,而看门狗芯片在检测到第一个下降沿时开始计时。结果呢?CPU 还没跑起来,看门狗就已经开始倒计时了。等 CPU 初始化完 GPIO 再去喂狗,已经超时了。
我的经验:喂狗 GPIO 一定要在系统启动的最早期就初始化,并且先输出一个确定的电平。我习惯用「先拉低再拉高」的方式,确保看门狗芯片能正确识别第一个脉冲。
还有一个容易忽略的点:喂狗信号的毛刺。如果 GPIO 翻转时产生了毛刺,看门狗芯片可能会误判为多次喂狗,导致窗口看门狗误触发。解决办法很简单:在 GPIO 输出端加一个 10nF 左右的电容到地,滤掉高频毛刺。
// 喂狗函数示例(基于 STM32)
void watchdog_feed(void)
{
static uint8_t toggle = 0;
// 先拉低,再拉高,确保产生完整的脉冲
HAL_GPIO_WritePin(WDOG_FEED_GPIO_Port, WDOG_FEED_Pin, GPIO_PIN_RESET);
delay_us(10); // 至少保持 1us 的低电平
HAL_GPIO_WritePin(WDOG_FEED_GPIO_Port, WDOG_FEED_Pin, GPIO_PIN_SET);
toggle ^= 1;
}
警告:不要在中断服务函数里喂狗!我曾经见过一个同事在定时器中断里喂狗,结果主循环死锁了,中断还在正常跑,看门狗永远不触发。这种「假活」状态比真死还可怕。
2.3 复位输出设计:别让复位信号打架
复位输出,就是看门狗芯片在超时后拉低的那根线。这根线通常连接到 CPU 的复位引脚,或者整个系统的复位总线。
设计复位输出时,有几点要注意:
- 开漏输出 vs 推挽输出:我建议用开漏输出。为什么?因为系统里可能不止一个复位源——比如电源监控芯片、手动复位按钮、JTAG 调试器。开漏输出可以「线与」,任何一个复位源拉低,系统就复位。
- 上拉电阻:开漏输出必须配上拉电阻。阻值选 4.7kΩ~10kΩ 就行,太小了功耗大,太大了上升沿太慢。
- 复位脉冲宽度:看门狗芯片输出的复位脉冲通常有固定宽度,比如 200ms。这个时间要足够长,确保 CPU 能完成复位。如果 CPU 复位时间较长,可以考虑加一个外部 RC 延时。
我记得有一次,系统在低温环境下频繁复位。查了半天,发现是复位信号线上有毛刺,导致 CPU 误复位。后来在复位引脚上加了一个 100nF 的电容,问题就解决了。嗯,复位信号的滤波真的很重要。
复位电路设计口诀:开漏输出、上拉电阻、滤波电容、多源线与。记住这四点,复位电路基本不会出问题。
2.4 电源域隔离:别让看门狗「饿死」
电源域隔离,是硬件看门狗设计里最容易忽略的一环。你想想看,如果 CPU 的电源域和看门狗芯片的电源域是同一个,那 CPU 挂了的时候,电源可能也挂了,看门狗也跟着没电了——这还怎么监工?
正确的做法是:看门狗芯片必须使用独立的电源域。这个电源域可以来自:
- 系统的主电源(经过稳压):比如 3.3V 或 5V,但要确保这个电源不会因为 CPU 故障而掉电。
- 独立的 LDO:用一个单独的 LDO 给看门狗供电,与 CPU 的电源完全隔离。
- 电池备份域:对于需要长期监控的系统,可以用电池给看门狗供电。
我在一个工业项目中,用了独立的 LDO 给看门狗供电。结果有一次 LDO 的输入电容虚焊,导致看门狗供电不稳,系统频繁复位。查了整整两天才找到原因。从那以后,我每次都会在原理图上标注「看门狗电源域独立」,并且要求 PCB 布局时把看门狗芯片放在电源入口附近。
我的习惯:看门狗芯片的供电引脚旁边,一定要放一个 100nF 的陶瓷电容和一个 10μF 的电解电容。前者滤高频,后者储能。这样能保证看门狗在电源波动时依然稳定工作。
还有一个细节:看门狗芯片的复位输出信号,如果需要跨越电源域,一定要加电平转换电路。比如看门狗工作在 5V 域,CPU 工作在 3.3V 域,那复位信号必须经过电平转换,否则会烧坏 CPU 引脚。
// 电平转换电路示例(5V -> 3.3V)
// 使用两个 NPN 三极管组成开漏转换
// 5V 侧:看门狗复位输出 -> 三极管基极
// 3.3V 侧:三极管集电极 -> CPU 复位引脚,上拉到 3.3V
注意:电源域隔离不只是供电隔离,还包括信号隔离。如果看门狗和 CPU 不在同一个电源域,所有跨域信号都必须做电平转换。我曾经见过有人直接用电阻分压,结果信号质量一塌糊涂。
好了,硬件看门狗电路设计的四个要点就讲到这里。选型要选窗口看门狗,喂狗信号要防毛刺,复位输出要用开漏,电源域要独立隔离。这四点做到了,你的系统就有了一个靠谱的「监工」。
下一章我会讲软件看门狗的实现策略,包括多任务喂狗、喂狗时间戳校验、以及如何与硬件看门狗配合。到时候见。