http://www.gkong.com 2026-11-12 05:15 苏州永节电子科技有限公司
看门狗和掉电检测这两块,在原理图上就是两个引脚、两行代码,画上去就算做完了。真正出问题的地方几乎都在时序上,而且现象分散:有的板子跑几小时重启一次,有的几十台里出一两台丢参数,实验室又都复现不出来。下面六个点是我们复盘过几类现场故障之后固定下来的自查项,都不复杂,但漏一个就可能整批返修。
一是喂狗点放在主循环末尾,不放在开头。放开头看着逻辑通顺,问题是循环中途卡死的那一轮已经喂过狗,等于白给了一次豁免——下一轮才轮到狗咬。放末尾,卡住的那一轮就喂不到,超时立刻生效。这一条改起来只移动一行代码,但它决定看门狗到底管不管用。
二是超时值按耗时长的分支来定,算完留一倍余量。主循环的实际周期不是平均值。写 Flash 一页、等串口回包、扫一轮 ADC,任何一项都可能把单次循环拉到平时的几倍。超时值要按这些分支的上限算,再加一倍余量;反过来,为了跑得快把周期压到刚好,等于给自己埋一个随机复位。算完可以打印一次循环计时的最大值来对照,比凭感觉估靠谱。
三是每个耗时分支带独立超时计数,超时就主动不喂。这是把整板复位换成单次动作失败的做法。等回包不要写裸 while,改成带计数的等待:计满就退出、置故障标志、继续走主循环。这样从站掉线只表现为一次通信失败,而不是整机重启。故障标志要落到非易失区,否则复位之后没人知道刚才发生过什么,现场只能看到一堆重启次数。
四是不在中断里喂狗。主循环已经卡死、中断还活着,这时候喂狗会把故障彻底掩盖——板子看起来正常,实际上逻辑早就停在那里。同样的道理,写 Flash 期间如果关中断,关多久要算清楚:要么换成窗口型看门狗,要么在写之前把余量留出来,别让关中断的窗口和喂狗周期撞在一起。
五是掉电检测阈值不要贴着工作电压。阈值要设在稳压输出下限再往下 0.3 到 0.5 V,并且留出写完一个扇区的时间。按输入电容容量和实际负载电流算一次维持时间,再留一倍余量——这个计算不难,但必须按真实电容、真实负载来,不能照抄别的板。阈值贴着工作电压,检测到的时候电容已经把电放得差不多了,那一页数据就写废了。
六是掉电落盘要能容下半途而废,上电先校验。参数分区做双备份或日志式,写一半断电不废整页;掉电窗口里不做格式整理,要写多少数据在正常运行时就算好,掉电时只做搬运;上电先校验,校验不过回退到上一份。另外一个容易忽略的点:只校验页头标记不够——标记是先写的,校验能过,于是把半页数据当成好的用。校验要覆盖整页的数据本身。
还有验证方式。反复上下电,包括快速断电马上再上电;用可调电源缓慢降压模拟掉电过程;人为在长分支里加一段延时触发看门狗,确认复位之后能自行恢复;读复位原因寄存器,把看门狗复位、掉电复位和上电复位分开记录。这四项跑一遍,比在台架上连续跑一整晚更容易把问题逼出来。
苏州永节电子科技有限公司,二十年电子行业设计经验,专注单片机开发与控制板定制,官网 www.yjeie.com。