STM32-PWR低功耗
一、概述
1、电源框图
1.8V供电区域有CPU核心存储器和内置数字外设(如USART、I2C、SPI等),通过电压调节器进行控制着电压。
低电压检测器进行检测VDD电压的,当检测到VDD断电时,开关会切换到VBT来供电。
2、上电复位和掉电复位
当VDD/VDDA低于指定的限位电压VPOR/VPDR时,系统保持为复位状态,而无需外部复位电路 |
3、可编程电压监测器PVD:
用户可以利用PVD对VDD电压与电源控制寄存器(PWR_CR)中的PLS[2:0]位进行比较来监控电源,这几位选择监控电压的阀值。
通过设置PVDE位来使能PVD。
电源控制/状态寄存器(PWR_CSR)中的PVDO标志用来表明VDD是高于还是低于PVD的电压阀值。该事件在内部连接到外部中断的第16线,如果该中断在外部中断寄存器中是使能的,该事件就会产生中断。当VDD下降到PVD阀值以下和(或)当VDD上升到PVD阀值之上时,根据外部中断第16线的上升/下降边沿触发设置,就会产生PVD中断。例如,这一特性可用于用于执行紧急关闭任务。
4、低功耗模式
睡眠模式是浅睡眠状态,停机和待机深睡眠状态。
5、 模式选择
具体内容可以查看手册。
睡眠模式:
停机模式:
待机模式:
二、睡眠模式代码
利用的是串口接收中断唤醒的。
main.c:
#include "stm32f10x.h" // Device header
#include "OLED.h"
#include "delay.h"
#include "Serial.h"
#include "stdio.h"
extern char String[16];
uint16_t Serial_Rxdata;
int main(void)
{
OLED_Init();
Serial_Init();
OLED_ShowString(1,1,"RXData:");
while(1)
{
if(Serial_GetRxFlag()==1)
{
Serial_Rxdata=Serial_GetRxData();
Serial_SendByte(Serial_Rxdata);
OLED_ShowHexNum(1,8,Serial_Rxdata,2);
}
OLED_ShowString(2,1,"Running");
Delay_ms(100);
OLED_ShowString(2,1," ");
Delay_ms(100);
__WFI(); //默认使用的是立即睡眠
}
}
三、停机模式代码
利用对射红外传感器进行外部中断唤醒。
main.c:
#include "stm32f10x.h" // Device header
#include "OLED.h"
#include "LED.h"
#include "delay.h"
#include "CountSensor.h"
uint16_t CountSensor_GetNum=0;
int main(void)
{
OLED_Init();
LED_Init();
CountSensor_Init();
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
OLED_ShowString(1,1,"Count:");
while(1)
{
CountSensor_GetNum=CountSensor_Get();
OLED_ShowNum(1,8,CountSensor_GetNum,4);
OLED_ShowString(2,1,"Running");
Delay_ms(200);
OLED_ShowString(2,1," ");
Delay_ms(200);
LED1_ON();
PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI);
//当一个中断或唤醒事件导致退出停止模式时,HSI(8MHz)被选为系统时钟
SystemInit();
}
}
四、待机模式代码
利用RTC闹钟和WKUP引脚来进行唤醒。
main.c:
#include "stm32f10x.h" // Device header
#include "OLED.h"
#include "LED.h"
#include "delay.h"
#include "MyRTC.h"
Time_Value Time_Data={2024,11,1,19,30,0};
//在编程中数字以0开头往往表示八进制
int main(void)
{
uint32_t Alarm;
OLED_Init();
MyRTC_Init(&Time_Data);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
OLED_ShowString(1,1,"CNT:");
OLED_ShowString(2,1,"ALR:");
OLED_ShowString(3,1,"ALRF:");
LED_Init();
Alarm=RTC_GetCounter()+10;
RTC_SetAlarm(Alarm);
OLED_ShowNum(2,6,Alarm,10);
PWR_WakeUpPinCmd(ENABLE);
while(1)
{
OLED_ShowNum(1,6,RTC_GetCounter(),10);
OLED_ShowNum(3,6,RTC_GetFlagStatus(RTC_FLAG_ALR),1);
OLED_ShowString(4,1,"Running");
Delay_ms(1000);
OLED_ShowString(4,1," ");
Delay_ms(100);
//待机模式下,程序从头开始运行
//OLED_Clear();
LED1_ON();
PWR_EnterSTANDBYMode();
}
}
作者:GCC_a.out