很多板子最难查的问题,不是完全不工作,而是“偶尔不工作”。实验室测十次有九次正常,客户现场一上电就卡死;复位一下又好了,断电重来又不一定复现。遇到这种问题,很多人第一反应是程序跑飞、芯片质量不稳定、晶振起振慢。其实还有一个经常被低估的原因:上电时序没有设计好。
硬件工程里有一类问题特别折磨人:它不稳定、不规律、不容易抓波形,还特别喜欢出现在量产后。
比如某个控制板,单独调试电源没问题,单独跑MCU也没问题。可整机上电时,有时MCU启动后读不到外设,有时DDR初始化失败,有时通信模块不响应,还有时只是偶发卡在启动界面。你重新按一下复位,系统又恢复正常。
这种现象如果只从软件角度查,很容易陷入死胡同。因为软件看到的是“外设没回应”“寄存器状态异常”“初始化超时”,但真正的根因可能发生在软件开始运行之前:电源还没稳、复位已经释放,或者某个外设还在半上电状态。
01 上电时序不是“电压最后都起来了”就行
很多新人看电源,会重点关注两个指标:电压准不准,纹波大不大。比如3.3V测出来是3.31V,1.2V测出来是1.19V,看起来都在范围内,就觉得电源没问题。
但系统启动时,电源不是静态表格,而是一段动态过程。
一路电源先起来,另一路电源后起来;有的电源爬升很快,有的电源受软启动影响很慢;有的芯片要求内核电先于IO电,有的芯片要求模拟电和数字电之间不能相差太久。只看最终电压,就像只看终点,不看路上有没有摔倒。
更麻烦的是,有些芯片在电压没有完全稳定时,内部逻辑已经开始工作。复位脚如果释放太早,芯片可能在一个不可靠的电源状态下读取配置脚、锁存启动模式、初始化内部寄存器。等电压稳定后,它已经站在错误状态里了。
这就是为什么有些板子“按复位能好,重新上电不一定好”。复位动作发生时,电源已经稳定;而冷启动时,复位和电源爬升可能没有配合好。
02 最常见的坑:复位释放太早
复位电路看起来简单,实际很容易埋坑。
很多设计里,复位脚只是接一个RC延时,或者由某一路电源监控芯片输出。问题在于,系统里可能不止一路电源。你用3.3V电源监控MCU复位,但1.8V外设电源、1.2V内核电源、模拟电源可能还没完全稳定。
结果就是:MCU已经开始初始化外设,外设却还没准备好。
轻一点的表现是初始化失败,需要软件重试。重一点的表现是外设进入异常状态,后面怎么配置都不对。更隐蔽的是,问题只在某些温度、某些电源适配器、某些负载条件下出现。因为电源爬升速度会随输入电压、负载电流、电容容量、温度和电源芯片批次变化。
比较稳妥的做法,是把复位释放条件设计成“关键电源都稳定以后,再延迟一段时间”。如果系统比较复杂,可以用电源监控芯片、复位管理芯片、PMIC的Power Good信号,或者由CPLD/MCU做更精细的时序控制。
RC复位不是不能用,但要知道它的边界。电容误差、漏电流、温度变化都会影响延时时间。对简单低成本产品可以接受,对多电源复杂系统就不要太相信它。
03 IO反灌电:一个很容易被忽略的启动陷阱
上电时序问题里,还有一个特别容易被忽略的点:IO反灌电。
假设A芯片已经上电,B芯片还没上电。A通过GPIO、UART、SPI、I2C或其他信号线给B输出高电平。这个高电平可能通过B芯片IO口的ESD保护二极管,反向给B的电源轨灌电。
表面上看,B还没正式供电;实际上,它的内部某些区域已经被“半吊子”地点亮了。
这种状态非常危险。芯片可能没有完全复位,内部逻辑可能处在未知状态,电源轨上还可能出现一个奇怪的中间电压。等真正的电源再起来时,芯片不一定能干净地重新启动。
这类问题在多板互连、外部模块、热插拔接口、不同电源域之间特别常见。比如主控板先上电,通信模块后上电;主板关机了,外部调试器还连着;USB转串口模块给未上电目标板的RX脚送电平。
排查时可以用示波器盯住未上电电源轨,看它在正式上电前是否被抬高。只要看到本该为0V的电源轨出现几百毫伏甚至一两伏,就要警惕反灌电。
解决办法包括串电阻、加电平转换、使用具备断电高阻特性的器件、调整上电顺序,或者在软件启动早期先保持相关IO为输入态。关键是别让一个未上电芯片先被信号线“偷偷叫醒”。
04 Power Good信号不要随便乱接
很多电源芯片都有Power Good,简称PG或PWRGOOD。名字听起来很可靠,但用的时候要看清楚数据手册。
PG代表什么?是输出电压超过某个阈值?是软启动完成?是芯片没有过流过温?阈值是多少?有无延时?开漏还是推挽?上拉到哪一路电源?这些细节都很关键。
有些工程师会把多个PG信号直接并在一起,或者用某一路PG去控制另一颗芯片的使能脚。这样做不是一定错,但要确认逻辑关系、电平兼容、上拉电源域和时序余量。
开漏PG需要上拉电阻。如果上拉到一个还没起来的电源域,信号可能一直无效;如果上拉到已经起来的电源域,又可能提前影响后级使能。看起来只是一个小信号,实际可能决定整个系统启动顺序。
更稳的做法,是画一张启动时序表:输入电源什么时候到,DCDC什么时候使能,LDO什么时候输出,PG什么时候有效,复位什么时候释放,MCU什么时候开始访问外设。把这些节点放在同一条时间轴上,很多问题会比盯着原理图更容易看出来。
05 怎么查上电时序问题?
查这类问题,不要一上来就大改电路。先把现象抓住。
第一步,用示波器同时看关键电源和复位。至少要看主电源、核心电源、IO电源、复位脚。如果通道不够,就分批测,但触发条件要尽量一致。重点不是只看最终电压,而是看爬升斜率、先后顺序、毛刺和复位释放点。
第二步,看外设使能和通信开始时间。比如MCU什么时候拉高模块EN,什么时候开始SPI访问,什么时候读I2C设备地址。如果外设电源刚起来,MCU就开始访问,问题就很可疑。
第三步,做边界条件测试。换不同电源适配器,改变输入电压,冷热机启动,多次快速断电再上电。很多时序问题在“慢爬升电源”“快速重启”“低温电容容量变化”时更容易暴露。
第四步,加临时延时验证。可以先在软件里延后外设初始化,也可以临时加大复位延时,或者用飞线控制使能脚。如果延时后问题明显改善,基本就说明方向找对了。
第五步,回到硬件上做稳定方案。软件延时可以作为辅助,但不要把所有电源时序责任都丢给软件。软件运行前发生的问题,最好由电源、复位和使能逻辑先兜住。
06 设计阶段怎么预防?
上电时序不是调试阶段才需要考虑,原理图阶段就应该写进设计检查表。
对复杂系统,建议至少做这几件事。
把所有电源轨列出来,包括电压、负载、来源、使能条件和PG状态;
查主芯片、DDR、射频模块、传感器等关键器件的数据手册,确认电源上电顺序要求;
确认复位释放条件,不要只盯着一路电源;
检查不同电源域之间的IO连接,评估反灌电风险;
对关键模块预留0Ω、电阻、电平转换或使能控制点;
给调试留测试点,至少能测到关键电源、复位、PG和使能信号。
很多时候,预防上电时序问题的成本很低:多预留一个复位管理器位置,多放一个0Ω隔离点,多引出一个测试点。可如果等到量产后才发现偶发启动失败,代价就完全不是一个量级了。
结尾:偶发问题,往往藏在启动瞬间
硬件工程里,最怕的不是问题明显,而是问题似有似无。上电时序就是这样一种隐形风险:板子最终电压都对,功能大部分时候也正常,但某个启动瞬间没处理好,就会留下偶发死机、外设丢失、初始化失败的隐患。
别把所有启动异常都推给程序。程序当然可能有问题,但程序开始跑之前,硬件已经经历了一整段电源爬升、复位释放、IO状态变化和外设准备过程。
下次遇到“复位能好、重新上电不一定好”的板子,先别急着改代码。拿起示波器,把电源、复位、PG和使能信号放到同一条时间轴上看一遍。很多看似玄学的偶发故障,答案就藏在那几毫秒里。
热门跟贴