
STM32学习笔记

适用平台:STM32F103C8T6(Cortex-M3内核) 参考标准:STM32F10xxx参考手册(RM0008)
一、前言
说实话,刚接触STM32的时候,我对PWR这个外设完全是"视而不见"的。心里想:电源不就是接上3.3V就完事了吗?直到后来做电池供电的项目,发现板子跑一天就没电了,才开始研究低功耗模式,这时候才后悔没早点学PWR。
PWR(Power Control,电源控制)这个外设,说白了就管两件事:
监控电压:看看你的供电稳不稳,不稳就报警
管理功耗:系统空闲时让STM32"睡一会儿",省下电来延长续航
今天这篇文章,我就结合江科大老师的PPT和《STM32F10xxx参考手册》,把PWR的知识点从头到尾捋一遍。文章会比较长,但我会尽量争取让初学者也能一遍看懂。
二、PWR简介:STM32的"电源大管家"
PWR模块负责管理STM32内部的电源供电部分,主要实现两大功能:
-
可编程电压监测器(PVD):实时监控VDD电源电压,当电压异常时触发中断,让我们有机会执行紧急保存任务
-
低功耗模式:包括睡眠模式(Sleep)、停机模式(Stop)和待机模式(Standby),系统空闲时降低功耗,延长设备使用时间
我的理解:你可以把PWR想象成手机的"省电管家"。PVD就像低电量提醒,低功耗模式就像手机的息屏待机。STM32不像电脑有独立的电源管理芯片,PWR就是集成在芯片内部的电源管理单元。
三、STM32电源框图解析:电都去哪了?
要理解PWR,首先得知道STM32内部是怎么供电的。下面这张图来自参考手册,展示了STM32F103的电源分配架构:

图1:STM32F103电源框图(来自《STM32F10xxx参考手册》图4)
从框图里可以看到,STM32内部把电源分成了四个供电区域:
3.1 VDDA供电区域(模拟供电)
-
供电对象:A/D转换器(ADC)、温度传感器、复位模块、PLL锁相环
-
特点:模拟电路对电源噪声敏感,所以VDDA要单独供电,并且通过VREF+和VREF-提供参考电压
-
注意:VREF+范围是2.4V~VDDA,VSSA和VDD必须分别联到VSS和VDD
3.2 VDD供电区域(数字供电)
-
供电对象:I/O电路、待机电路(唤醒逻辑、IWDG独立看门狗)、电压调节器
-
特点:这是数字电路的主供电区域
3.3 1.8V供电区域(内核供电)
-
供电对象:CPU核心、存储器(SRAM/Flash)、内置数字外设
-
特点:这个区域的电不是直接从外部引脚来的,而是由电压调节器把VDD降压到1.8V供给的。你可以理解为:外部供3.3V,但CPU内核只吃1.8V的"细粮"
3.4 后备供电区域(Backup Domain)
-
供电对象:LSE 32.768KHz晶体振荡器、后备寄存器、RCC BDCR寄存器、RTC实时时钟
-
特点:这个区域比较特殊,它可以通过VBAT引脚接纽扣电池供电。也就是说,即使主电源VDD断电,只要VBAT有电,RTC和后备寄存器的数据就不会丢
我的理解:这四个区域就像一栋大楼的四套供电系统。VDDA是精密实验室的专用电源(怕干扰),1.8V区域是核心机房的UPS电源(最重要),VDD是普通办公区电源,VBAT是应急照明电源(主电源断了也能工作)。
四、上电复位与掉电复位:芯片的"保险丝"(了解即可)
STM32内部集成了一个上电复位(POR)和掉电复位(PDR)电路,这是芯片自带的"保险丝",不需要我们配置。

图2:上电复位(POR)与掉电复位(PDR)波形图(来自参考手册图5)
4.1 上电复位(POR)
当你给STM32上电时,VDD从0V慢慢上升到3.3V。当电压上升到POR阈值时,芯片解除复位,开始正常工作。在电压达到POR阈值之前,芯片一直处于复位状态,防止"半死不活"的电压导致程序跑飞。
4.2 掉电复位(PDR)
当VDD电压下降时,芯片不会立刻复位,而是要降到PDR阈值以下才复位。POR阈值比PDR阈值高大约40mV,这个差值叫做迟滞(Hysteresis)。
4.3 为什么要设计40mV迟滞?
想象一下,如果POR和PDR阈值一样,电源电压在阈值附近波动时,芯片会反复复位-启动-复位-启动,陷入"抽风"状态。40mV的迟滞就像给复位电路加了一个"防抖",电压必须掉到一定程度才复位,必须升到一定程度才启动,避免了这种抖动。
我的理解:这就像我们设定的空调温度。如果你设26度开机、26度关机,空调会频繁启停。所以实际都是26度开机、25度关机(或者反过来),有个回差。STM32的POR/PDR也是这个原理。
五、可编程电压监测器(PVD):自定义的"低电量提醒"
POR和PDR是芯片自动管理的,阈值固定,我们干预不了。但STM32还提供了一个可编程电压监测器(PVD),让我们可以自定义一个电压阈值,当VDD低于这个阈值时触发中断。

图3:PVD门限与迟滞示意图(来自参考手册图6)
5.1 PVD的工作原理
-
PVD可以监控VDD电源电压
-
我们可以编程设置一个PVD阈值(通过PWR_CR寄存器的PLS位选择,共有8个档位,从2.2V到2.9V)
-
当VDD下降到PVD阈值以下,或者上升到PVD阈值以上时,PVD会触发中断
-
PVD也有100mV的迟滞,防止电压在阈值附近抖动导致中断频繁触发
5.2 PVD能干什么?
PVD触发的是外部中断线16(EXTI Line16)。当电压不足时,我们可以在中断服务函数里执行紧急任务,比如:
-
保存关键数据到Flash或EEPROM
-
关闭大功率外设
-
记录掉电日志
-
gracefully 地关闭系统
我的理解:PVD就像手机的"低电量模式"提醒。手机20%电量提醒你省电,PVD就是让你在电压降到某个值之前,赶紧把没保存的文档Ctrl+S一下。这个阈值是可以调的,比如你用电池供电,可以设2.6V;用稳压电源,可以设2.4V。
六、低功耗模式概述:三种"睡觉"姿势
这是PWR模块的重头戏。STM32F103提供了三种低功耗模式,省电程度依次递增,但唤醒后的恢复代价也依次增大。

图4:低功耗模式一览表(来自参考手册表8)
| 睡眠 (Sleep-now / Sleep-on-exit) | WFI / WFE | 任一中断 / 唤醒事件 | CPU时钟关,其他时钟和ADC时钟无影响 | 无 | 开 |
| 停机 (Stop) | PDDS(0)和LPDS位 + SLEEPDEEP位 + WFI/WFE | 任一外部中断(EXTI) | 关闭所有1.8V区域的时钟 | HSI和HSE的振荡器关闭 | 开启(0)或低功耗(1) |
| 待机 (Standby) | PDDS(1)位 + SLEEPDEEP位 + WFI/WFE | WKUP上升沿、RTC闹钟、NRST外部复位、IWDG复位 | 关闭所有1.8V区域的时钟 | HSI和HSE的振荡器关闭 | 关 |
我的理解:这三种模式就像人类的三种休息状态——
-
睡眠模式 = 打盹(眼睛闭着,但耳朵还听着,随时能醒)
-
停机模式 = 深度睡眠(闹钟响了才醒,醒来还记得睡前的事)
-
待机模式 = 昏迷(需要电击除颤才能醒,醒了之后失忆,啥都不记得)
七、低功耗模式的选择逻辑:一张图看懂怎么"睡"

图5:低功耗模式选择流程图
执行WFI(Wait For Interrupt)或WFE(Wait For Event)指令后,STM32到底进入哪种低功耗模式,由以下几个寄存器位共同决定:
7.1 第一步:SLEEPDEEP位(SCB->SCR寄存器)
-
SLEEPDEEP = 0:进入睡眠模式(浅睡)
-
SLEEPDEEP = 1:进入深度睡眠模式(停机或待机)
7.2 第二步:如果是睡眠模式(SLEEPDEEP=0)
由SLEEPONEXIT位决定:
-
SLEEPONEXIT = 0(Sleep-now):执行完WFI/WFE后立刻进入睡眠
-
SLEEPONEXIT = 1(Sleep-on-exit):等STM32从最低优先级的中断处理程序中退出时才进入睡眠
我的理解:Sleep-now就是"我现在就要睡",Sleep-on-exit就是"我把手头这个中断处理完再睡"。后者适合中断驱动的程序,避免在处理中断时被打断。
7.3 第三步:如果是深度睡眠(SLEEPDEEP=1)
由PDDS位(PWR_CR寄存器)决定:
-
PDDS = 0:进入停机模式
-
PDDS = 1:进入待机模式
7.4 第四步:停机模式下的电压调节器
如果进入停机模式,还可以由LPDS位(PWR_CR寄存器)决定电压调节器状态:
-
LPDS = 0:电压调节器开启(唤醒快,但功耗稍高)
-
LPDS = 1:电压调节器进入低功耗模式(功耗更低,但唤醒有额外延时)
八、睡眠模式详解:最轻度的"打盹"
8.1 进入方式
执行WFI或WFE指令后进入。
8.2 核心特点
-
程序暂停运行,唤醒后从暂停的地方继续运行
-
CPU时钟关闭,但其他外设时钟和ADC时钟不受影响
-
所有I/O引脚保持运行模式时的状态
-
电压调节器保持开启
8.3 唤醒方式
-
WFI进入:可被任意一个NVIC响应的中断唤醒
-
WFE进入:可被唤醒事件唤醒
8.4 SLEEPONEXIT的妙用
如果你写了一个中断驱动的程序,主循环里没事干,可以设置SLEEPONEXIT=1。这样每次中断处理完后自动进入睡眠,有中断来了再唤醒处理,处理完又自动睡,非常省电。
我的理解:睡眠模式就像上课偷睡——老师讲课(主程序)暂停了,但你的耳朵(NVIC中断)还竖着,老师点你名(中断来了)你立刻就醒了,而且还记得睡前讲到哪了(程序继续执行)。这是最常用的低功耗模式,因为唤醒快、不丢数据。
九、停止模式详解:中度"冬眠"
9.1 进入方式
需要配置:
PDDS = 0(选择停机,不是待机)
SLEEPDEEP = 1
可选设置LPDS位
执行WFI或WFE
9.2 核心特点
-
1.8V供电区域的所有时钟都被停止
-
PLL、HSI和HSE被禁止(高速时钟全关了)
-
SRAM和寄存器内容被保留(醒来还记得事)
-
所有I/O引脚保持运行模式时的状态
-
电压调节器可配置为开启或低功耗模式
9.3 唤醒方式
-
WFI进入:可被任意一个EXTI外部中断唤醒
-
WFE进入:可被任意一个EXTI事件唤醒
9.4 唤醒后的重要注意事项
当退出停止模式时,HSI(8MHz内部高速时钟)会被自动选为系统时钟!这意味着:
-
如果你之前用HSE+PLL跑在72MHz,唤醒后系统时钟变成了8MHz
-
必须在唤醒后重新配置系统时钟,恢复到72MHz
9.5 LPDS位的影响
-
LPDS = 0:电压调节器正常开启,唤醒快,但停机时功耗约24μA
-
LPDS = 1:电压调节器低功耗模式,停机时功耗约14μA,但唤醒有额外启动延时
我的理解:停止模式就像冬天动物的冬眠——心跳(高速时钟)停了,但记忆(SRAM)还在。醒来的时候身体很虚,需要先缓一缓(HSI默认启动),然后再慢慢恢复到满血状态(重新配PLL)。如果你忘了重新配时钟,就会以为芯片变"卡"了,其实它只是在用8MHz跑。
十、待机模式详解:最彻底的"关机"
10.1 进入方式
需要配置:
PDDS = 1(选择待机)
SLEEPDEEP = 1
执行WFI或WFE
10.2 核心特点(重点!)
-
整个1.8V供电区域被断电
-
PLL、HSI和HSE也被断电
-
SRAM和寄存器内容全部丢失(醒来失忆了)
-
只有备份寄存器和待机电路维持供电
-
所有I/O引脚变为高阻态(浮空输入)
-
电压调节器关闭
10.3 唤醒方式(非常有限!)
-
WKUP引脚(PA0)的上升沿
-
RTC闹钟事件的上升沿
-
NRST引脚上的外部复位
-
IWDG独立看门狗复位
10.4 唤醒后的行为
待机模式唤醒后,程序从头开始运行(从main函数开始)!因为SRAM都丢了,之前的数据全没了。
10.5 待机模式的应用场景
-
电池供电设备长时间不用时彻底断电
-
通过RTC定时唤醒采集数据(比如每小时醒一次,采集完又待机)
-
按键唤醒(WKUP引脚)
我的理解:待机模式就像电脑关机——按电源键(WKUP/NRST)重新开机,之前的程序全没了,系统从头启动。它的功耗最低(约2μA),但代价最大。用待机模式之前一定要想清楚:我有没有数据需要保存?因为醒来之后RAM里啥都没了,只有备份寄存器和RTC还存着。
十一、个人理解 / 学习心得
11.1 三种模式怎么选?
通过这段时间的学习,我总结了一个选择低功耗模式的"傻瓜公式":
| 想省电,但要求中断来了立刻响应,程序不能从头跑 | 睡眠模式 |
| 想大幅省电,程序能接着跑,可以用EXTI唤醒 | 停机模式 |
| 想极致省电,能接受程序从头跑,有RTC或按键唤醒 | 待机模式 |
11.2 关于停止模式唤醒后时钟的坑
江科大老师在视频里特别强调过,停止模式唤醒后时钟会变成HSI 8MHz。我的理解是:STM32设计成这样是为了快速唤醒——HSI是内部RC振荡器,上电就能用,不需要等晶振起振。如果唤醒后直接用HSE+PLL,得等晶振稳定,唤醒时间会更长。所以ST选择了"先让芯片活过来(HSI),再慢慢恢复到满血(PLL)"的策略。
11.3 PVD的实际意义
刚开始我觉得PVD很鸡肋——都有POR/PDR了,还要PVD干嘛?后来想明白了:POR/PDR是"救死"的(电压太低就复位,防止芯片跑飞),PVD是"扶伤"的(电压不太低但有点危险时提醒你)。就像医院的ICU和普通病房,POR/PDR是急救,PVD是预警。
11.4 电源框图给我的启发
看了电源框图我才明白,为什么ADC采集的时候数据总是跳——原来VDDA和VDD虽然理论上要接在一起,但如果布线不好,模拟电源被数字电路干扰了,ADC就不准。以后画板子一定要把VDDA和VSSA单独走线,靠近芯片处用磁珠或0Ω电阻连接。
十二、踩坑记录
⚠️ 以下内容为踩坑记录,都是血泪教训
❌ 坑1:停止模式唤醒后忘记重新配置系统时钟
现象:进入停止模式后,用按键EXTI唤醒,发现LED闪烁变慢了,串口波特率也不对了。
原因:停止模式唤醒后,系统时钟自动切换为HSI(8MHz),而之前配置的是HSE 8MHz + PLL 9倍频 = 72MHz。所有依赖系统时钟的外设(USART、TIM等)都跟着变慢了。
解决:在唤醒中断里调用系统时钟配置函数,重新设置PLL。
❌ 坑2:待机模式唤醒后程序从头跑,以为芯片复位了
现象:设置待机模式后,用RTC闹钟唤醒,发现变量全清零了,以为芯片异常复位。
原因:待机模式1.8V区域断电,SRAM数据丢失,唤醒相当于一次"软复位",程序从main重新开始。
解决:需要保存的数据提前写入备份寄存器(BKP)或Flash。唤醒后通过判断PWR_CSR的SBF位(待机标志)和WUF位(唤醒标志)来区分是正常上电还是待机唤醒。
十三、总结表格
最后,我把今天讲的知识点整理成一张大表格,方便大家复习查阅:
| PWR功能 | 电源管理:PVD电压监测 + 三种低功耗模式 | – |
| 供电区域 | VDDA(模拟)、VDD(数字)、1.8V(内核)、VBAT(后备) | 电压调节器降压供1.8V区域 |
| POR/PDR | 上电/掉电自动复位,40mV迟滞防抖动 | tRSTTEMPO滞后时间 |
| PVD | 可编程阈值监测VDD,100mV迟滞,触发EXTI Line16中断 | PLS[2:0]选择8档阈值 |
| 睡眠模式 | CPU停,外设不停,I/O保持,任意NVIC中断/事件唤醒 | SLEEPDEEP=0,SLEEPONEXIT选择时机 |
| 停止模式 | 1.8V时钟全停,PLL/HSI/HSE禁,SRAM保留,EXTI唤醒 | SLEEPDEEP=1, PDDS=0, LPDS选调节器模式 |
| 待机模式 | 1.8V断电,SRAM丢失,I/O浮空,程序从头跑 | SLEEPDEEP=1, PDDS=1 |
| 停止唤醒注意 | 唤醒后时钟自动切HSI 8MHz,需手动恢复72MHz | 重新配置RCC |
| 待机唤醒注意 | 只有WKUP、RTC闹钟、NRST、IWDG四种方式 | PWR_CSR的SBF/WUF标志判断 |
十四、结语
写这篇文章的时候,我把江科大的视频又回顾了一遍,同时对照参考手册逐条核对。以前觉得PWR就是"睡眠、停机、待机"六个字,真正深入下去才发现,光是"唤醒后时钟怎么变"这个细节,就藏着很多设计上的考量。
STM32的电源管理设计得非常精巧——POR/PDR保安全、PVD做预警、三种低功耗模式覆盖不同场景。理解这些机制,不仅能帮我们写出更省电的代码,也能让我们对嵌入式系统的电源架构有更深的认识。
如果你也在学STM32,建议一定要动手试试这三种低功耗模式,用万用表测一下各模式下的电流消耗,那种"眼见为实"的感觉和看PPT是完全不一样的。
📌 开发环境:Keil5 + STM32F103C8T6最小系统板 + ST-Link 📌 参考资料:江科大STM32入门教程、《STM32F10xxx参考手册》 📌 前置文章:STM32入门教程:BKP备份寄存器 & RTC实时时钟详解
如果本文对你有帮助,欢迎点赞 👍 收藏 ⭐ !有任何问题欢迎在评论区交流,一起学习进步!

网硕互联帮助中心


评论前必须登录!
注册