提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
像汽车钥匙,遥控器,电子密码锁等以及含有定时开关机等功能的电路,都需要做到不工作时进入省电模式来减少电池的消耗。为此,STM32推出了可以低功耗运行的电源控制模块。PWR;
PWR负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能
一、PWR是什么?PWR的电路?PWR的模式?
一、PWR简介
1、PWR(Power Control)电源控制
(1)PWR负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能
(2)可编程电压监测器(PVD)可以监控VDD电源电压,当VDD下降到PVD阀值以下或上升到PVD阀值之上时,PVD会触发中断,用于执行紧急关闭任务
(3)低功耗模式包括睡眠模式(Sleep)、停机模式(Stop)和待机模式(Standby),可在系统空闲时,降低STM32的功耗,延长设备使用时间
PVD是来检测2.9V~2.2V左右的电压,可以在这个范围内设置一个警告线,如果低于则触发警告。可以进入中断做一些事情。
上电掉电复位则是提供一个最低的阈值,如果低于这个阈值则复位。
PWR的模式分为睡眠模式,停止模式和待机模式;
睡眠模式
(1)执行完WFI/WFE指令后,STM32进入睡眠模式,程序暂停运行,唤醒后程序从暂停的地方继续运行
(2)SLEEPONEXIT位决定STM32执行完WFI或WFE后,是立刻进入睡眠,还是等STM32从最低优先级的中断处理程序中退出时进入睡眠
(3)在睡眠模式下,所有的I/O引脚都保持它们在运行模式时的状态
(4)WFI指令进入睡眠模式,可被任意一个NVIC响应的中断唤醒
(5)WFE指令进入睡眠模式,可被唤醒事件唤醒
停止模式
(1)执行完WFI/WFE指令后,STM32进入停止模式,程序暂停运行,唤醒后程序从暂停的地方继续运行
(2)1.8V供电区域的所有时钟都被停止,PLL、HSI和HSE被禁止,SRAM和寄存器内容被保留下来
(3)在停止模式下,所有的I/O引脚都保持它们在运行模式时的状态
(4)当一个中断或唤醒事件导致退出停止模式时,HSI被选为系统时钟(8MHz)
(5)当电压调节器处于低功耗模式下,系统从停止模式退出时,会有一段额外的启动延时
(6)WFI指令进入停止模式,可被任意一个EXTI中断唤醒
(7)WFE指令进入停止模式,可被任意一个EXTI事件唤醒
待机模式
(1)执行完WFI/WFE指令后,STM32进入待机模式,唤醒后程序从头开始运行
(2)整个1.8V供电区域被断电,PLL、HSI和HSE也被断电,SRAM和寄存器内容丢失,只有备份的寄存器和待机电路维持供电
(3)在待机模式下,所有的I/O引脚变为高阻态(浮空输入)
(4)WKUP引脚的上升沿、RTC闹钟事件的上升沿、NRST引脚上外部复位、IWDG复位退出待机模式
二、库函数
TIPS: 修改系统主频的方法
修改主频可以有效的降低功耗。并且在停机模式下唤醒,也需要修改主频到72MHZ (停机模式下唤醒,系统主频由72MHZ降低至36MHZ,需要重新修改主频,否则外设的时序会出错误,运行时间会变长)
这个需要去system_stm32f10x.c和system_stm32f10x.h 中查看学习
system_stm32f10x.c中可调用的函数
在system_stm32f10x.c 文件中有两个外部可调用的函数和一个外部可调用的变量.(可以在头文件中看到。)
两个函数是SystemInit()和SystemCoreClockUpdate()
一个变量是SystemCoreClock
SystemInit() 是用来配置时钟树的,他是在执行main函数之前,在启动文件中调用的。
SystemCoreClock 表示主频频率的值。如果我们要显示当前频率就可以直接调用显示
SystemCoreClockUpdate() 更新上边的SystemCoreClock 的值。
7.2 system_stm32f10x.c中的宏定义
解除对应的注释,来选择想要的系统主频(带有钥匙的文件无法修改,需要取消文件的只读属性)
这个if和 lese的意思是:只要你不是VL(超值系列)。就可以配置那么多的主频(lese下边的)
1.标准库函数
代码如下:
void PWR_DeInit(void);恢复缺省配置
void PWR_BackupAccessCmd(FunctionalState NewState);使能后备区域的访问
void PWR_PVDCmd(FunctionalState NewState);配置PVD阈值电压
void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel);使能PVD功能
void PWR_WakeUpPinCmd(FunctionalState NewState);使能位于PA0位置的WKUP引脚。(配合待机模式使用)
void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry);进入停止模式
指定电压调节器在停止模式中的状态、使用WFI或WFI指令进入
void PWR_EnterSTANDBYMode(void);进入待机模式
使用WFI或WFI指令进入
FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG);获取标志位
void PWR_ClearFlag(uint32_t PWR_FLAG);清除标志位
2.示例代码–睡眠模式&串口发送和接收
代码如下(示例):
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"
uint8_t RxData;
int main(void)
{
OLED_Init();
Serial_Init();
OLED_ShowString(1,1,"RxData:");
while(1)
{
if(Serial_GetRxFlag() == 1)
{
RxData = Serial_GetRxData();
Serial_SendByte(RxData);
OLED_ShowHexNum(1,8,RxData,2);
}
OLED_ShowString(2,1,"Running");
Delay_ms(100);
OLED_ShowString(2,1," ");
Delay_ms(100);
__WFI();//中断唤醒
}
}
睡眠模式下串口发送和接收
在主循环最后执行WFI,CPU会立刻睡眠,程序停在WFI指令这里,发送数据,USART外设收到数据,产生中断,唤醒CPU,程序在暂停的地方继续运行,先进入中断再回到主循环
Running闪烁一次,程序在收到数据之后,可以唤醒工作一次,CPU在空闲时睡眠,节约用电
注:再次下载程序显示下载不成功,所以按住复位键,再按下载键,最后松开复位键才可以下载成功
总结
待机模式只能由WKUP引脚的上升沿、RTC闹钟事件的上升沿、NRST引脚上外部复位、IWDG复位来退出待机模式。
在待机模式恢复后,会重头开始执行命令。所以不需要配置时钟了。
在待机模式下, 1.8V的区域的时钟关闭,电压调节器也关闭。这会使除了备份区域外的所有寄存器清除数据,并且IO口对外呈现为高阻态。
在进入待机模式之前,一般都需要把所有的外设 都关闭,比如屏幕、电机等等。 否则就无法极度省电
待机模式会重头开始执行命令,所以不需要再配置时钟了。
待机模式烧录代码可以按住复位再烧录 (我这里不行,我会断电重上电,在未进入待机模式前开始烧录代码)
测试WKUP引脚时,只需要函数:PWR_WakeUpPinCmd(ENABLE); 就可以了。程序会自动帮我们把WKUP(PA0)引脚设置为下拉输入的配置,不需要GPIO初始化。
TIPS: 待机等模式无法下载程序,因为烧录引脚被关闭。方法。一边按复位引脚,一边按KEIL5中烧录按钮,可从新烧录。