PWR电源控制

一、PWR简介

1、PWR(Power Control)电源控制

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

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

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

2、电源框图

3、上电复位和掉电复位

4、可编程电压监测器

5、低功耗模式

6、模式选择

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

7、睡眠模式

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

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

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

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

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

8、停止模式

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

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

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

(4)当一个中断或唤醒事件 导致退出停止模式时,HSI被选为系统时钟(8MHz)

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

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

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

9、待机模式

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

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

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

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

二、修改主频

1、按照以下接线方式连接,并将STLINK插到电脑上

2、解除只读

打开工程文件夹,对应文件的位置,右键属性

取消只读的勾

如果想要整个文件夹都取消只读,就需要对文件夹的属性只读去掉就好了

3、修改主频

(1)修改主频为36MHz

(2)编写main.c文件

复制代码
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"


int main(void)
{
	OLED_Init();
	
	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);
	}
}

4、实现效果

修改主频

主频由72MHz修改到36MHz,Running闪烁周期由1s变成2s

三、睡眠模式&串口发送和接收

1、按照以下接线方式连接,并将STLINK插到电脑上

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();
	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();//中断唤醒
		
	}
}

3、实现效果

睡眠模式下串口发送和接收

在主循环最后执行WFI,CPU会立刻睡眠,程序停在WFI指令这里,发送数据,USART外设收到数据,产生中断,唤醒CPU,程序在暂停的地方继续运行,先进入中断再回到主循环

Running闪烁一次,程序在收到数据之后,可以唤醒工作一次,CPU在空闲时睡眠,节约用电

注:再次下载程序显示下载不成功,所以按住复位键,再按下载键,最后松开复位键才可以下载成功

四、停止模式&对射式红外传感器计次

1、按照以下接线方式连接,并将STLINK插到电脑上

2、PWR库函数的功能

3、修改对射式红外传感器计次的main.c文件

复制代码
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "CountSensor.h"


int main(void)
{
	OLED_Init();
	CountSensor_Init();
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//开启PWR时钟
	
	OLED_ShowString(1,1,"Count:");
	
	while(1)
	{
		OLED_ShowNum(1,7,CountSensor_Get(),5);
		
		OLED_ShowString(2,1,"Running");
		Delay_ms(100);
		OLED_ShowString(2,1,"       ");
		Delay_ms(100);
		
		PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI);//停机模式,电压调节器开启
		SystemInit();//重新启动HSE,配置72M的主频,退出停止模式时,HSI(8MHz)被选为系统时钟,首次复位后,SystemInit函数配置的是HSE*9倍频的72M主频,所以复位后第一次Running闪烁很快
	}
}

4、实现效果

停止模式下对射式红外传感器计次

五、待机模式&实时时钟

1、按照以下接线方式连接,并将STLINK插到电脑上

2、修改实时时钟的main.c文件

复制代码
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "MyRTC.h"



int main(void)
{
	OLED_Init();
	MyRTC_Init();
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);	//开启PWR时钟
	
	OLED_ShowString(1,1,"CNT :");//秒计数器
	OLED_ShowString(2,1,"ALR :");//闹钟值
	OLED_ShowString(3,1,"ALRF:");//闹钟标志位
	
	PWR_WakeUpPinCmd(ENABLE);//WKUP引脚唤醒,WKUP引脚悬空就是低电平,WKUP上升沿唤起待机
	
	uint32_t Alarm = RTC_GetCounter() +10;
	RTC_SetAlarm(Alarm);//闹钟寄存器是只写的,不可以读,可以在写之前把数据存起来
	OLED_ShowNum(2,6,Alarm,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");
		Delay_ms(100);
		OLED_ShowString(4,1,"       ");
		Delay_ms(100);
		
		OLED_ShowString(4,9,"STANDBY");
		Delay_ms(1000);
		OLED_ShowString(4,9,"       ");
		Delay_ms(1000);
		
		OLED_Clear();//表示在待机模式之前把外部接的模块全部断电
		
		PWR_EnterSTANDBYMode();//进入待机模式,待机模式退出,程序从头开始,待机模式以下的代码不会别执行
	}
}

3、实现效果

待机模式下实时时钟

最开始显示一些信息,进入待机,OLED清屏,等待一会,闹钟触发之后唤醒一次,并用WKUP引脚唤醒待机模式,WKUP引脚悬空就是低电平,WKUP上升沿唤起待机

相关推荐
国科安芯2 小时前
航天器多路并联大功率电源系统设计与ASP4644均流特性分析
单片机·嵌入式硬件·fpga开发·安全性测试
茯苓gao4 小时前
嵌入式开发笔记:CANopen相关移位运算与通信协议术语详解
网络·嵌入式硬件·学习·信息与通信
梁朝辉7 小时前
STM32H750VBT6中ADCINP与INN什么区别
stm32·单片机·嵌入式硬件
省四收割者8 小时前
一文详解信号完整性(1)
python·嵌入式硬件·数学建模·信息与通信·信号处理·智能硬件
崇山峻岭之间9 小时前
单片机无感FOC驱动之ADC
单片机·嵌入式硬件
Ligocious9 小时前
1.点亮一颗小小的LED
单片机·嵌入式硬件
KaifuZeng13 小时前
通信与接口协议面试八、CAN通信
单片机·嵌入式硬件·面试·通信与接口协议
智源单片机设计14 小时前
基于单片机的直流电机双闭环调速系统设计
单片机·嵌入式硬件
kebidaixu14 小时前
两轮车换电 BMS 的模拟前端中颖 SH367306 AFE 芯片详解
stm32
kebidaixu15 小时前
两轮车换电 BMS 的模拟前端中颖 SH367306 AFE 芯片调试实录:四个关键问题与解决方案
stm32