带你了解STM32:PWR电源控制
目录
1.PWR简介
2.电源框图
3.上电复位和掉电复位
4.可编程电压监测器(PVD)
5.低功耗模式
6.模式选择
7.睡眠模式
8.停止模式
9.待机模式
10.修改主频代码(下载代码时要按住复位键)
第一步:按图接线到面包板
第二步:复制OLED显示屏功能
system文件两个函数和一个变量的解读:
配置时钟为72MHz的流程(具体函数用途,进入system文件看注释)
解除文件只读的方法
第三步:修改主频,将system_stm32f10x.c只读解锁,进入修改主频
第四步:主函数中用OLED显示屏,显示SystemCoreClock variable变量,因为这个变量是显示主频的,但是主频一般不修改,因为很多的代码都是以72MHz来修改主频的
修改主频完整代码
11.睡眠模式+串口+接收代码(下载代码时要按住复位键)
第一步:按图接线到面包板
第二步:复制串口+接收的工程,假设要用这个STM32做一个下位机,下位机接收电脑串口发过来的指令,然后执行相应的功能,所以这个下位机,就要时时刻刻,都要在等待,但是这样太费电了,所以加入一个睡眠模式
第三步:在主函数增加睡眠模式代码
睡眠模式+串口+接收完整代码
12.停止模式+对射式红外传感器计次代码(下载代码时要按住复位键)
第一步:按图接线到面包板
第二步:复制对射式红外传感器计次代码,停止模式涉及到了PWR外设
PWR外设相关库函数
第三步:在主函数启动停止模式,如果有时候遮挡数值没有加,是因为模块信号有些抖动在中断函数里有给if判断过滤掉了这个计数信号部分批次的模块和芯片但是会有信号抖动这个问题抖动信号暂时不用多管Running闪烁就戴白哦唤醒了
停止模式+对射式红外传感器计次完整代码
13.待机模式+实时时钟代码(下载代码时要按住复位键)
第一步:按图接线到面包板
第二步:复制实时时钟的代码
第三步:在主函数中,1.设置RTC闹钟;2.进入待机模式;3.使用闹钟信号,唤醒待机模式
待机模式+实时时钟完整代码
14.PWR外设相关库函数
1.PWR简介
PWR(Power Control)电源控制
PWR负责管理STM32内部的电源供电部分,可以实现
可编程电压监测器和低功耗模式的功能可编程电压监测器(PVD)可以监控VDD电源电压,当VDD下降到PVD阀值以下或上升到PVD阀值之上时,PVD会触发中断,用于执行紧急关闭任务
低功耗模式包括睡眠模式(Sleep)、停机模式(Stop)和待机模式(Standby),可在系统空闲时,降低STM32的功耗,延长设备使用时间
2.电源框图
VDDA供电区域:主要负责模拟部分的供电,其中包括AD转换器、温度传感器、复位模块、PLL锁相环,这些电路的供电正极是VDDA,负极是VSSA,其中AD转化器,还有两根参考电压的供电脚,VREF+、VREF-,这两个引脚在在引脚多的型号会单独引出来,在引脚少的型号会和VDDA和VSSA连接,用于逐次逼近得到模拟电压
数字部分供电:两部分组成,左边部分是VDD供电区域,其中包括I/O电路、待机电路(唤醒逻辑、独立看门狗)右边部分是VDD通过电压调节器,降压到1.8V,提供1.8V供电区域,包括CPU核心、存储器、内置数字外设
VBAT后备供电区域:包括LSE 32K晶体振荡器、后备寄存器、RCC BDCR寄存器(是RCC的寄存器,叫备份域控制寄存器)、RTC
低电压检测器:VDD有电时,由VDD供电,VDD没电时,由VBAT供电
3.上电复位和掉电复位
当VDD或者VDDA电压过低时,内部电路直接产生复位,让STM32复位住,不要乱操作,复位和不复位之间,设置了一个40mV迟滞电压,大于上限POR时解除复位,小于下限PDR时复位。POR和PDR,滞后时间看参考手册
4.可编程电压监测器(PVD)
工作流程与上电复位和掉电复位的工作流程流程差不多,都是检测VDD和VDDA的供电电压,但是PVD的区别就是阈值电压可以用程序指定,参考手册可以了解取值范围,PVD使用要配置外部中断
5.低功耗模式
睡眠->停机->待机,从上到下,关闭电路越来越多,也越来越难唤醒
关闭电路,通常有两个做法,1.关闭时钟;2.关闭电源;关闭了电压调节器,1.8V区域也会关闭
停机:SLEEPDEEP位设置为1,PDDS(区分停机模式还是待机模式,置0停机模式,置1待机模式),LPDS位(设置电压调节器,置0开启,置1进入低功耗模式),然后调用WFI(外部中断的中断模式唤醒)或WFE(外部中断的事件模式唤醒)进入停机模式。唤醒,比如PVD、RTC闹钟、USB唤醒、ETH唤醒
待机:SLEEPDEEP位设置为1,PDDS(区分停机模式还是待机模式,置0停机模式,置1待机模式)然后调用WFI(外部中断的中断模式唤醒)或WFE(外部中断的事件模式唤醒)进入停机模式。只有图中指定条件才能唤醒
6.模式选择
执行WFI(Wait For Interrupt)或者WFE(Wait For Event)指令后,STM32进入低功耗模式
7.睡眠模式
执行完WFI/WFE指令后,STM32进入睡眠模式,程序暂停运行,唤醒后程序从暂停的地方继续运行
SLEEPONEXIT位决定STM32执行完WFI或WFE后,是立刻进入睡眠,还是等STM32从最低优先级的中断处理程序中退出时进入睡眠
在睡眠模式下,所有的I/O引脚都保持它们在运行模式时的状态
WFI指令进入睡眠模式,可被任意一个NVIC响应的中断唤醒
WFE指令进入睡眠模式,可被唤醒事件(看手册,比较麻烦,一般使用中断唤醒)唤醒
8.停止模式
执行完WFI/WFE指令后,STM32进入停止模式,程序暂停运行,唤醒后程序从暂停的地方继续运行
1.8V供电区域的所有时钟都被停止,PLL、HSI和HSE被禁止,SRAM和寄存器内容被保留下来
在停止模式下,所有的I/O引脚都保持它们在运行模式时的状态
当一个中断或唤醒事件导致退出停止模式时,HSI被选为系统时钟
注意:因为,默认在Systemlnit函数里的配置,是使用HSE外部高速时钟,通过PLL倍率,得到72MHz主频,但是,启动停止模式后,PLL和HSE都停止了,退出停止模式不会再自动开启PLL和HSE,而是默认使用HSI的8MHz,直接作为主频,所以停止模式唤醒后,要立刻重新启动HSE,配置主频为72MHz,再次都用Systemlnit函数即可
当电压调节器处于低功耗模式下,系统从停止模式退出时,会有一段额外的启动延时
WFI指令进入停止模式,可被任意一个EXTI中断唤醒
WFE指令进入停止模式,可被任意一个EXTI事件唤醒
9.待机模式
执行完WFI/WFE指令后,STM32进入待机模式,唤醒后程序从头开始运行
整个1.8V供电区域被断电,PLL、HSI和HSE也被断电,SRAM和寄存器内容丢失,只有备份的寄存器和待机电路维持供电
在待机模式下,所有的I/O引脚变为高阻态(浮空输入)
WKUP引脚的上升沿、RTC闹钟事件的上升沿、NRST引脚上外部复位、IWDG复位退出待机模式
10.修改主频代码(下载代码时要按住复位键)
第一步:按图接线到面包板
第二步:复制OLED显示屏功能
system文件两个函数和一个变量的解读:
system这两个文件,提供了外部可调用的函数和一个外部可调用的变量,两个函数是Systemlnit()和SystemCoreClockUpdate(),外部可调用的变量是SystemCoreClock variable
第一个函数Systemlnit():配置时钟树的,使用HSE配置主频为72MHz就是这个函数干的,并且这个函数,在复位后,执行main函数之前,在启动文件里自动调用,所以main函数一进来,时钟就配置好了
变量SystemCoreClock variable,表示主频频率的值,想知道目前的主频是多少,直接显示这个变量即可
第二个函数SystemCoreClockUpdate():更新变量SystemCoreClock variable用的,因为这个变量只要最开始的一次赋值,之后如果改变了主频频率,这个值不会自动变换,就需要调用这个函数,根据当前时钟树的配置更新这个变量
配置时钟为72MHz的流程(具体函数用途,进入system文件看注释)
解除文件只读的方法
第三步:修改主频,将system_stm32f10x.c只读解锁,进入修改主频
第四步:主函数中用OLED显示屏,显示SystemCoreClock variable变量,因为这个变量是显示主频的,但是主频一般不修改,因为很多的代码都是以72MHz来修改主频的
修改主频完整代码
11.睡眠模式+串口+接收代码(下载代码时要按住复位键)
第一步:按图接线到面包板
第二步:复制串口+接收的工程,假设要用这个STM32做一个下位机,下位机接收电脑串口发过来的指令,然后执行相应的功能,所以这个下位机,就要时时刻刻,都要在等待,但是这样太费电了,所以加入一个睡眠模式
第三步:在主函数增加睡眠模式代码
睡眠模式+串口+接收完整代码
12.停止模式+对射式红外传感器计次代码(下载代码时要按住复位键)
第一步:按图接线到面包板
第二步:复制对射式红外传感器计次代码,停止模式涉及到了PWR外设
PWR外设相关库函数
恢复缺省配置
使能后备区域的访问
PVD相关函数,第一个函数使能PVD功能,第二个函数配置PVD的阈值电压
使能位于PA0位置的WKUP引脚
进入停止模式
进入待机模式
获取标志位、清除标志位
第三步:在主函数启动停止模式,如果有时候遮挡数值没有加,是因为模块信号有些抖动在中断函数里有给if判断过滤掉了这个计数信号部分批次的模块和芯片但是会有信号抖动这个问题抖动信号暂时不用多管Running闪烁就戴白哦唤醒了
停止模式+对射式红外传感器计次完整代码
13.待机模式+实时时钟代码(下载代码时要按住复位键)
第一步:按图接线到面包板
第二步:复制实时时钟的代码
第三步:在主函数中,1.设置RTC闹钟;2.进入待机模式;3.使用闹钟信号,唤醒待机模式
说明为什么PWR的时钟在MyRTC模块里开启了,在主函数里面还要再开启一次,如果主函数中不加入PWR时钟开启代码,待机模式的代码就会对MyRTC模块里的代码具有依赖性,增大代码之间的耦合性,没有RTC,待机模式就不会正常工作,如果修改了这个工程的功能,不需要MyRTC模块了,待机模式就不会工作了,这是一个隐性BUG
如果唤醒后ALRF没有置1,不必纠结,能唤醒就没问题
在进入待机模式之前要把所有外设都关闭,就是在待机模式代码前关闭所有外设
待机模式+实时时钟完整代码
14.PWR外设相关库函数
恢复缺省配置
使能后备区域的访问
PVD相关函数,第一个函数使能PVD功能,第二个函数配置PVD的阈值电压
使能位于PA0位置的WKUP引脚
进入停止模式
进入待机模式
获取标志位、清除标志位