STM32笔记 PWR电源

PWR简介

•PWR(Power Control)电源控制

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

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

•低功耗模式包括睡眠模式(Sleep)、停机模式(Stop)和待机模式(Standby),可在系统空闲时,降低STM32的功耗,延长设备使用时间•PWR(Power Control)电源控制

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

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

•低功耗模式包括睡眠模式(Sleep)、停机模式(Stop)和待机模式(Standby),可在系统空闲时,降低STM32的功耗,延长设备使用时间,这里要考虑关闭哪些硬件,保留哪些硬件,以及如何去唤醒,

电源框图

框图

最上面是模拟部分供电,叫作VDDA,包括A/D转换器、温度传感器、复位模块、PLL锁相环,这些电路的供电正极VDDA,负极VSSA,AD转换器还有两个参考电压引脚,叫做VREF-、VREF+,这里在芯片内部已经接在VDDA和VSSA。

中间是数字部分供电有两块区域,VDD供电区域和1.8V供电区域,VDD供电区域,包括IO电路、待机电路(唤醒逻辑、独立看门狗),右边的供电区域是VDD通过电压调节器,降到1.8V给后面的1.8V供电区域,1.8V供电区域包括CPU核心、存储器、内置数字外设,可以看出,STM32大部分关键电路,CPU、存储器、外设,都是以1.8V的低电压运行,当这些外设需要与外界进行交流时,才会通过IO电路转换到3.3V。

下面是后备供电VBAT,其中包括LSE32K晶体振荡器,后备寄存器、RCC BRCR寄存器、RTC,RCC BRCR寄存器是RCC的寄存器,叫备份域控制器,上面有个低电压检测器,可以控制下面哪个开关,VDD有电时,由VDD供电,VDD没电时,由VBAT供电。

上电复位

当VDD或VDDA电压过低时,内部电路直接产生复位,让STM32复位住,不要操作,复位与不复位的界限之间,设置了一个40mV迟滞电压,大于上限POR的时候解除复位,小于下限PDR时复位,这是一个典型的迟滞比较器,设置连个阈值的作用时防止电压在某个阈值附近波动时,造成输出也来会抖动,下面复位信号Reset复位信号低电平有效,所以在前面和后面,电压过低时,是复位的,中间电压正常的时候,不复位,

可编程电压检测器

简称:PVD,工作流程与上电复位、掉电复位差不多,都是检测VDD/VDDA的供电电压,但是PVD的阈值电压可以使用程序指定,可以自定义调节,可选范围2.2V~2.9V,PVD上限和下限的迟滞电压是100mV,PVD的电压是比上电掉电复位电压要高的,PVD输出,电压过低时为1,电压正常时为0,这个信号可以去申请中断,在上升沿或下降沿触发中断,PVD的中断申请是通过外部中断实现的。

低功耗模式

第一列:哪种模式, 第二列:如何配置, 第三列:如何唤醒, 最后三列:每种模式对电路的操作,

低功耗模式:睡眠,停机,待机,三种模式,从上到下,关闭的电路越来越多,也越来越省电,也是越来越来难唤醒。

睡眠模式,直接调用WFI或者WFE,即可进入,这两个是内核的指令,WFI的唤醒条件任一中断,调用WFI进入的睡眠模式,任何外设发生任何中断时,芯片都会立刻醒来,醒来的第一件事就是处理中断函数。WFE等待事件,唤醒条件:唤醒事件,这个事件可以是外部中断配置为事件模式,也可以是使能了中断,但是没有配置NVIC,调用WFE进入的睡眠模式,产生唤醒事件时,会立刻醒来,醒来之后,不进中断,直接从睡的地方开始运行。 相同点:调用任意一个,芯片都会进入睡眠, 不同点:WFI进入得用中断唤醒,WFE进入得用事件唤醒。 影响:对1.8V区域时钟的影响:CPU时钟关,对其他时钟和ADC时钟无影响,对VDD区域时钟影响无,电压调节器,开, 只是关了个CPU时钟,其他啥也没干。 关闭电路通常有两个做法:一个是关闭时钟,一个是关闭电源,关闭时钟 ,所有的运算和设计时序的操作都会暂停,但是寄存器和存储器保存的数据还会维持,关闭电源就是直接断电,电路的操作和数据都会直接消失,关闭电源比关闭时钟更省电。

停机模式,如何进入停机模式?首先SLEEPDEEP位置1,进入深度睡眠模式,PDDS位用来区分停机模式还是待机模式,PDDS=0进入待机模式,PDDS=1进入停机模式,进入停机模式PDDS首先等于0,LPDS用来设置电压调节器,LPDS=0,电压调节器开启,LPDS=1,电压调节器进入低功耗,最后在调用WFI和WFE进入,芯片就可以进入停止模式了,只有外部中断才能唤醒,其他中断唤醒不了,PVD、RTC、USB、ETH借道了外部中断,这四个信号也可以唤醒停止模式,WFI要用外部中断的中断模式唤醒,WFE要用外部中断的事件模式唤醒。停止模式关闭1.8V区域的时钟,CPU、外设、定时器会暂停,串口收发数据也会暂停,由于没有关闭电源,CPU和外设的寄存器数据都是维持原状的,HSI内部高速时钟和HSE外部高速时钟会关闭,LSI内部低速时钟和LSE外部低速时钟如果开启了,并不会关闭,电压调节器可以选择开启或者处于低功耗模式。

待机模式,如何进入?首先SLEEPDEEP位置1,即将深度睡眠,PDDS=1,即将进入待机模式,最后进入WFI和WFE,就可以进入待机模式,唤醒条件:WKUP引脚的上升沿,RTC闹钟事件,NRST引脚的外部复位(复位按键),IWDG(独立看门狗)复位,关闭1.8V区域的时钟,HSI内部高速时钟和HSE外部高速时钟会关闭,电压调节器关闭。内部的存储器和寄存器的数据全部丢失,LSI内部低速时钟和LSE外部低速时钟如果开启了,并不会关闭,因为这两个时钟还要维持RTC和独立开门狗的运行。

模式选择

执行WFI等待中断,执行WFE等待事件,stm32进入低功耗模式,这两个指令是最终开启低功耗的触发条件,配置其他寄存器都要在这两个指令之前。

首先,一旦WFI或者WFE执行了,首先判断SLEEPDEEP位=1还是=0, =0就是浅睡眠,对应的就是睡眠模式,=1就是深睡眠,对应的就是停机/待机模式。 睡眠模式情况下,会继续判断SLEEPONEXIT=0还是=1,等于0时,无论程序在哪里调用WFI/WFE都会立刻进入睡眠, 等于1时,会等待中断退出,等所有中断执行完成之后,再进行睡眠, 深度睡眠情况下,会继续判断PDDS位,PDDS=0就是停机模式,PDDS=1就是待机模式,在停机模式下,会继续判断LPDS位,LPDS=0,就是停机模式电压调节器开启,LPDS=1,就是停机模式电压调节器低功耗,低功耗的特性:就是更省电,但唤醒条件更高。

模式总结

睡眠模式

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

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

•在睡眠模式下,所有的I/O引脚都保持它们在运行模式时的状态,比如:电灯,睡眠时灯仍然可以是亮的。

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

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

停止模式

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

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

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

•当一个中断或唤醒事件导致退出停止模式时,HSI被选为系统时钟,唤醒后,需要重新启动HSE,配置主频为32Mhz,重新调用SystemInit。

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

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

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

待机模式

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

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

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

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

代码

修改主频

#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);

	while (1)
	{
		OLED_ShowString(2,1,"Running");
		Delay_ms(500);
		OLED_ShowString(2,1,"       ");
		Delay_ms(500);
	}
}

睡眠模式

		__WFI();		//执行WFI指令,CPU睡眠,并等待中断唤醒

停止模式

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


int main(void)
{
	OLED_Init();
	CountSensor_Init();
	
	
		//开启时钟
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);			//停止模式和待机模式一定要记得开启
	
		OLED_ShowString(1,1,"Count:");
		while(1)
		{
			OLED_ShowNum(1,7,Get_CountSensor_Value(),5);
			
			OLED_ShowString(2, 1, "Running");					//OLED闪烁Running,指示当前主循环正在运行
			Delay_ms(10);
			OLED_ShowString(2, 1, "       ");
			Delay_ms(10);
			
			//电压调节器开启,中断触发			
			PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI);		//STM32进入停止模式,并等待中断唤醒
			SystemInit();			//唤醒后,要重新配置时钟
		}
}

待机模式

在RTC上修改

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



int main(void)
{
	/*模块初始化*/
	OLED_Init();		//OLED初始化

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//打开PWR时钟
	
	MyRTC_Init();		//RTC初始化
	
	/*显示静态字符串*/

	OLED_ShowString(1, 1, "CNT:");
	OLED_ShowString(2, 1, "ALR:");
	OLED_ShowString(1, 1, "ALRF:");
	
	PWR_WakeUpPinCmd(ENABLE);			//打开wkUP引脚
	
	//设定闹钟
	uint32_t Alrf = RTC_GetCounter()+10;
	RTC_SetAlarm(Alrf);
	OLED_ShowNum(2, 6, Alrf, 10);					//显示闹钟值
	
	
	while (1)
	{		
		OLED_ShowNum(1, 6,RTC_GetCounter(), 10);		//获取计数值
		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();
		PWR_EnterSTANDBYMode();			//STM32进入停止模式,并等待指定的唤醒事件(WKUP上升沿或RTC闹钟)
		/*待机模式唤醒后,程序会重头开始运行*/
	}
}

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值