第2章 STM32电源系统详解

做低功耗调优,第一件事就是搞清楚芯片怎么“吃电”。

STM32的电源架构,说白了就是几个供电引脚加一个内部电压调节器。我刚开始做低功耗项目时,总觉得这部分是硬件工程师的事。直到有一次,板子休眠电流死活降不下来,查了三天才发现是VREF+引脚没处理好。

嗯,从那以后,我每次画板子都会先翻一遍电源框图。

2.1 STM32供电架构

先看引脚。STM32的供电引脚分四类,各有各的活。

引脚 供电对象 典型电压 我的经验
VDD 核心逻辑、I/O、内部LDO 1.8V ~ 3.6V 主供电,电流最大
VDDA ADC、DAC、复位电路、PLL 与VDD相同或略高 模拟电路对噪声敏感
VREF+ ADC/DAC参考电压 1.8V ~ VDDA 很多人忽略这个引脚
VBAT RTC、备份寄存器 1.65V ~ 3.6V 主电源掉电时靠它

你想想看,VDD和VDDA如果分开供电,能有效隔离数字噪声。我在一个工业采集项目中,ADC读数一直跳,后来把VDDA单独用LDO供电,问题就解决了。

注意:VREF+不能悬空!我曾经见过一块板子,VREF+没接,ADC结果全乱套。如果你不用ADC,也要把VREF+接到VDDA上。

2.2 电压调节器:LDO与SMPS

STM32内部有个电压调节器,把外部VDD降到核心电压(通常是1.2V或1.8V)。

主流方案有两种:LDO和SMPS。

  • LDO(低压差线性稳压器):简单、噪声低、成本低。但效率也低——输入3.3V输出1.2V,效率只有36%。
  • SMPS(开关模式电源):效率高(80%~90%),但外围需要电感和电容,PCB面积大。

我个人习惯:电池供电项目优先选SMPS。记得有个穿戴设备,用LDO时待机电流2mA,换成SMPS后降到0.5mA,续航直接翻倍。

关键点:STM32L4/L5系列支持内部SMPS,不需要外挂电感。选型时可以留意一下。

2.3 电源管理单元(PMU)

PMU是STM32的“电闸总控”。它控制着各个电源域的开关和电压等级。

说白了,PMU就是一套硬件状态机,管理芯片在运行、睡眠、停止、待机等模式下的供电策略。

STM32 PMU 电源状态切换图 运行模式 Vcore全开 睡眠模式 CPU时钟停 停止模式 Vcore降频 待机模式 Vcore断电 唤醒事件 说明 • 运行→睡眠:关CPU时钟 • 睡眠→停止:降Vcore电压 • 停止→待机:完全断电

PMU的核心能力是动态电压调节(DVS)。在运行模式下,你可以通过编程选择不同的电压等级(Range 1、Range 2等)。

小技巧:在不需要高性能时,把电压降到Range 2,功耗能降30%~50%。我习惯在任务切换时动态调整电压,而不是一直跑在最高档。

2.4 电源域划分

STM32把芯片内部划分为多个电源域。每个域可以独立开关。

  • VDD域:CPU、Flash、SRAM、大部分外设。这是主域。
  • VDDA域:ADC、DAC、PLL、温度传感器。模拟专用。
  • 备份域:RTC、备份寄存器、32K晶振。由VBAT供电。

为什么要分域?因为你可以只关掉不用的部分。比如在待机模式下,VDD域完全断电,但备份域还在跑RTC。

我曾经犯过一个错:待机时忘了关ADC的时钟,结果备份域电流多了20μA。后来在初始化里加了一行__HAL_RCC_ADC_CLK_DISABLE(),电流就正常了。

2.5 实战:测量各电源域电流

调优的第一步是测量。我推荐用这种方法:

  1. 在VDD回路串一个10Ω采样电阻
  2. 用示波器测电阻两端压降
  3. 根据I = U/R计算瞬时电流
  4. 用万用表测平均电流

注意:测量待机电流时,要把示波器探头调到1mV/div档位。我见过有人用10V/div档测微安级电流,结果什么都看不到。

核心结论:STM32的电源系统并不复杂,但每个引脚、每个域、每个模式都有讲究。搞懂了这些,低功耗调优就成功了一半。