stm32入门学习14-电源控制

news2024/11/17 15:30:39

有时候我们的程序中有些触发执行条件,有时这些触发频率很少,我们的程序就一直在循环,这样就很浪费电,我们可以通过PWR电源控制来实现低功耗模式,即只有在触发时才执行程序,其余时间可以关闭一些没必要的设备以达到省电的目的

低功耗模式有三种,分别为睡眠模式、停机模式和待机模式,他们的电量损耗:睡眠模式>停机模式>待机模式,但是他们的唤醒条件则和电量损耗成相反的关系。睡眠模式唤醒比较简单,内部中断和外部中断都可以唤醒睡眠模式;停机模式次之,只有外部中断才可以唤醒停机模式,待机模式唤醒方式最难,只有指定的几个中断事件才可以唤醒

(一)睡眠模式

睡眠的开启十分简单,只需要在程序的最后加一句代码即可,这里的中断使用外部中断,外部中断的配置主要有这几步:时钟、时钟通道、EXTI、NVIC

void key_init()
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	
	GPIO_InitTypeDef gpio_init;
	gpio_init.GPIO_Mode = GPIO_Mode_IPU;
	gpio_init.GPIO_Pin = GPIO_Pin_6;
	gpio_init.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOA, &gpio_init);
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);
	
	EXTI_InitTypeDef exti_init;
	exti_init.EXTI_Line = EXTI_Line6;
	exti_init.EXTI_Mode = EXTI_Mode_Interrupt;
	exti_init.EXTI_Trigger = EXTI_Trigger_Rising;
	exti_init.EXTI_LineCmd = ENABLE;
	EXTI_Init(&exti_init);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef nvic_init;
	nvic_init.NVIC_IRQChannel = EXTI9_5_IRQn;
	nvic_init.NVIC_IRQChannelPreemptionPriority = 1;
	nvic_init.NVIC_IRQChannelSubPriority = 1;
	nvic_init.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&nvic_init);
}

我们只要在程序要进入睡眠模式的地方加入一句__WFI即可进入睡眠模式,当睡眠模式被唤醒后,将从进入睡眠模式的地方继续执行代码

int main()
{
	key_init();
	OLED_Init();
	while(1)
	{
		if (flag == 1)
		{
			OLED_ShowString(1, 1, "key_down");
			Delay_ms(500);
			OLED_Clear();
			flag = 0;
		}
		
		__WFI();
	}
	return 0;
}

这里的现象是我们按下按键产生上升沿外部触发,OLED屏幕上会显示key_down,然后进入睡眠模式,等待下一次触发

睡眠模式不仅可以用外部中断触发,也可以用内部中断触发

(二)停机模式

停机模式开启比睡眠模式稍微复杂,由于停机模式只能被外部中断或事件唤醒,因此还是采用按键唤醒操作,进入停机模式前要先开启电源管理的时钟,接着在要进入停机模式的地方调用进入睡眠模式的代码即可

第一个参数是配置调节器在停止模式的工作状态,第二个参数是配置停止模式的唤醒方式

int main()
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
	OLED_Init();
	external_interrupt_init();
	while (1)
	{
		if (flag == 1)
		{
			OLED_ShowString(1, 1, "button_down");
			Delay_ms(500);
			OLED_Clear();
			flag = 0;
		}
		PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI);
		SystemInit();
	}
	return 0;
}

值得注意的是,停机模式会把72MHz的时钟晶振给关闭,而在唤醒停机模式后却不会自动打开,如果我们没有手动打开,则程序以HSI的8MHz的时钟运行,这会导致程序的运行速度不符合我们的预期,尤其是在显示时长方面能明显感觉到显示时间变长,由于停机模式被唤醒后也是在进入停机模式的地方重新开始执行代码,我们只要在进入停机模式的代码后面加入系统初始化函数即自动帮助我们初始化系统时钟;

(三)待机模式

待机模式只能被指定的几个事件唤醒,待机模式和停机模式一样,只要调用pwr模块的一个函数即可进入,当然事先要先使能其时钟

这里选择使用RTC闹钟唤醒,我们从当前时间开始,每隔1小时唤醒一次,然后显示1分钟唤醒时候的时间,然后进入待机模式

int main()
{
	SystemInit();
	unsigned int t;
	struct tm* time;
	clock_bkp_init();
	clock_init();
	OLED_Init();
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
	
	while (1)
	{
		t = RTC_GetCounter();
		time = clock_read_time();
		RTC_SetAlarm(t+60*60);
		OLED_ShowString(1, 1, "XXXX-XX-XX");
		OLED_ShowString(2, 1, "xx:xx:xx");
		OLED_ShowNum(1, 1, time->tm_year, 4);
		OLED_ShowNum(1, 6, time->tm_mon, 2);
		OLED_ShowNum(1, 9, time->tm_yday, 2);
		OLED_ShowNum(2, 1, time->tm_hour, 2);
		OLED_ShowNum(2, 4, time->tm_min, 2);
		OLED_ShowNum(2, 7, time->tm_sec, 2);
		Delay_s(60);
		OLED_Clear();
		
		PWR_EnterSTANDBYMode();
	}
}

这里在唤醒待机模式后,其时钟不是72MHz时钟,我们要手动调用系统初始化函数来调节,但是这里的系统初始化函数不能放在待机模式后面调用,因为待机模式在被唤醒后是从程序开始的地方执行(相当于按了一次复位键),所以我们把系统初始化函数放在程序开头;

(四)总结

通过多种stm32的低功耗模式学习,我们了解了stm32多种低功耗模式的使用以及之间的区别,通过进入低功耗模式,可以让一些在长时间处于空循环的程序更加省电

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

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

相关文章

zdppy+vue3+onlyoffice文档管理系统项目实战 20240812上课笔记

遗留问题 1、增加新建和导入按钮&#xff0c;有按钮了&#xff0c;但是还没有完善&#xff0c;图标还不对&#xff0c;需要解决 2、登录功能 3、用户管理 4、角色管理 5、权限管理 6、分享功能 解决新建和导入的图标问题 解决代码&#xff1a; <a-button type"prim…

数据中台之数据开发-算法开发

目录 一、数据智能化挑战 二、算法开发的作用 三、算法架构与算法使用场景 3.1 算法架构总览 3.2 算法的适用场景 3.2.1 金融风控和反欺诈 3.2.2 文本挖掘分析 3.2.3 广告精准营销 3.2.4 个性化推荐 四、 算法开发涉及的内容 4.1 建模 4.1.1 可视化建模 4.1.1.1 可…

Vue3使用el-table实现多级表头合并列

不难发现&#xff0c;需要多级表头的列只需要在外面包一层el-table-column起名字即可 <el-table :data"tableData" style"width: 100%"><el-table-column type"index" label"序号" width"100" align"center&q…

Operator

国内operator学习大全 simple example 一、实践 二、理论问答 1.这张图属于 client-go 的 Informer 框架 配置和 Restclient或者 ClientSet 准备好后就可以通过客户端 CRUD k8s集群里面的资源 reflector 就是 watch和list k8s api 。就是监控资源变化和列出资源 ResourceVers…

最新图像修复论文汇总(2024年以来)(三)

汇总了自2024年以来新提出的高质量图像修复工作&#xff0c;包含扩散模型、transformer、mamba、sam等最前沿的技术&#xff0c;其中一些是ICLR、ICML、CVPR、ECCV、ACM MM 2024年的新作。 这里是第三部分&#xff0c;还有两部分请参阅。 最新图像修复论文汇总&#xff08;20…

python处理时间,按照周分割时间段

在实际的开发中&#xff0c;我们经常要设计一些工具类&#xff0c;对于时间来说&#xff0c;有时候需要将其处理成时间段。 例如&#xff0c;对于2024年08月01日到2024年08月16日的时间段&#xff0c;我们如何将其处理成时间段[2024-08-01, 2024-08-03], [2024-08-04, 2024-08-…

嘉立创EDA个人学习笔记1(PCB板介绍)

前言 本篇文章属于嘉立创EDA的学习笔记&#xff0c;来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 嘉立创EDA-PCB设计零基础入门课程&#xff08;54集全&#xff09;_…

安卓应用开发学习:手机摇一摇功能应用尝试--摇骰子和摇红包

一、引言 前几天&#xff0c;我发布的日志《安卓应用开发学习&#xff1a;查看手机传感器信息》记录了如何查看手机传感器的信息&#xff0c;通过上述的方法&#xff0c;可以看到我的OPPO手机支持19种传感器。本篇日志就记录一下常见的加速度传感器的典型应用——“摇一摇”功…

ESP32添加组件02

1.接ESP32创建工程01&#xff0c;快捷键CtrlShiftp 2.输入组件的名称&#xff0c;然后按Enter键 3.创建结果如下图所示 目录结构如下 一级 component --文件夹 二级 led ---文件夹 led.c c文件 CMakeList.txt txt文件 三级 include 文件夹 led.h c头文件 4.主要代码 //led.c…

机器学习之 K 近邻算法图像识别实战

引言 在机器学习领域&#xff0c;K 近邻算法&#xff08;K-Nearest Neighbors, KNN&#xff09;是一种基于实例的学习方法&#xff0c;它可以根据样本之间的距离来进行分类或回归。本文将介绍如何使用 KNN 算法进行手写数字识别&#xff0c;并通过一个实际的例子来演示整个过程…

GPU纹理压缩格式(详解ETC1)

参考 纹理压缩格式原理概述&#xff1a; 你所需要了解的几种纹理压缩格式原理Compressed GPU texture formats – a review and compute shader decoders – part 1 ETC1格式&#xff1a;ETC1压缩纹理格式详解 ETC1 将4x4像素&#xff08;16RGB8位共384位&#xff0c;48字…

ChatGPT下的Java代码审计

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s?…

爬虫:scrapy基本使用:链家实例

scrapy基本使用 Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架&#xff0c;用途非常广泛。 框架的力量&#xff0c;用户只需要定制开发几个模块就可以轻松的实现一个爬虫&#xff0c;用来抓取网页内容以及各种图片&#xff0c;非常之方便。 安…

【原创】java+swing+mysql的KTV管理系统设计与实现

个人主页&#xff1a;程序员杨工 个人简介&#xff1a;从事软件开发多年&#xff0c;前后端均有涉猎&#xff0c;具有丰富的开发经验 博客内容&#xff1a;全栈开发&#xff0c;分享Java、Python、Php、小程序、前后端、数据库经验和实战 开发背景&#xff1a; 随着社会的发展…

语义分割:YOLOv5的分割模型训练自己的数据集(从代码下载到实例测试)

文章目录 前言一、环境搭建二、构建数据集三、修改配置文件①数据集文件配置②权重下载③模型文件配置④训练参数配置 四、模型训练和测试模型训练模型测试 总结 前言 提示&#xff1a;本文是YOLOv5的分割模型训练自己数据集的记录教程&#xff0c;在调试前需要本地已配置好CU…

测试资料1111

什么是软件 软件是控制计算机硬件工作的工具 软件产生过程 需求产生&#xff08;客户、用户&#xff09;、需求文档&#xff08;需求文档&#xff09;、设计效果图&#xff08;UI设计师&#xff09;、产品开发&#xff08;研发人员&#xff09;、产品测试&#xff08;测试人…

multiple definition of `xxxx`问题解决(vscode开发stm32)

一、背景 开发时遇到如下问题&#xff1a; 在Tim.h文件夹中定义了一个结构体变量 TIM_HandleTypeDef htim2;//定时器实例变量 其余的文件在引用此变量时都加上了#include "Tim.h" 但编译时&#xff0c;终端报错&#xff1a; multiple definition of htim2 全局搜…

hs_err_pid.log分析

hs_err_pid.log 文件是 Java 虚拟机&#xff08;JVM&#xff09;在遇到致命错误&#xff08;如崩溃或内部错误&#xff09;时生成的错误日志文件。这个文件包含了关于崩溃的详细信息&#xff0c;可以帮助开发者或系统管理员诊断和解决问题。 hs_err_pid.log文件位置和命名 文…

maven导入依赖后依然爆红?

今天遇到了maven导入依赖后依然爆红的问题&#xff0c;检查了本地仓库发现依赖包已经全有了但是IDEA这边的XML文件里面依然大量爆红&#xff1b;并且我重新将之前的本地仓库相关的依赖包甚至其上级目录进行了删除后重新导入&#xff0c;但问题依然没有解决&#xff1b;因此我非…

【大模拟】逻辑回环类

区块链 AcWing 3285. 区块链 - AcWing 区块链涉及密码学、哈希算法、拜占庭问题、共识算法、故障模型、网络模型等诸多知识&#xff0c;也在金融等领域有广泛的应用。 本题中&#xff0c;我们需要实现一个简单的区块链系统。 在一个分布式网络中&#xff0c;有 nn 个节点通…