13:STM32----PWR

news2024/11/24 11:26:04

目录

一:PWR

1:简历

2:电源框图

3:低功耗模式

4:模式选择

5:低功耗模式注意事项

A:睡眠模式

B:停止模式

C:待机模式

二 : 案例

A:修改主频

1:连接图

2:代码

B:睡眠模式+串口发送+接收 

1:连接图

2:代码

C:停止模式+对射式红外传感器计次 

1:连接图

2:函数介绍​​​​​​​

3:代码

D: 待机模式+实时时钟

1:连接图

2:代码


一:PWR

1:简历

        PWR(Power Control)电源控制

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

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

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

2:电源框图

VDD :  右边部分是VDD通过电压调节器,降压到1.8V ;   电压调节器,它的作用是给1.8V区域供电

3:低功耗模式

HSL和HSE : HSI内部高速时钟和HSE外部高速时钟

关闭电路通常有两个做法 :  一个是关闭时钟,另一个是关闭电源

关闭时钟-------所有的运算和涉及时序的操作都会暂停,  但是寄存器和存储器里面保存的数据还可以维持,不会消失

关闭电源--------就是电路直接断电 ,  电路的操作和数据都会直接丢失 .   所以关闭电源,比关闭时钟更省电

电压调节器:  电压调节器是把VDD的电压降低到了1.8V,  然后电压调节器给1.8V区域的供电   ;   电压调节器相当于1.8V供电区域的电池;  关闭电压调节器 , 1.8V供电区域的都不能使用;

睡眠 :       WFI--------任何外设发生任何中断时,芯片都会立刻醒来  ,  因为中断发生了,所以醒来之后的第一件事一般就是处理中断函数

        WFE------等待事件 ,  对应的唤醒条件是: 唤醒事件  ,  这个事件可以是外部中断配置为事件模式 ;  也可以是使能到中断,但是没有配置NVIC ,  调用WFE进入的睡眠模式 ,产生唤醒事件时,会立刻醒来 , 醒来之后,一般不需要进中断函数  ,  直接从睡的地方继续运行

        睡眠模式只是把1.8V区域的CPU时钟关闭

4:模式选择

5:低功耗模式注意事项

A:睡眠模式

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

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

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

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

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

B:停止模式

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

           HSL和HSE : HSI内部高速时钟和HSE外部高速时钟

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

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

        当一个中断或唤醒事件导致退出停止模式时,HSI被选为系统时钟  -------- 你程序刚上电,是72MHz的主频 , 但是进入停止模式,再唤醒之后  ,  就变成8MHz的主频了;  所以,我们一般在停止模式唤醒后 , 第一时间就是重新启动HSE,配置主频为72MHz ,  我们只需要再调用一下Systemlnit就行

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

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

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

C:待机模式

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

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

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

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

        它并不会主动关闭LSI和LSE两个低速时钟 , 因为这两个时钟还要维持RTC和独立看门狗的运行

二 : 案例

A:修改主频

1:连接图

2:代码

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

/*STM32默认的是72KH的主频
#define SYSCLK_FREQ_72MHz  72000000*/
int main(void)
{
	OLED_Init();
	OLED_ShowString(1, 1, "SystemCoreClock:");
	OLED_ShowSignedNum(2,1,SystemCoreClock,8);
	
	while (1)
	{
		OLED_ShowString(3, 1, "Running:");
		Delay_ms(500);
		OLED_ShowString(3, 1, "        ");
		Delay_ms(500);
	}
}

        主要是在 : 2个文件中操作 ,  ( 如果文件上面有🔑的话 , 需要线解除只读模式),  文件主要给我们提供了一个可以调用的全局变量, 和2个函数 ;   

        修改主频 : 默认使用的是72000000HZ的主频 , 

        注意修改主频要谨慎,  一些计算都和主频相关 ,  主频修改后计算也要进行更改

        

        选择外部8M晶振作为锁相环输入 ,  锁相环执行9倍频输出的72M,选择为SYSCLK

        SystemCoreClock------系统的全局变量 , 用于显示系统的主频

B:睡眠模式+串口发送+接收 

1:连接图

2:代码

        在串口发送+接收的代码上进行改进的.   详情参考 : 09:STM32-------USART串口通信+串口数据包----B:串口发送+接收----4:串口发送+接收 -----中断代码

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

uint8_t RxData;

int main(void)
{
	OLED_Init();
	OLED_ShowString(1, 1, "RxData:");
	
	serial_init();
	
	while (1)
	{
		if (Serial_GetRxFlag() == 1)
		{
			RxData = Serial_GetRxData();
			Serial_SendByte(RxData);
			OLED_ShowHexNum(1, 8, RxData, 3);
		}
			OLED_ShowString(2, 1, "Running:");
			Delay_ms(500);
			OLED_ShowString(2, 1, "         ");
			Delay_ms(500);
		__WFI();
	}
}

        WFI--------任何外设发生任何中断时,芯片都会立刻醒来  ,  因为中断发生了,所以醒来之后的第一件事一般就是处理中断函数

        首先,睡眠模式,这是可以的 ,  CPU时钟关闭,程序不再执行 .  但是外设的时钟不会 关 .   USART便件电路还是可以接收数据的 ,  USART收到数据后,产生中断,唤醒CPU

        停机模式 : 这个模式下,所有1.8V区域的时钟都关了 ,  CPU和外设都不能运行 , 那自然USART也收不到数据,产生不了中断 ,所以这个模式不行

C:停止模式+对射式红外传感器计次 

1:连接图

2:函数介绍

        睡眠模式其实都只是内核的操作,  睡眠模式涉及的几个寄存器 , 也都在内核里 跟PWR外设关系不大.  

        停止模式 : 涉及到内核之外的电路操作,  这就需要用到PWR外设了

在stm32f10x_pwr.h文件中----启用或禁用对RTC和备份寄存器的访问。

void PWR_BackupAccessCmd(FunctionalState NewState);

        使能后备区域的访问

在stm32f10x_pwr.h文件中----启用或禁用唤醒引脚功能

void PWR_WakeUpPinCmd(FunctionalState NewState);

        使能位于PAO位置的WKUP引脚

在stm32f10x_pwr.h文件中----进入STOP模式

void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry);
 

        进入停止模式

在stm32f10x_pwr.h文件中----待机模式

void PWR_EnterSTANDBYMode(void)

 在stm32f10x_pwr.h文件中----关于标志位的函数

FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG);
void PWR_ClearFlag(uint32_t PWR_FLAG);

PWR_GetFlagStatus  :  获取标志位

PWR_ClearFlag :  清除标志位

3:代码

在对射式红外传感器计次的代码上进行更改 .  详情参考 : 02:STM32--EXTI外部中断----A:对外式红外传感计数器

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

	OLED_ShowString(1, 1, "Count:");
	
	while (1)
	{
		OLED_ShowNum(1, 7, CountSensor_Get(), 5);
		OLED_ShowString(2, 1, "Running:");
		Delay_ms(500);
		OLED_ShowString(2, 1, "         ");
		Delay_ms(500);
		
		PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI);//进入停止模式
		/*
		当一个中断或唤醒事件导致退出停止模式时,HSI被选为系统时钟
		你程序刚上电,是72MHz的主频 ,但是进入停止模式,再唤醒之后
		就变成8MHz的主频了; 所以,我们一般在停止模式唤醒后 
		第一时间就是重新启动HSE,配置主频为72MHz ,我们只需要再调用一下Systemlnit就行
		*/
		SystemInit();
	}
}

          当一个中断或唤醒事件导致退出停止模式时,HSI被选为系统时钟  -------- 你程序刚上电,是72MHz的主频 , 但是进入停止模式,再唤醒之后  ,  就变成8MHz的主频了;  所以,我们一般在停止模式唤醒后 , 第一时间就是重新启动HSE,配置主频为72MHz ,  我们只需要再调用一下Systemlnit就行

        这个代码可以使用外部中断触发唤醒 ,  所以我们可以让它进入更为省电的停止模式 .  在停止模式下1.8V区域的时钟关闭 , CPU和外设都没有时钟了 , 但是外部中断的工作是不需要时钟的

D: 待机模式+实时时钟

1:连接图

2:代码

对实时时钟的代码进行改进     详情参考 : 12:STM32---RTC实时时钟----B:实时时钟

#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);
	
	OLED_ShowString(1, 1, "CNT :");
	OLED_ShowString(2, 1, "ALR :");
	OLED_ShowString(3, 1, "ALRF:");
	//开启WAUP--PA0的引脚触发
	PWR_WakeUpPinCmd(ENABLE);
	
	uint32_t Alarm = RTC_GetCounter() + 10;   //写RTC计数器
	RTC_SetAlarm(Alarm);   //设置RTC的闹钟
	OLED_ShowNum(2, 6, Alarm, 10);
	
	while (1)
	{
		OLED_ShowNum(1, 6, RTC_GetCounter(), 10);
		/*
		之后,随着CNT的增大 , CNT会和ALR(RTC_SetAlarm)相等 , 然后触发闹钟标志位置1
		*/
		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(100);
		
		OLED_Clear();
		//进入待机模式
		PWR_EnterSTANDBYMode();
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1043366.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++入门(前言、命名空间、缺省参数、重载)

该篇博客主要讲述关于C发展前言,以及C祖师爷对C进行改造提升后的新语法进行解释说明,具体内容为:发展历程、命名空间、输入\输出、缺省参数、函数的重载 目录 文章目录 前言 1.什么是C 2.C的发展史 3.关于C的学习 一、关于命名空间 1.含义 2.…

JMeter测试Web服务

Web服务简介 什么是Web服务 【Web服务】即Web Service。Web服务是一种服务导向架构的技术,通过标准的Web协议提供服务,目的是保证不同平台的应用服务可以互操作。根据W3C的定义,Web服务(Web service)应当是一个软件系统…

ElasticSearch - 基于 “黑马旅游” 案例,实现搜索框、分页、条件过滤、附近酒店、广告置顶功能

目录 一、黑马旅游案例 1.1、实现 搜索框 和 分页 功能 1.1.1、需求分析 a)首先搜索框需求 b)分页需求 1.1.2、定义实体类 1.1.2、定义 controller 1.1.3、注入 RestHighLevelClient 1.1.4、实现 IHotelService 接口的 search 方法 1.1.5、功能…

【OLSR路由协议】链路状态路由(OLSR)协议中选择多点中继节点算法研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

AIGC 绘画Stable Diffusion工具的安装与使用

我们先让ChatGPT来帮我们回答一下,什么是Stable Diffusion Stable Diffusion 是一种基于概率模型的图像生成技术。它通过对图像空间中每个像素的颜色值进行推断,从而生成具有高度真实感和细节的图像。 Stable Diffusion 使用一种称为扩散过程的方法来生成图像。在生成过程中…

Gd-DOTA,CAS:72573-82-1,钆特酸

产品简介:螯合剂是金属原子或离头子与樤含有两个或连两个以上配位原子的配位体作用,生成具有环状结构的络合物,该络合物叫做螯合物。能生成螯合物的这种配体物质叫螯合剂,也成为络合剂。 CAS号:72573-82-1 中文名&am…

基于VR元宇宙技术搭建林业生态模拟仿真教学系统

随着科技的飞速发展,教学方式也正在经历着巨大的变革。林业经济学元宇宙虚拟教学系统作为一种新兴的教学方式,为学生和教师提供了一个全新的、沉浸式的学习和教学环境。 森林管理和监测 元宇宙技术可以用于森林管理和监测。通过无人机、传感器和虚拟现实…

缓冲区溢出漏洞分析

一、实验目的 熟悉软件安全需求分析方法,掌握软件安全分析技术。 二、实验软硬件要求 1、操作系统:windows 7/8/10等 2、开发环境:VS 6.0(C)、OllyDbg 三、实验预习 《软件安全技术》教材第3章 四、实验内容&#…

中间相遇法(分治类问题非等大分治的平衡做法)

分治,如果分成两半大小不一样,很容易被卡到 O ( n 2 ) O(n^2) O(n2) 在某些题目中,利用中间相遇法,我们可以优化这个过程 其优化的前提是分治的大头在找分界点 复杂度不用证,很好理解吧 这层找地越久,下…

常识判断 --- 科技常识

目录 力与热 光和声 航空成就 垃圾分类 百科知识 血型 二十四节气歌 春雨惊春清谷天 夏满忙夏暑相连 秋处露秋寒霜降 冬雪雪冬小大寒 力与热 光和声 航空成就 垃圾分类 百科知识 血型

机器人中的数值优化|【四】L-BFGS理论推导与延伸

机器人中的数值优化|【四】L-BFGS理论推导与延伸 往期内容回顾 机器人中的数值优化|【一】数值优化基础 机器人中的数值优化|【二】最速下降法,可行牛顿法的python实现,以Rosenbrock function为例 机器人中的数值优化|【三】无约束优化,拟牛…

丰田的国际化与转型困境:对中国车企的欧洲策略启示

摘要:欧洲市场的消费者汽车偏好多样,中国车企进军欧洲时,需考虑产品设计和当地法规。回顾历史,丰田汽车通过其独特管理理念,在美国从廉价品牌形象成功转型为高质量、受信赖的全球品牌。但进入电动汽车时代,日本车企因深度共生的传统供应链而转型坎坷。中…

如何使用ES6+特性进行现代前端开发?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用ES6 特性进行现代前端开发1. 使用 let 和 const2. 使用箭头函数3. 使用模板字符串4. 使用解构赋值5. 使用类和模块6. 使用扩展运算符和剩余参数7. 异步编程8. 使用模块打包工具9. 使用现代浏览器 ⭐ 写在最后 ⭐ 专栏简介 前端入门之…

ChatGPT推出全新功能,引发人工智能合成声音担忧|百能云芯

人工智能AI科技企业OpenAI公司25日宣布,其聊天应用程序ChatGPT如今具备「看、听、说」能力,至少能够理解口语、用合成语音回应并且处理图像;但专家忧心,以假乱真与深度伪造的乱象可能变本加厉。 国家广播公司新闻网(NBC News)报导…

1.算法——数据结构学习

算法是解决特定问题求解步骤的描述。 从1加到100的结果 # include <stdio.h> int main(){ int i, sum 0, n 100; // 执行1次for(i 1; i < n; i){ // 执行n 1次sum sum i; // 执行n次} printf("%d", sum); // 执行1次return 0; }高斯求和…

孙哥Spring源码第26集

第26集、AnnotationAwareAspectJAutoProxyCreator源码 【视频来源于&#xff1a;B站up主孙帅suns Spring源码视频】【微信号&#xff1a;suns45】 26.1、postProcessAfterInitialization分析 26.2、wrapIfNecessary分析 26.3、createProxy分析 26.4、getProxy 26.5、BeanPost…

xxl-job分布式调度框架

课程目标 1、 掌握xxl-job部署以及开发的方式 2、 掌握xxl-job特性以及架构设计 3、 掌握xxl-job运行原理 内容定位 适合已经掌握了Quartz的同学 quartz这节课是本节课的基础&#xff0c;这个要求大家一定掌握&#xff0c;因为xxl-job早期就是使用quartz改造的&#xff0…

使用华为eNSP组网试验⑵-通过端口地址进行静态路由

有了网络模拟器可以对很多网络应用场景进行模拟&#xff0c;既方便学习又有利于实际的网络实施。 之前因为没有用过&#xff0c;用过了才知道eNSP的好处。但是与思科模拟器不同&#xff0c;连接是自动连接&#xff0c;不能确定端口&#xff0c;比如使用指定的光纤端口或者RJ45的…

地球的某一片红薯地中秋圆辉少许《乡村振兴战略下传统村落文化旅游设计》——2023学生旅行季许少辉八月新书想象和世界一样宽广

地球的某一片红薯地中秋圆辉少许《乡村振兴战略下传统村落文化旅游设计》——2023学生旅行季许少辉八月新书想象和世界一样宽广 地球的某一片红薯地中秋圆辉少许《乡村振兴战略下传统村落文化旅游设计》——2023学生旅行季许少辉八月新书想象和世界一样宽广

基于微信小程序的民宿短租酒店预订系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…