第3章:看门狗硬件架构:独立看门狗(IWDG)与窗口看门狗(WWDG)的区别、外部看门狗芯片选型、硬件喂狗信号设计

大家好,我是你们的老朋友。今天我们来聊聊看门狗的硬件架构。说实话,看门狗这东西,在汽车电子里就是「最后一道防线」。我见过太多因为看门狗配置不当导致的现场故障,有些甚至是在客户试车时才暴露出来,那叫一个尴尬。

这一章,我会把独立看门狗(IWDG)、窗口看门狗(WWDG)的区别讲透,再聊聊外部看门狗芯片怎么选,最后说说硬件喂狗信号怎么设计。嗯,都是实战中踩过的坑,希望能帮你少走弯路。

3.1 独立看门狗(IWDG)与窗口看门狗(WWDG)的区别

先问个问题:你平时用IWDG多还是WWDG多?我个人习惯,在制动系统里,两者都会用,但用途完全不同。

3.1.1 独立看门狗(IWDG)

IWDG,说白了就是一个「死脑筋」的定时器。它由独立的RC振荡器驱动,即使主时钟挂了,它照样跑。我曾在项目中遇到过主晶振虚焊的情况,主控死得透透的,但IWDG依然在倒数,最后成功复位了系统——嗯,这就是它存在的意义。

关键特性:

  • 时钟源:内部低速RC(LSI),通常32kHz或40kHz,精度一般,但胜在独立
  • 超时范围:从几百微秒到几十秒,取决于预分频器和重装载值
  • 喂狗窗口:没有下限!只要在超时前喂狗就行,早喂晚喂都行
  • 复位行为:超时后直接产生系统复位

核心要点:IWDG适合检测「程序完全跑飞」的场景。比如CPU卡死在某个死循环里,或者主时钟停振了,IWDG都能兜底。

3.1.2 窗口看门狗(WWDG)

WWDG就「精明」多了。它要求你在一个特定的时间窗口内喂狗——不能太早,也不能太晚。太早喂狗说明程序执行太快,可能跳过了某些关键检查;太晚喂狗说明程序卡住了。

我记得有一次调试制动系统的状态机,发现某个分支条件下程序执行时间异常短,跳过了故障诊断模块。如果是IWDG,根本发现不了这个问题。但WWDG的窗口机制直接捕获了这个异常——喂狗太早了,触发复位。

关键特性:

  • 时钟源:来自系统时钟(APB1),主时钟挂了它也跟着挂
  • 窗口机制:有上限和下限,必须在窗口内喂狗
  • 提前唤醒中断:在超时前可以产生中断,让你有机会做「临终善后」
  • 复位行为:超时或窗口违规都会产生复位

注意:WWDG依赖系统时钟。如果主时钟停振,WWDG也会失效。所以制动系统里,我通常把IWDG和WWDG配合使用——IWDG保底,WWDG做时序监控。

3.1.3 对比总结

对比项 IWDG WWDG
时钟源 独立RC(LSI) 系统时钟(APB1)
时钟可靠性 高(主时钟挂了仍工作) 低(主时钟挂了就失效)
喂狗窗口 无下限(只要不超时) 有下限(不能太早)
精度 较低(RC振荡器) 较高(系统时钟)
典型用途 死机保护、时钟失效保护 程序执行时序监控
中断功能 无(部分型号有早期唤醒) 有(超时前中断)

3.2 外部看门狗芯片选型

说实话,MCU内部的看门狗虽然方便,但有一个致命弱点:如果MCU内部电源域或时钟域出问题,看门狗本身也可能失效。所以在制动系统这种ASIL-D级别的应用里,我强烈建议加一颗外部看门狗芯片。

我曾经在一个项目中,MCU内部IWDG的LSI振荡器因为温度漂移,实际频率从32kHz掉到了28kHz,超时时间长了近15%。虽然没出事故,但让我后怕了好一阵。从那以后,制动系统的主控板上,我都会预留外部看门狗的位置。

3.2.1 选型要点

  1. 超时精度:外部看门狗通常使用内部RC或外部电阻来设定超时时间。RC方式的精度一般在±5%~±20%之间,电阻方式的精度更高。我个人偏好电阻方式,虽然多一个元件,但心里踏实。
  2. 窗口功能:有些外部看门狗也支持窗口模式,比如TI的TPS3431。如果你需要时序监控,选带窗口功能的芯片。
  3. 使能引脚:最好有独立的EN引脚,方便在调试时禁用看门狗。我吃过亏——调试时忘记禁用外部看门狗,每次单步执行到一半就被复位了,那叫一个崩溃。
  4. 复位输出类型:推挽输出还是开漏输出?开漏输出可以与其他复位源(如电源监控芯片)做线与,实现多源复位。
  5. 工作电压范围:制动系统的工作电压范围很宽(6V~36V甚至更宽),要确保看门狗芯片的供电电压覆盖整个范围。

3.2.2 常用芯片推荐

芯片型号 超时范围 窗口功能 精度 工作电压
MAX6369 1.6s~300s ±5%(电阻设定) 1.6V~5.5V
TPS3431 1.6ms~10s ±3%(电阻设定) 1.8V~6.5V
ADM6315 1.6s~300s ±5%(电阻设定) 1.0V~5.5V
STM6910 0.1s~60s ±2%(电阻设定) 2.0V~5.5V

小技巧:选型时,超时时间最好留出50%以上的余量。比如你的主循环周期是100ms,那看门狗超时时间设在150ms~200ms比较合适。太短容易误触发,太长又起不到保护作用。

3.3 硬件喂狗信号设计

喂狗信号的设计,看似简单,其实门道很多。你想想看,如果喂狗信号本身就能被程序「绕过」,那看门狗还有什么意义?

3.3.1 喂狗信号的形式

外部看门狗的喂狗信号通常有两种形式:

  • 电平翻转:在WDI引脚上产生一个上升沿或下降沿。每次翻转都刷新看门狗定时器。
  • 脉冲序列:在WDI引脚上产生特定数量的脉冲。比如TPS3431要求每1.6s内至少产生一个脉冲,脉冲宽度不小于100ns。

我个人更推荐脉冲序列方式。为什么?因为电平翻转太容易被「骗」了。我曾经见过一个案例,程序跑飞后,某个GPIO恰好卡在高电平上,而看门狗恰好是上升沿触发——结果看门狗被「永久喂饱」了,系统死透了都没复位。

3.3.2 喂狗信号的硬件设计要点

  1. 独立GPIO:喂狗信号必须使用独立的GPIO,不能与其他功能复用。我见过有人把喂狗引脚和LED指示灯共用,结果调试时LED闪烁频率变了,看门狗也跟着误触发。
  2. RC滤波:在喂狗信号线上加一个小电容(比如100pF)到地,可以滤除高频噪声,防止误触发。但电容不能太大,否则会影响信号边沿的陡峭度。
  3. 上拉/下拉电阻:如果看门狗芯片要求喂狗引脚在空闲时保持高电平,那就加一个上拉电阻到VCC。反之亦然。防止MCU复位期间引脚悬空导致看门狗误动作。
  4. 隔离设计:在ASIL-D级别的系统里,我建议在MCU和看门狗芯片之间加一个隔离器件(比如光耦或数字隔离器)。这样即使MCU侧电源短路,也不会影响到看门狗芯片。

避坑指南:我曾经在一个项目中,喂狗信号线走线过长,且旁边有一条高频时钟线。结果每次时钟翻转时,喂狗信号线上都会耦合出毛刺,导致看门狗被「意外喂狗」。后来把喂狗信号线加粗、远离时钟线,并在靠近看门狗芯片端加了一个100pF的滤波电容,问题才解决。

3.3.3 喂狗信号的软件配合

硬件设计好了,软件也得跟上。喂狗操作不能放在中断里,否则主循环卡死了,中断还在跑,看门狗照样被喂。我建议把喂狗操作放在主循环的末尾,并且喂狗前要检查关键任务的执行状态。

// 伪代码示例:制动系统主循环喂狗
void main_loop(void) {
    while(1) {
        // 1. 执行传感器采集
        if (sensor_read() != OK) {
            error_flag |= SENSOR_ERROR;
        }
        
        // 2. 执行制动控制算法
        if (brake_control() != OK) {
            error_flag |= BRAKE_ERROR;
        }
        
        // 3. 执行故障诊断
        if (diagnostic_run() != OK) {
            error_flag |= DIAG_ERROR;
        }
        
        // 4. 检查所有关键任务是否完成
        if (error_flag == 0) {
            // 所有任务正常,喂狗
            WDI_TOGGLE();
        } else {
            // 有故障,不喂狗,等待看门狗复位
            // 或者执行安全降级操作
        }
        
        // 5. 清除错误标志,准备下一轮
        error_flag = 0;
    }
}

重要提醒:喂狗操作绝对不能放在定时器中断里!我见过有人把喂狗放在1ms的定时器中断里,结果主循环卡死了,中断还在跑,看门狗被「虚假喂狗」,系统失去了保护。这是新手最容易犯的错误之一。

3.4 本章小结

好了,这一章的内容就到这里。我们来回顾一下:

  • IWDG适合做「死机保护」,WWDG适合做「时序监控」,两者配合使用效果更佳
  • 外部看门狗芯片选型要关注超时精度、窗口功能、使能引脚和复位输出类型
  • 喂狗信号设计要避免被「绕过」,推荐使用脉冲序列方式,并做好滤波和隔离

下一章,我们会聊聊看门狗的软件实现策略,包括多级看门狗架构和故障响应机制。嗯,那才是真正考验设计功底的地方。我们下次见。