当前位置:首页 > 燃界驿讯 > 正文

板子死机后按复位没用,断电才恢复:别只查软件,先看“电到底有没有真的掉干净”

凡亿硬件研发

板子死机后按复位没用,断电才恢复:别只查软件,先看“电到底有没有真的掉干净”

wKgZPGqsoN6AA5hGAAHTp5ObdnA074.jpg

封面素材:TI E2E,多电源轨上电时序实测波形

有一类硬件故障很折磨人:

设备跑几个小时甚至几天后突然死机。

MCU不响应,通信断掉,程序像是彻底卡住了。

按RESET没用,软件复位也没用。

但只要把整机电源断掉,再重新上电,系统又恢复正常。

遇到这种现象,很多团队第一反应都是:

“肯定是软件跑飞了。”

软件当然要查,但如果复位无效、完整掉电却有效,硬件工程师应该立刻多问一句:

RESET到底复位了什么?又有哪些电路根本没有被RESET?

更关键的是:

你以为已经断电了,芯片的电源轨真的掉到0V了吗?

一、RESET不是“缩小版断电”

这是定位这类问题最重要的一点。

MCU的外部RESET、看门狗复位、软件复位,通常只会让芯片内部特定逻辑回到复位状态。

但整块板上还有很多东西不一定跟着一起复位:

PMIC电源监控FPGA/CPLD、PHY、外部Flash、接口收发器传感器、桥接芯片以及其他独立电源域。

某个外设如果已经进入异常状态,单独复位CPU并不一定能把它拉回来。

甚至MCU自身,如果供电曾经落入一个“低于正常工作电压、但又没有低到触发完整POR”的区域,也可能出现不完整复位。

所以:

RESET能恢复的软件故障,和必须真正掉电才能恢复的电源/状态机故障,要分开看。

二、最容易被忽略的问题:I/O正在偷偷给芯片“反向供电”

图1:NXP 社区中的 POR、核心电压与控制信号上电时序实测。

一个很典型的现场是:

你把MCU主电源关掉,万用表却还能量到VDD上有0.5V、0.8V,甚至更高。

这时不要以为只是电容没放完。

很可能是另一个仍然带电的器件,通过GPIO、UART、SPI、I²C或者控制信号,经过芯片内部的ESD保护结构,把电流灌回了VDD。

Microchip的硬件调试资料就明确把这种现象称为 Power through I/O:电源关闭以后,外部I/O仍处于高电平,可能通过ESD二极管给MCU电源轨供电。

这会带来一个很麻烦的结果:

你做了“断电动作”,但芯片内部实际上没有完成一次干净的掉电。

POR没有重新建立,内部模拟模块、I/O状态甚至部分外围状态可能停留在一个不可预期区间。

于是就出现:

短按电源不行,等几秒再上电却好了。

本质上不是“等芯片冷静一下”,而是终于把残余电压放到了真正的复位区间以下。

三、第二个高发点:电压掉下来了,却没掉到POR阈值以下

wKgZPGqsoOGAHbVDAA6dnYpMmFk939.png

图2:PMIC 上电异常实测,多路 Enable 与输出轨需要一起看,而不是只盯 CPU。

很多芯片同时存在POR、BOR/LVD、外部RESET等不同复位机制。

它们的触发阈值并不一样。

如果系统有大电容、超级电容、掉电很慢的DC/DC,或者多个电源域互相拖着,VDD可能长时间停在一个尴尬电压:

已经低到CPU不能可靠运行,却又没有低到重新触发一次完整Power-On Reset。

NXP在相关技术讨论里就给出过类似案例:电源短暂移除后,电压因为电容没有彻底放完,重新上电时系统不能正确启动;启用低压检测/棕断复位后,才能把MCU保持在复位状态直到电压重新进入可靠工作区。

所以现场看到“断电5秒就好,快速重启不行”,一定要抓完整的掉电—上电波形。

不要只看上电。

四、第三个问题:真正锁住的可能不是MCU,而是外部器件

比如:

PMIC进入保护锁存;

FPGA电源时序没有重新满足;

PHY状态机异常;

某个传感器或接口芯片需要完整POR才能恢复;

电源Enable保持在错误状态;

某一路电源因为反灌没有完全关闭。

这时按MCU RESET当然没有用。

因为真正坏掉的“状态”根本不在MCU里面。

一个很实用的判断方法是:

死机以后,RESET MCU,同时观察外部电源轨、PMIC PGOOD、关键外设RESET和Enable有没有发生任何变化。

如果这些信号完全没动,那你只是重启了CPU,并没有重启系统。

五、现场怎么测?先别急着接JTAG

图3:典型多电源轨 + RESET 时序实测。复位释放时刻必须和电源稳定状态对应。

遇到“复位无效、掉电恢复”,建议先抓这几组波形。

第一组:主电源轨 + MCU VDD + RESET。

确认按RESET时电源有没有异常;真正断电时VDD最低掉到多少;重新上电时RESET是在什么时候释放的。

第二组:所有可能反灌的接口。

尤其看来自其他电源域的UART TX、SPI、GPIO控制线、USB相关信号、外部模块IO。

关掉MCU电源以后,如果某根IO仍然维持高电平,而MCU VDD又被“托”在一个非零电压,方向就很明确了。

第三组:PMIC PGOOD / EN / 核心电压。

很多复杂SoC、FPGA板卡,问题其实发生在电源状态机,而不是软件。

第四组:掉电时间。

示波器单次触发,从关机一直抓到所有电源轨真正掉干净。

很多问题只有在这一段才看得到。

六、一个很有效的排查办法:逐个切断“外部活电源”

如果怀疑I/O反灌,不要一开始就大改PCB

调试阶段可以逐个断开:

外接模块;

USB/UART连接;

调试器;

另一个常供电电源域;

外部上拉电源。

每断掉一项,就重新测试快速掉电重启。

如果拔掉某个接口以后,VDD终于能快速掉到0V附近,故障也消失,基本就找到路径了。

这个方法往往比盯着软件Log快得多。

七、设计阶段怎么避免“假断电”?

真正稳健的板卡,掉电路径也需要设计。

常见手段包括:

不同电源域之间使用带断电隔离能力的Buffer/Level Shifter;必要的IO串联限流;合理的下拉/放电电阻;用Load Switch控制电源域;使用电压监控/Reset Supervisor;保证PMIC和处理器RESET关系明确。

同时要在器件Datasheet里确认:

I/O在VDD=0时是否容忍外部电压;

是否允许Power-off Protection;

输入钳位电流最大值;

电源时序要求;

POR/BOR阈值;

RESET到底覆盖哪些内部模块。

这些往往比“RESET脚拉低多少毫秒”更重要。

最后一个工程判断

当一块板出现:

按RESET救不回来,但断电后能恢复。

不要只把它定义成“软件死机”。

先验证两件事:

系统是不是所有关键器件都被真正复位了?

掉电时,所有关键电源轨是不是真的掉到了能触发完整POR的范围?

很多所谓“必须拔电源才能好”的玄学故障,最后都会落到几个很具体的硬件问题上:

反向供电、棕断复位、电源时序、外设状态机或者PMIC锁存。

成熟的硬件调试,不只会看“怎么上电”,还要知道系统到底是怎么“彻底掉电”的。

声明:

本文由凡亿教育整理,转载请注明来源!

审核编辑 黄宇​