硬件看门狗:独立看门狗(IWDG)原理、窗口看门狗(WWDG)原理、硬件电路设计要点
看门狗这东西,说白了就是系统最后的救命稻草。我做了十几年运动控制,见过太多因为程序跑飞导致电机撞限位、丝杠卡死的惨案。嗯,硬件看门狗就是那个在关键时刻帮你拉闸的人。
今天咱们聊聊两种最常用的硬件看门狗:独立看门狗(IWDG)和窗口看门狗(WWDG)。别看它们都叫看门狗,脾气秉性完全不同。
独立看门狗(IWDG)原理
独立看门狗,我习惯叫它「倔驴」。为什么?因为它只认一个死理:在规定时间内,你必须喂它一次。不喂?直接复位。
它的核心结构其实很简单:
- 独立的时钟源:通常是内部低速RC振荡器(LSI),大约40kHz。这个时钟不受主系统时钟影响,即使主时钟挂了,它照样跑。
- 12位递减计数器:从预设值开始往下减,减到0就触发复位。
- 键寄存器(KR):专门用来喂狗的寄存器,必须写入特定值才能重装载计数器。
我在项目中遇到过一件事:有次调试伺服驱动器,主晶振莫名其妙停振了,整个系统死在那。但IWDG还在跑,因为它用的是独立的LSI时钟。最后是看门狗把系统拉回来的。你想想看,如果没有这个独立时钟源,那台设备可能就彻底废了。
关键参数计算:
超时时间 = (预分频系数 × 重装载值) / LSI频率
举个例子:预分频系数=64,重装载值=1000,LSI=40kHz
超时时间 = (64 × 1000) / 40000 = 1.6秒
喂狗的代码其实就几行:
// 喂狗操作
IWDG->KR = 0xAAAA; // 重装载计数器
IWDG->KR = 0xCCCC; // 启动看门狗
注意,喂狗必须在主循环的固定位置,不能放在中断里。我曾经见过有人把喂狗放定时器中断里,结果主程序死循环了,中断还在跑,看门狗永远喂不饱。这叫什么?这叫掩耳盗铃。
窗口看门狗(WWDG)原理
窗口看门狗就聪明多了。它不光要求你喂,还要求你在一个特定的时间窗口内喂。喂早了不行,喂晚了也不行。
我刚开始接触WWDG时觉得这玩意儿有点矫情,后来才明白它的精妙之处。
WWDG的核心特点:
- 时钟来自APB1总线:和系统时钟同源,主时钟挂了它也跟着挂。但这不是缺点,而是设计意图。
- 7位递减计数器:从0x7F往下减,减到0x3F触发复位。
- 窗口值(CFR寄存器):定义了喂狗的上限时间。计数器值大于窗口值时喂狗,直接复位。
为什么要有窗口?我举个例子你就明白了。假设你的运动控制程序正常运行时,每500微秒执行一次主循环。如果程序跑飞了,但碰巧还在循环里乱转,可能每50微秒就「碰巧」喂一次狗。IWDG对这种高频误喂狗毫无办法,但WWDG能识别——因为喂早了。
个人经验:我一般把WWDG的窗口值设在正常喂狗时间的1.2倍左右。比如正常喂狗周期是100μs,窗口值就设120μs。这样既给了正常运行的余量,又能快速检测异常。
WWDG的配置代码:
// 配置WWDG
WWDG->CFR = 0x60; // 窗口值设为0x60
WWDG->CR = 0x7F; // 计数器初始值0x7F,使能看门狗
// 喂狗操作
WWDG->CR = 0x7F; // 必须在窗口值到0x60之间执行
硬件电路设计要点
软件写得再好,硬件设计有坑照样白搭。这部分我踩过的坑比较多,你仔细听。
1. 复位电路设计
看门狗复位信号通常接到MCU的NRST引脚。这里有个容易忽略的点:复位信号宽度。有些看门狗芯片输出的复位脉冲很窄,只有几微秒,MCU可能来不及响应。
我建议在复位引脚上加一个RC延时电路,确保复位脉冲宽度大于MCU要求的最小值。一般100ms比较稳妥。
2. 独立看门狗的外部实现
如果MCU内部没有IWDG,或者你觉得内部的不够可靠,可以用外部看门狗芯片。常用的有MAX706、TPS3823等。
| 芯片型号 | 超时时间 | 特点 |
|---|---|---|
| MAX706 | 1.6s | 带手动复位输入 |
| TPS3823 | 1.6s/200ms可选 | 超低功耗 |
| ADM706 | 1.6s | 带看门狗使能引脚 |
避坑指南:我曾经在一个项目中用了外部看门狗,但喂狗信号线走线太长,受到电机驱动的大电流干扰,导致看门狗误复位。后来把喂狗信号线改成差分走线,问题解决。记住:看门狗相关的信号线一定要远离大电流回路。
3. 喂狗信号的电平匹配
外部看门狗的喂狗引脚通常是电平触发或边沿触发。如果是电平触发,要注意MCU上电初始化期间IO口的状态。有些MCU的IO口默认是浮空输入,可能被外部干扰拉到无效电平,导致看门狗误动作。
我的做法是:在MCU初始化代码的最前面,先把喂狗引脚配置为推挽输出,输出有效电平。然后再初始化其他外设。
4. 看门狗使能开关
调试阶段看门狗很烦人,动不动就复位。我习惯在硬件上留一个跳线帽,可以临时禁用看门狗。但量产时必须去掉这个跳线,或者用软件锁定。
最后说一句,看门狗不是万能的。它只能检测到程序跑飞,但检测不到逻辑错误。比如你的运动控制算法算错了位置,程序还在正常跑,看门狗照样喂得饱饱的。所以,该做的软件保护、限位开关、急停按钮,一个都不能少。
我的习惯:在运动控制项目中,我通常同时使用IWDG和WWDG。IWDG作为最后一道防线,超时时间设长一点(比如2秒)。WWDG作为快速检测,窗口设在正常循环时间的1.5倍。这样既有快速响应,又有兜底保障。
嗯,硬件看门狗就聊这么多。记住一句话:看门狗是保命的,不是治病的。别指望它解决所有问题,但关键时刻它能救你一命。
公众号:蓝海资料掘金营,微信deep3321