
STM32学习笔记适用平台STM32F103C8T6Cortex-M3内核参考标准STM32F10xxx参考手册RM0008一、前言说实话刚接触STM32的时候我对PWR这个外设完全是视而不见的。心里想电源不就是接上3.3V就完事了吗直到后来做电池供电的项目发现板子跑一天就没电了才开始研究低功耗模式这时候才后悔没早点学PWR。PWRPower Control电源控制这个外设说白了就管两件事监控电压看看你的供电稳不稳不稳就报警管理功耗系统空闲时让STM32睡一会儿省下电来延长续航今天这篇文章我就结合江科大老师的PPT和《STM32F10xxx参考手册》把PWR的知识点从头到尾捋一遍。文章会比较长但我会尽量争取让初学者也能一遍看懂。二、PWR简介STM32的电源大管家PWR模块负责管理STM32内部的电源供电部分主要实现两大功能可编程电压监测器PVD实时监控VDD电源电压当电压异常时触发中断让我们有机会执行紧急保存任务低功耗模式包括睡眠模式Sleep、停机模式Stop和待机模式Standby系统空闲时降低功耗延长设备使用时间我的理解你可以把PWR想象成手机的省电管家。PVD就像低电量提醒低功耗模式就像手机的息屏待机。STM32不像电脑有独立的电源管理芯片PWR就是集成在芯片内部的电源管理单元。三、STM32电源框图解析电都去哪了要理解PWR首先得知道STM32内部是怎么供电的。下面这张图来自参考手册展示了STM32F103的电源分配架构图1STM32F103电源框图来自《STM32F10xxx参考手册》图4从框图里可以看到STM32内部把电源分成了四个供电区域3.1 VDDA供电区域模拟供电供电对象A/D转换器ADC、温度传感器、复位模块、PLL锁相环特点模拟电路对电源噪声敏感所以VDDA要单独供电并且通过VREF和VREF-提供参考电压注意VREF范围是2.4V~VDDAVSSA和VDD必须分别联到VSS和VDD3.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)波形图来自参考手册图54.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低于这个阈值时触发中断。图3PVD门限与迟滞示意图来自参考手册图65.1 PVD的工作原理PVD可以监控VDD电源电压我们可以编程设置一个PVD阈值通过PWR_CR寄存器的PLS位选择共有8个档位从2.2V到2.9V当VDD下降到PVD阈值以下或者上升到PVD阈值以上时PVD会触发中断PVD也有100mV的迟滞防止电压在阈值附近抖动导致中断频繁触发5.2 PVD能干什么PVD触发的是外部中断线16EXTI Line16。当电压不足时我们可以在中断服务函数里执行紧急任务比如保存关键数据到Flash或EEPROM关闭大功率外设记录掉电日志gracefully 地关闭系统我的理解PVD就像手机的低电量模式提醒。手机20%电量提醒你省电PVD就是让你在电压降到某个值之前赶紧把没保存的文档CtrlS一下。这个阈值是可以调的比如你用电池供电可以设2.6V用稳压电源可以设2.4V。六、低功耗模式概述三种睡觉姿势这是PWR模块的重头戏。STM32F103提供了三种低功耗模式省电程度依次递增但唤醒后的恢复代价也依次增大。图4低功耗模式一览表来自参考手册表8模式进入方式唤醒方式对1.8V区域时钟的影响对VDD区域时钟的影响电压调节器睡眠(Sleep-now / Sleep-on-exit)WFI / WFE任一中断 / 唤醒事件CPU时钟关其他时钟和ADC时钟无影响无开停机(Stop)PDDS0和LPDS位 SLEEPDEEP位 WFI/WFE任一外部中断(EXTI)关闭所有1.8V区域的时钟HSI和HSE的振荡器关闭开启0或低功耗1待机(Standby)PDDS1位 SLEEPDEEP位 WFI/WFEWKUP上升沿、RTC闹钟、NRST外部复位、IWDG复位关闭所有1.8V区域的时钟HSI和HSE的振荡器关闭关我的理解这三种模式就像人类的三种休息状态——睡眠模式 打盹眼睛闭着但耳朵还听着随时能醒停机模式 深度睡眠闹钟响了才醒醒来还记得睡前的事待机模式 昏迷需要电击除颤才能醒醒了之后失忆啥都不记得七、低功耗模式的选择逻辑一张图看懂怎么睡图5低功耗模式选择流程图执行WFIWait For Interrupt或WFEWait For Event指令后STM32到底进入哪种低功耗模式由以下几个寄存器位共同决定7.1 第一步SLEEPDEEP位SCB-SCR寄存器SLEEPDEEP 0进入睡眠模式浅睡SLEEPDEEP 1进入深度睡眠模式停机或待机7.2 第二步如果是睡眠模式SLEEPDEEP0由SLEEPONEXIT位决定SLEEPONEXIT 0Sleep-now执行完WFI/WFE后立刻进入睡眠SLEEPONEXIT 1Sleep-on-exit等STM32从最低优先级的中断处理程序中退出时才进入睡眠我的理解Sleep-now就是我现在就要睡Sleep-on-exit就是我把手头这个中断处理完再睡。后者适合中断驱动的程序避免在处理中断时被打断。7.3 第三步如果是深度睡眠SLEEPDEEP1由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的妙用如果你写了一个中断驱动的程序主循环里没事干可以设置SLEEPONEXIT1。这样每次中断处理完后自动进入睡眠有中断来了再唤醒处理处理完又自动睡非常省电。我的理解睡眠模式就像上课偷睡——老师讲课主程序暂停了但你的耳朵NVIC中断还竖着老师点你名中断来了你立刻就醒了而且还记得睡前讲到哪了程序继续执行。这是最常用的低功耗模式因为唤醒快、不丢数据。九、停止模式详解中度冬眠9.1 进入方式需要配置PDDS 0选择停机不是待机SLEEPDEEP 1可选设置LPDS位执行WFI或WFE9.2 核心特点1.8V供电区域的所有时钟都被停止PLL、HSI和HSE被禁止高速时钟全关了SRAM和寄存器内容被保留醒来还记得事所有I/O引脚保持运行模式时的状态电压调节器可配置为开启或低功耗模式9.3 唤醒方式WFI进入可被任意一个EXTI外部中断唤醒WFE进入可被任意一个EXTI事件唤醒9.4 唤醒后的重要注意事项当退出停止模式时HSI8MHz内部高速时钟会被自动选为系统时钟这意味着如果你之前用HSEPLL跑在72MHz唤醒后系统时钟变成了8MHz必须在唤醒后重新配置系统时钟恢复到72MHz9.5 LPDS位的影响LPDS 0电压调节器正常开启唤醒快但停机时功耗约24μALPDS 1电压调节器低功耗模式停机时功耗约14μA但唤醒有额外启动延时我的理解停止模式就像冬天动物的冬眠——心跳高速时钟停了但记忆SRAM还在。醒来的时候身体很虚需要先缓一缓HSI默认启动然后再慢慢恢复到满血状态重新配PLL。如果你忘了重新配时钟就会以为芯片变卡了其实它只是在用8MHz跑。十、待机模式详解最彻底的关机10.1 进入方式需要配置PDDS 1选择待机SLEEPDEEP 1执行WFI或WFE10.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振荡器上电就能用不需要等晶振起振。如果唤醒后直接用HSEPLL得等晶振稳定唤醒时间会更长。所以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闪烁变慢了串口波特率也不对了。原因停止模式唤醒后系统时钟自动切换为HSI8MHz而之前配置的是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可编程阈值监测VDD100mV迟滞触发EXTI Line16中断PLS[2:0]选择8档阈值睡眠模式CPU停外设不停I/O保持任意NVIC中断/事件唤醒SLEEPDEEP0SLEEPONEXIT选择时机停止模式1.8V时钟全停PLL/HSI/HSE禁SRAM保留EXTI唤醒SLEEPDEEP1, PDDS0, LPDS选调节器模式待机模式1.8V断电SRAM丢失I/O浮空程序从头跑SLEEPDEEP1, PDDS1停止唤醒注意唤醒后时钟自动切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实时时钟详解如果本文对你有帮助欢迎点赞 收藏 ⭐ 有任何问题欢迎在评论区交流一起学习进步