3. 电源中断排查:从波动到复位,一个都不能放过
电源问题,是固件升级中断里最隐蔽的杀手。你想想看,代码写得再完美,电容一掉电,Flash写入到一半就断了,那后果就是变砖。我这些年处理过的升级失败案例,少说有三分之一跟电源脱不了干系。
这一章,咱们就聚焦在电源中断的排查上。我会从四个维度来讲:怎么检测电源波动、怎么算电容够不够撑住升级、芯片自带的BOR机制怎么用、以及什么时候该上外部监控芯片。
核心观点:电源中断排查,不是等出了问题再去抓波形,而是在设计阶段就把余量算清楚。升级过程中的瞬时大电流,往往是压垮电源的最后一根稻草。
3.1 电源波动检测:别等复位了才后悔
很多工程师觉得,电源波动嘛,用万用表量一下不就行了?其实不是。升级过程中的电源波动是瞬态的,可能只有几微秒。万用表根本抓不住。
我个人习惯的做法是:
- 用示波器抓长时基:设置500ms/div,触发模式选下降沿,电压阈值设在3.0V(对于3.3V系统)。这样能抓到升级过程中任何一次电压跌落。
- 关注纹波峰值:升级时Flash写入电流可能达到几十毫安,如果供电走线细,压降会很明显。我见过一个项目,走线0.3mm宽,升级时直接掉了0.4V。
- 记录最低点:示波器的测量功能里,把最小值记录下来。这个值就是你的系统在升级时承受的最低电压。
小技巧:可以在固件里加一个"电压日志"功能。每次升级前,用ADC采样VDD,把最低值存到备份寄存器里。升级完成后读出来,就能知道电源到底有没有波动。我在一个电池供电的项目里用过这招,效果很好。
3.2 电容储能计算:你的"小水库"够大吗?
电容在电路里,说白了就是个微型水库。电源正常时它蓄电,电源波动时它放电。升级过程中,如果电源突然断开,电容里存的电就是系统最后的救命稻草。
计算公式其实很简单:
E = 0.5 * C * (V_start² - V_min²)
其中:
E = 可用能量(焦耳)
C = 电容值(法拉)
V_start = 起始电压(V)
V_min = 系统最低工作电压(V)
举个例子:一个1000μF的电容,从3.3V掉到2.7V(MCU通常在这个电压以下会复位),能释放的能量是:
E = 0.5 * 0.001 * (3.3² - 2.7²)
= 0.0005 * (10.89 - 7.29)
= 0.0005 * 3.6
= 0.0018 焦耳
这点能量够不够?得看你的升级流程需要多久。我记得有一次,客户说升级总是失败,我算了一下,他们的电容只能撑2ms,而Flash擦除需要5ms。结果很明显——电容不够。
| 电容值 | 3.3V→2.7V释放能量 | 可支撑时间(@50mA负载) |
|---|---|---|
| 470μF | 0.00085 J | 约1.2ms |
| 1000μF | 0.0018 J | 约2.5ms |
| 2200μF | 0.00396 J | 约5.5ms |
| 4700μF | 0.00846 J | 约12ms |
注意:电解电容的实际容值有-20%的误差,而且温度越低容值越小。设计时建议留出50%以上的余量。我曾经在-20℃环境下测过,1000μF的电容实际只有600μF,差点翻车。
3.3 低电压复位(BOR)机制:芯片自带的"保险丝"
BOR,全称Brown-Out Reset,是MCU内部的一个电压监测电路。当VDD低于某个阈值时,它会强制复位MCU,防止芯片在电压不稳的状态下乱跑。
这个机制在升级时特别重要。为什么?因为如果电压跌到临界区,Flash写入可能产生错误数据,而MCU又没有复位,那就会写出一个"半残"的固件。下次启动时,校验通不过,直接变砖。
我建议的做法是:
- 开启BOR,并设置合适的阈值:对于3.3V系统,BOR阈值设在2.7V~2.9V比较合理。太低的话,电压已经不稳了才复位,来不及;太高的话,正常波动也会触发复位。
- 在升级前检查BOR状态:很多MCU有BOR状态寄存器,可以读出上次复位是不是BOR触发的。如果是,说明电源有问题,应该中止升级。
- 配合软件看门狗:BOR复位后,看门狗可能还在跑。我习惯在初始化时先清看门狗,再检查复位原因,避免死循环。
避坑指南:我曾经在一个项目里,BOR阈值设得太低(2.0V),结果电源已经掉到2.3V了,MCU还在跑,Flash写入了一半就卡住了。升级失败率高达30%。后来把BOR阈值改到2.8V,问题立刻解决。记住:BOR不是摆设,它是保护升级的最后一道防线。
3.4 电源监控芯片选型:什么时候该上"外援"
MCU自带的BOR虽然好用,但精度和响应速度有限。如果你对电源质量要求很高,或者系统里有多个电压域,那就得考虑外部电源监控芯片了。
我选型时主要看这几个参数:
- 阈值精度:内部BOR通常±5%,外部监控芯片能做到±1%。对于1.8V内核供电的系统,5%的误差就是0.09V,太危险了。
- 响应时间:内部BOR的响应时间一般在几微秒到几十微秒。外部芯片可以做到1μs以内。如果你的负载变化很快,这个差距就很关键。
- 手动复位输入(MR):这个功能很实用。升级前,可以用一个GPIO拉低MR引脚,让系统保持在复位状态,防止意外写入。
- 开漏输出:方便与多个电源域做"线与"连接。任何一个电源出问题,都能触发全局复位。
| 方案 | 精度 | 响应时间 | 成本 | 适用场景 |
|---|---|---|---|---|
| MCU内部BOR | ±5% | 10~50μs | 免费 | 对成本敏感、电源质量尚可 |
| 外部监控芯片(如MAX809) | ±1.5% | 1~5μs | 约0.3元 | 对可靠性要求高 |
| 精密监控芯片(如TPS3808) | ±1% | <1μs | 约1元 | 多电压域、高可靠性系统 |
我的经验:对于量产产品,我一般会在BOM里预留一个外部监控芯片的焊盘。如果测试发现电源问题严重,直接贴上芯片就行,不用改PCB。这个"后手"救过我好几次。
知识体系总览
下面这张图,把电源中断排查的四个维度串起来了。你可以把它当作排查时的路线图。
嗯,电源中断排查这块,说白了就是四个字:测、算、配、选。先测波动,再算电容,配好BOR,最后看要不要加监控芯片。每一步都有坑,但每一步也都有对应的解法。
我个人觉得,很多升级失败的问题,其实在原理图阶段就能避免。花10分钟算一下电容储能,花5分钟配一下BOR阈值,就能省掉后面几天的排查时间。这笔账,怎么算都划算。