MCU 随机重启?别只怪电源纹波,看看掉电复位(BOR)阈值

MCU 随机重启?别只怪电源纹波,看看掉电复位(BOR)阈值

摘要:系统电压 3.3V,掉到 3.0V 时 MCU 频繁重启,但 datasheet 写着最低工作电压是 2.7V?不是电源带不动,而是BOR(掉电复位)阈值​ 配置过低或电源跌落斜率太陡。本文解析 MCU 复位的真实边界条件。


一、问题描述(现象)

**电池供电设备,电量显示还有 60%;

电机一启动或大电流负载一开启,MCU 立刻重启;

万用表测电压只有 3.0V,并未低于 MCU 的最低工作电压。**

很多工程师的排查方向是:

  1. 电源纹波太大?

  2. 去耦电容不够?

  3. 看门狗超时?


二、原理分析

1. 物理模型

MCU 内部有一个电压监控器(Brown-out Reset)。

VDD ──► [BOR Comparator] ──► Reset Logic ^ | BOR Threshold (e.g. 2.8V)

2. 核心参数

  • BOR Threshold(掉电复位阈值):MCU 内部固定的或可编程的电压阈值。

  • Vdrop(跌落深度):负载瞬态引起的电压跌落。

  • dV/dt(跌落斜率):电压下降的速度。

3. 反直觉真相

“最低工作电压 2.7V” ≠ “复位电压 2.7V”。

  • 大多数 MCU 的BOR 阈值高于最低工作电压

  • 例如:

    • STM32:BOR Level 0 = 2.0V(可配置)

    • ESP32:POR = 2.3V ~ 2.8V(典型值)

  • 结果:电压掉到 3.0V,虽然 MCU 还能跑,但 BOR 已经触发复位。


三、工程级解决方案

方案 1:正确配置 BOR 级别(软件解法)

如果你的 MCU 支持可编程 BOR(如 STM32):

// 设置 BOR 阈值为最低(如 2.0V) __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);

注意

降低 BOR 阈值会降低噪声容限,必须在电源纹波极小​ 的情况下使用。

方案 2:增加大容量储能电容(硬件解法)

应对大电流负载瞬态。

Vbat -> [LDO] -> [10uF MLCC] -> [100uF 电解] -> MCU

经验公式:

C ≥ I_load × Δt / ΔV
  • I_load:电机启动峰值电流(如 500mA)

  • Δt:持续时间(如 10ms)

  • ΔV:允许跌落(如 0.3V)

C ≥ 16.6 mF(通常需要钽电容或超级电容)

方案 3:电源斜率控制

在软件中逐步开启大功率负载。

// 错误:直接全速启动电机 Motor_SetSpeed(100); // 正确:缓启动 for (int i = 0; i <= 100; i++) { Motor_SetSpeed(i); delay_ms(10); }

四、选型避坑建议

  1. 不要迷信“低压运行”

    • 虽然 MCU 能在 2.7V 跑,但 Flash 擦写、ADC 精度会严重恶化。

  2. BOR 滞回(Hysteresis)

    • BOR 有滞回电压(如 100mV)。

    • 电压必须回升到 (Threshold + Hysteresis) 以上,复位才会解除。

  3. 复位标志

    • 每次重启后,务必读取复位标志(RCC_CSR / RSTC)。

    • 区分是 POR(上电)、BOR(掉电)还是软件复位。


五、总结 Checklist

  • [ ] 是否查阅了 MCU datasheet 中 BOR/POR 的具体阈值?

  • [ ] BOR 阈值是否高于系统的最低工作电压?

  • [ ] 大电流负载启动时,VDD 跌落是否超过 BOR 阈值?

  • [ ] 是否在重启后读取了复位源标志?


六、写在最后(关注我,少走弯路)

我是 gqqsherry,一个拒绝调包、专注底层逻辑的嵌入式工程师。

MCU 的复位逻辑是“最后的防线”,配置错了,系统就会变成“薛定谔的设备”。

关注我的专栏《嵌入式底层避坑指南》,下一篇我们将深入解析《低功耗模式唤醒后程序跑飞?别只怪时钟,看看 Vcore 与 Flash 等待》

👉下一篇预告:《STOP 模式唤醒后,为什么外设全乱了?》


原创文章,转载请注明出处。