当前位置: 首页 > news >正文

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上升沿唤起待机

相关文章:

  • IDEA services模块无法启动springboot服务(添加了springboot但是为空白)
  • HTTP/2 的 ALPN(应用层协议协商)
  • 【前端】Git 常用
  • C语言| 宏定义
  • Python 学习 第四册 第10章 系统(2)
  • OpenCV图像变换
  • React的State和setState
  • Flink——最流批的大数据框架(流批一体)
  • 【Unity学习笔记】第十八 基于物理引擎的日月地系统简单实现
  • java智慧工地系统源码 智慧工地标准之一:环境监测 告别灰头土脸、智慧工地环境监测系统都包括哪些功能?
  • ThinkPHP6图书借阅管理系统
  • 基于uni-app和图鸟UI的智慧农业综合管控平台小程序技术实践
  • vue实现的商品列表网页
  • 第二篇: 掌握Docker的艺术:深入理解镜像、容器和仓库
  • 华为HCIP Datacom H12-821 卷10
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Angular4 模板式表单用法以及验证
  • css选择器
  • exports和module.exports
  • Java教程_软件开发基础
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 深入浏览器事件循环的本质
  • 手写一个CommonJS打包工具(一)
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ​iOS安全加固方法及实现
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​ubuntu下安装kvm虚拟机
  • #每日一题合集#牛客JZ23-JZ33
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (SERIES10)DM逻辑备份还原
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (三)c52学习之旅-点亮LED灯
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (十六)串口UART
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • .config、Kconfig、***_defconfig之间的关系和工作原理
  • .Net MVC4 上传大文件,并保存表单
  • .NET WPF 抖动动画
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET 依赖注入和配置系统
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .NET单元测试使用AutoFixture按需填充的方法总结
  • .net开发日常笔记(持续更新)
  • .NET之C#编程:懒汉模式的终结,单例模式的正确打开方式
  • .pop ----remove 删除