看门狗喂狗会误复位,是怎么回事?
看门狗喂狗会误复位,是怎么回事?
回答(5)
喂狗误复位就几个坑:1) 看门狗时钟选了外部慢速晶振,启振失败直接没时钟;2) 喂狗周期设置太紧,代码里多几个分支就卡过时间;3) bootloader或低功耗模式把喂狗关了,唤醒后没重配。建议用寄存器读写全备份,喂狗前后打印时间戳对比,把看门狗超时时间留至少2倍余量,并做一次连续48小时压力测试。
我遇到过因为喂狗指令被中断打断的情况:喂狗先清计数器,刚要重装载,一个高优先级中断进来卡太久,导致实际窗口溢出。解决办法:喂狗前关中断,喂完再开;或者直接用硬件喂狗,比如定时器PWM输出复位脉冲给看门狗输入。另外检查看门狗是窗口模式的话,喂早了也会复位,确认你的喂狗时刻在窗口内。
先查电源!看门狗误复位多半不是软件喂狗问题,而是VDD跌落或纹波尖峰导致内核跑飞,看门狗超时复位。示波器抓喂狗瞬间的电流冲击,很多MCU调Flash或者IO翻转时电源毛刺大,复位引脚或内核先崩。还有,看门狗独立RC振荡器本身不稳,温度变化大时容易超时。建议量一下喂狗间隔的实际抖动,别用理论上限。
★ 精华
最常见原因是喂狗位置不对:放了喂狗在中断里,主循环卡死但中断还活着,看门狗照样喂,复位反而不触发。另一类是喂狗指令本身被优化掉,比如写寄存器用volatile没加,或者看门狗时钟分频配置有误。建议:喂狗只放主循环末尾,中断里只做标志;用调试器看复位原因寄存器和喂狗窗口寄存器,确认是窗口超时还是提前。