首页 > 其他分享 >stm32 PWR电源控制(修改主频&睡眠模式&停机模式&待机模式)

stm32 PWR电源控制(修改主频&睡眠模式&停机模式&待机模式)

时间:2024-09-20 19:50:16浏览次数:13  
标签:PWR ShowString 模式 stm32 OLED 待机 唤醒

理论

1.PWR简介

PWR(Power Control)电源控制

PWR负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能

可编程电压监测器(PVD)可以监控VDD电源电压,当VDD下降到PVD阀值以下或上升到PVD阀值之上时,PVD会触发中断,用于执行紧急关闭任务

低功耗模式包括睡眠模式(Sleep)、停机模式(Stop)和待机模式(Standby),可在系统空闲时,降低STM32的功耗,延长设备使用时间简介

2.电源框图

3.上电复位和掉电复位 

4.可编程电压监测器

可编程电压监测器(PVD)可以监控VDD电源电压,当VDD下降到PVD阀值以下或上升到PVD阀值之上时,PVD会触发中断,用于执行紧急关闭任务

5.低功耗模式

(1)睡眠模式

进入方式:调用_WFI();或_WFE();进入睡眠模式

唤醒方式:有两种唤醒方式,WFI或WFE,常用的一种方式是中断(WFI)

作用:可以使CPU时钟进入睡眠模式,但是对其他的时钟没有影响,不会关闭震荡器,不会关闭电源,不会失去SARM相关的数据

SLEEPONEXIT:是否立即进入睡眠模式,0表示立即进入睡眠模式,1表示等待当前中断执行完进入睡眠模式

(2)停机模式 

PDDS:用于选择进入停机模式还是待机模式,0表示进入停机模式,1表示进入待机模式

LPDS:设置电压调节器,0表示开启电压调节器,1表示开启低功耗模式

SLEEPDEEP:选择睡眠模式还是深度睡眠模式(待机/停机)

唤醒方式:任意外部中断

进入方式:对PDDS,LPDS,SLEEPDEEP,WFI进行配置

作用:可以保持RTC运行。看门狗的运行,不会失去SARM相关的数据 

(3)待机模式 

PDDS:用于选择进入停机模式还是待机模式,0表示进入停机模式,1表示进入待机模式

SLEEPDEEP:选择睡眠模式还是深度睡眠模式(待机/停机)

唤醒方式:WKUP引脚的上升沿、RTC闹钟事件的上升沿、NRST引脚上外部复位、IWDG复位退出待机模式

进入方式:对PDDS,SLEEPDEEP,WFI进行配置

作用:只保留RTC与看门狗,不会丢失BKP的数据,会丢失SARM的数据

6.模式选择

执行WFI(Wait For Interrupt)或者WFE(Wait For Event)指令后,STM32进入低功耗模式

(1)睡眠模式

执行完WFI/WFE指令后,STM32进入睡眠模式,程序暂停运行,唤醒后程序从暂停的地方继续运行

SLEEPONEXIT位决定STM32执行完WFI或WFE后,是立刻进入睡眠,还是等STM32从最低优先级的中断处理程序中退出时进入睡眠

在睡眠模式下,所有的I/O引脚都保持它们在运行模式时的状态

WFI指令进入睡眠模式,可被任意一个NVIC响应的中断唤醒

WFE指令进入睡眠模式,可被唤醒事件唤醒

(2)停止模式

执行完WFI/WFE指令后,STM32进入停止模式,程序暂停运行,唤醒后程序从暂停的地方继续运行

1.8V供电区域的所有时钟都被停止,PLL、HSI和HSE被禁止,SRAM和寄存器内容被保留下

在停止模式下,所有的I/O引脚都保持它们在运行模式时的状态

当一个中断或唤醒事件导致退出停止模式时,HSI被选为系统时钟(在进入停止模式后要在后面加上SystemInit();恢复主频72M)

当电压调节器处于低功耗模式下,系统从停止模式退出时,会有一段额外的启动延时

WFI指令进入停止模式,可被任意一个EXTI中断唤醒

WFE指令进入停止模式,可被任意一个EXTI事件唤醒

(3)待机模式 

执行完WFI/WFE指令后,STM32进入待机模式,唤醒后程序从头开始运行

整个1.8V供电区域被断电,PLL、HSI和HSE也被断电,SRAM和寄存器内容丢失,只有备份的寄存器和待机电路维持供电

在待机模式下,所有的I/O引脚变为高阻态(浮空输入)

WKUP引脚的上升沿、RTC闹钟事件的上升沿、NRST引脚上外部复位、IWDG复位退出待机模式

 API学习

 1.SystemCoreClock

extern uint32_t SystemCoreClock;          /*!< System Clock Frequency (Core Clock) */
/*
 *当前的主频
 */

2.SystemInit

extern void SystemInit(void);
/*
 * 初始化系统的硬件设置
 */

3.PWR_EnterSTANDBYMode

void PWR_EnterSTANDBYMode(void);
/*
 *进入待机模式
 */

4.PWR_EnterSTOPMode

void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry);
/*
 *停止模式的唤醒  
 */

5.PWR_WakeUpPinCmd

void PWR_WakeUpPinCmd(FunctionalState NewState);
/*
 *使能位于PA0的WKUP引脚,WKUP引脚上升沿唤醒待机模式
 */

6.RTC_SetAlarm

void RTC_SetAlarm(uint32_t AlarmValue);
/*
 *  写入闹钟值到RTC的ALR寄存器
 */

代码

1.修改主频

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"

int main(void)
{
	OLED_Init();							//OLED初始化
	
	OLED_ShowString(1, 1, "SYSCLK:");		//显示静态字符串
	OLED_ShowNum(1, 8, SystemCoreClock, 8);	//显示SystemCoreClock变量
											//SystemCoreClock的值表示当前的系统主频频率
	
	while (1)
	{
		OLED_ShowString(2, 1, "Running");	//闪烁Running,指示当前主循环运行的快慢
		Delay_ms(500);
		OLED_ShowString(2, 1, "       ");
		Delay_ms(500);
	}
}

2.睡眠模式

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"

uint8_t RxData;			//定义用于接收串口数据的变量

int main(void)
{
	OLED_Init();		//OLED初始化
	OLED_ShowString(1, 1, "RxData:");	//显示静态字符串
	
	Serial_Init();		//串口初始化
	
	while (1)
	{
		if (Serial_GetRxFlag() == 1)			//检查串口接收数据的标志位
		{
			RxData = Serial_GetRxData();		//获取串口接收的数据
			Serial_SendByte(RxData);			//串口将收到的数据回传回去,用于测试
			OLED_ShowHexNum(1, 8, RxData, 2);	//显示串口接收的数据
		}
		
		OLED_ShowString(2, 1, "Running");		//OLED闪烁Running,指示当前主循环正在运行
		Delay_ms(100);
		OLED_ShowString(2, 1, "       ");
		Delay_ms(100);
		
		__WFI();								//执行WFI指令,CPU睡眠,并等待中断唤醒
	}
}

3.停机模式

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "CountSensor.h"

int main(void)
{
	/*模块初始化*/
	OLED_Init();			//OLED初始化
	CountSensor_Init();		//计数传感器初始化
	
	/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);		//开启PWR的时钟
															//停止模式和待机模式一定要记得开启
	
	/*显示静态字符串*/
	OLED_ShowString(1, 1, "Count:");
	
	while (1)
	{
		OLED_ShowNum(1, 7, CountSensor_Get(), 5);			//OLED不断刷新显示CountSensor_Get的返回值
		
		OLED_ShowString(2, 1, "Running");					//OLED闪烁Running,指示当前主循环正在运行
		Delay_ms(100);
		OLED_ShowString(2, 1, "       ");
		Delay_ms(100);
		
		PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI);	//STM32进入停止模式,并等待中断唤醒
		SystemInit();										//唤醒后,要重新配置时钟
	}
}

4.待机模式

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "MyRTC.h"

int main(void)
{
	/*模块初始化*/
	OLED_Init();		//OLED初始化
	MyRTC_Init();		//RTC初始化
	
	/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);		//开启PWR的时钟
															//停止模式和待机模式一定要记得开启
	
	/*显示静态字符串*/
	OLED_ShowString(1, 1, "CNT :");
	OLED_ShowString(2, 1, "ALR :");
	OLED_ShowString(3, 1, "ALRF:");
	
	/*使能WKUP引脚*/
	PWR_WakeUpPinCmd(ENABLE);						//使能位于PA0的WKUP引脚,WKUP引脚上升沿唤醒待机模式
	
	/*设定闹钟*/
	uint32_t Alarm = RTC_GetCounter() + 10;			//闹钟为唤醒后当前时间的后10s
	RTC_SetAlarm(Alarm);							//写入闹钟值到RTC的ALR寄存器
	OLED_ShowNum(2, 6, Alarm, 10);					//显示闹钟值
	
	while (1)
	{
		OLED_ShowNum(1, 6, RTC_GetCounter(), 10);	//显示32位的秒计数器
		OLED_ShowNum(3, 6, RTC_GetFlagStatus(RTC_FLAG_ALR), 1);		//显示闹钟标志位
		
		OLED_ShowString(4, 1, "Running");			//OLED闪烁Running,指示当前主循环正在运行
		Delay_ms(100);
		OLED_ShowString(4, 1, "       ");
		Delay_ms(100);
		
		OLED_ShowString(4, 9, "STANDBY");			//OLED闪烁STANDBY,指示即将进入待机模式
		Delay_ms(1000);
		OLED_ShowString(4, 9, "       ");
		Delay_ms(100);
		
		OLED_Clear();								//OLED清屏,模拟关闭外部所有的耗电设备,以达到极度省电
		
		PWR_EnterSTANDBYMode();						//STM32进入停止模式,并等待指定的唤醒事件(WKUP上升沿或RTC闹钟)
		/*待机模式唤醒后,程序会重头开始运行*/
	}
}

接线图

 

标签:PWR,ShowString,模式,stm32,OLED,待机,唤醒
From: https://blog.csdn.net/2302_79504723/article/details/142358942

相关文章

  • stm32 WDG看门狗(独立看门狗&窗口看门狗)
    理论WDGWDG(Watchdog)看门狗看门狗可以监控程序的运行状态,当程序因为设计漏洞、硬件故障、电磁干扰等原因,出现卡死或跑飞现象时,看门狗能及时复位程序,避免程序陷入长时间的罢工状态,保证系统的可靠性和安全性看门狗本质上是一个定时器,当指定时间范围内,程序没有执行喂狗(重置计......
  • STM32F407单片机编程入门(九)低功耗模式实战含源码
    文章目录一.概要二.STM32单片机低功耗基本介绍三.STM32F407单片机待机模式介绍四.CubeMX配置一个待机低功耗例程五.CubeMX工程源代码下载六.小结一.概要在生活中通过关掉电器组件可以实现省电节能的目的,同样的道理单片机也可以通过这种方法实现降低功耗。单片机是由......
  • 23种设计模式,纯简单理解,面试必备
    文章目录创建型设计模式1.单例设计模2.工厂设计模式3.抽象工厂设计模式4.建造者设计模式5.原型设计模式结构型设计模式1.适配器设计模式2.桥接设计模式3.组合设计模式4.装饰器设计模式5.外观设计模式6.享元设计模式7.代理设计模式行为型设计模式1.访问者设计模式2.模板......
  • 【理论篇】数据挖掘 第六章 挖掘频繁模式、关联和相关性:基本概念和方法(上)
    说明:文章为《数据挖掘:概念与技术原书第03版》的学习笔记,该书是数据挖掘领域的经典之作,想了解更多内容请参阅原著。一、频繁模式基本概念        模式:通常指的是数据中的一种规律、趋势或特征,可以是单一的特征、属性,也可以是多个特征之间的关系或组合;      ......
  • 社区团购为何成为零售新风口?团批模式如何颠覆传统零售?
    在零售业竞争白热化的今天,商家们纷纷转向社区团购与团批模式寻求突破。这一模式凭借高效的供应链体系和独特的商业模式,不仅降低了运营成本,还精准对接了消费者的日常需求。社区团购利用社区场景和社交网络的强大传播力,将居民需求汇聚成批量订单,再由团长或自提点精准分发,有效解决了最......
  • 华为 DHCP 三种模式实验 | 原理分析
    DHCP三种模式(全局地址池、接口地址池、中继)DHCP(DynamicHostConfigurationProtocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作。一、全局地址池配置全局地址池就是可以给任何接口地址提供DHCP服务,同时你可以创建多个全局地址池使用,其中全局地址池网......
  • 米尔STM32MP2核心板首发新品上市!高性能+多接口+边缘算力
    米尔发布基于STM32MP257设计的嵌入式处理器模块MYC-LD25X核心板及开发板。核心板基于STM32MP2系列是意法半导体推出最新一代工业级64位微处理器,采用LGA252PIN设计,存储配置1GB/2GBLPDDR4、8GBeMMC,具有丰富的通讯接口,适用于高端工业HMI、边缘计算网关、新能源充电桩、储能EMS系......
  • KTH7823——16 位高精度低延时霍尔磁编码器可编程 ABZ 和 PWM 输出模式角度传感器
    KTH7823是一款高精度绝对角度霍尔传感器芯片,最高16位分辨率绝对角度输出,可实现在轴向和离轴场合下的无接触式磁场角度测量。不论转速范围在0-120000rpm之间,KTH7823都能快速准确地输出角度信息,适用于需要精准角度测量和转速控制的各个领域。KTH7823......
  • 抽象工厂模式-设计模式
    抽象工厂模式(AbstractFactoryPattern)在Java中是一种非常有用的设计模式,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。这个模式提供了一种创建对象的最佳方式,它封装了创建对象的细节,并允许客户依赖于抽象类型而不是具体类型。以下是一个简单的Java案例,展示了抽象工......
  • 链动2+1模式系统发源码之区域代理架构设计与功能解析
    链动2+1模式系统开发源码中的区域代理设计,主要围绕行政区划分的省、市、区代理机制进行构建,旨在通过这一机制促进线上线下的融合,提升区域市场的覆盖。以下是对该设计的详细解析一、区域代理的设立与获取方式1. 设立原则:区域代理分为省级代理、市级代理和区县代理,每个级别均基于行......