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机制 监控芯片选型 示波器长时基抓取 ADC电压日志记录 关注纹波峰值与最低点 E=0.5*C*(V_start²-V_min²) 留50%以上余量 注意温度对容值的影响 设置合适阈值(2.7~2.9V) 升级前检查BOR状态 配合看门狗使用 阈值精度±1%~±5% 响应时间1~50μs 预留焊盘作为后手 排查顺序:先检测 → 再计算 → 后配置BOR → 最后考虑外挂芯片

嗯,电源中断排查这块,说白了就是四个字:测、算、配、选。先测波动,再算电容,配好BOR,最后看要不要加监控芯片。每一步都有坑,但每一步也都有对应的解法。

我个人觉得,很多升级失败的问题,其实在原理图阶段就能避免。花10分钟算一下电容储能,花5分钟配一下BOR阈值,就能省掉后面几天的排查时间。这笔账,怎么算都划算。