云计算百科
云计算领域专业知识百科平台

江科大STM32入门:PWR电源控制详解——从电源框图到低功耗模式

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)

    模式进入方式唤醒方式对1.8V区域时钟的影响对VDD区域时钟的影响电压调节器
    睡眠 (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实时时钟详解

    如果本文对你有帮助,欢迎点赞 👍 收藏 ⭐ !有任何问题欢迎在评论区交流,一起学习进步!

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 江科大STM32入门:PWR电源控制详解——从电源框图到低功耗模式
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!