STM32 学习13 低功耗模式与唤醒

news2024/11/13 9:25:42

STM32 学习13 低功耗模式与唤醒

  • 一、介绍
    • 1. STM32低功耗模式功能介绍
    • 2. 常见的低功耗模式
      • (1)**睡眠模式 (Sleep Mode)**:
      • (2)**停止模式 (Stop Mode)**:
      • (3)**待机模式 (Standby Mode)**:
  • 二、睡眠模式
    • 1. 进入睡眠模式
    • 2. 唤醒
    • 3. 代码实现
      • (1)exti_utils.c
      • (2)main.c
  • 三、停机模式
  • 四、待机模式
    • 1. 进入待机模式的方法
    • 2. 退出待机模式的方法
    • 3. 代码实现
      • (1)进入待机模式
      • (2)主函数

一、介绍

1. STM32低功耗模式功能介绍

STM32微控制器提供了多种低功耗模式,以便在需要节能的应用场景中最大限度地减少功耗。默认情况下,系统复位或上电复位后,微控制器进入运行模式。在运行模式下,HCLK为CPU提供时钟,并执行程序代码。
当MCU不需要运行时,就可以利用低功耗模式来节省功耗。STM32有多种低功耗模式,用户可以根据电源消耗、启动速度、可唤醒资源来选择最佳的低功耗模式。

2. 常见的低功耗模式

STM32微控制器提供了多种低功耗模式,以便在需要节能的应用场景中最大限度地减少功耗。以下是一些常见的STM32低功耗模式及其功能介绍:

(1)睡眠模式 (Sleep Mode):

  • 功能:在此模式下,CPU暂停执行,并且大多数内部设备被关闭。只有一些关键外设(例如RTC,看门狗定时器)可能仍然处于活动状态。
  • 特点:功耗极低,但系统仍然可以在外部事件触发时快速唤醒。

(2)停止模式 (Stop Mode):

  • 功能:在此模式下,CPU和大多数外设都被停止,只有RTC和一些外部中断仍然处于活动状态。停止模式比睡眠模式功耗更低,但唤醒时间略长。
  • 特点:可实现极低功耗,适用于长时间的睡眠状态。

(3)待机模式 (Standby Mode):

  • 功能:这是最低功耗的模式之一,内核1.8V电源关闭、几乎所有设备都被关闭,只有RTC和一些少量的外部唤醒源处于活动状态。
  • 特点:待机模式下的功耗极低,但唤醒时间相对较长。
    下表是来自《STM32F1xx中文参考手册》的几种低功耗模式的比较:
    在这里插入图片描述

二、睡眠模式

1. 进入睡眠模式

进入睡眠模式时,Cortex™-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时
钟(SysTick)等仍在运行。

可以通过执行WFI或WFE指令进入睡眠状态 。

进入睡眠模式有两种机制:

  1. SLEEP-NOW:如果系统控制寄存器SLEEPONEXIT位被清除,当WRI或WFE被执行时,MCU立即进入睡眠模式;
  2. SLEEP-ON-EXIT:如果SLEEPONEXIT位被设置,系统从最低优先级的中断处理程序中退出时,MCU立即进入睡眠模式。

2. 唤醒

  • 如果执行WFI指令进入睡眠模式,任意一个被嵌套向量中断控制器响应的外部中断都能将系统从睡眠模式唤醒 ;
  • 如果执行WFE指令进入睡眠,则一旦发生唤醒事件时,MCU将唤醒。

两种模式的进入、退出比较:

模式说明
SLEEP-NOW进入在以下条件下执行WFI(等待中断)或
WFE(等待事件)指令:
– SLEEPDEEP = 0 和
– SLEEPONEXIT = 0
参考Cortex-M3系统控制寄存器
SLEEP-NOW退出如果执行WFI进入睡眠模式:
中断:参考中断向量表(表54)
如果执行WFE进入睡眠模式:
唤醒事件:参考唤醒事件管理(第9.2.3节)
SLEEP-ON-EXIT进入在以下条件下执行WFI指令:
– SLEEPDEEP = 0和
– SLEEPONEXIT = 1
参考Cortex™-M3系统控制寄存器
SLEEP-ON_EXIT退出中断:参考中断向量表

3. 代码实现

下面使用按键中断响应事件进入低功耗模式,可以使用更高级别的事件唤醒。运行效果是数码管显示0-9数字,当按下开发板的“下”时,MCU休眠,数码管不再变化。 再按下开发板的“右”时,MCU退出休眠。

(1)exti_utils.c

/**
 * @brief  外部中断3中断服务函数
*/
void EXTI3_IRQHandler(void) {
    if (EXTI_GetITStatus(EXTI_Line3) != RESET) {
        delay_ms(10);
        if (key_down_value  == 0) {
					 __WFI();
           // led_lightn(1);
            EXTI_ClearITPendingBit(EXTI_Line3); // 清除中断标志位
            return;
        }
    }
}
/**
 * @brief  外部中断4中断服务函数
*/
void EXTI4_IRQHandler(void) {
    if (EXTI_GetITStatus(EXTI_Line4) != RESET) {
        delay_ms(20);
        if (key_right_value  == 0) {
            //led_lightn(3);
					
					  if(EXTI_GetFlagStatus(EXTI_Line4) == SET){
								printf("exit sleep\r\n");
						}
						EXTI_ClearITPendingBit(EXTI_Line4); // 清除中断标志位
            return;
        }
    }
}

(2)main.c

#include "gpio_utils.h"
#include "stm32f10x.h"
#include "sys_tick_utils.h"
#include "led_utils.h"
#include "usart_utils.h"
#include "stdio.h"
#include "exti_utils.h"

// 主函数
int main(void)
{
	GPIO_Configuration(); // 调用GPIO配置函数
	// tick 初始化
	sys_tick_init(72);
	led_all_off();
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	USART3_Init(9600);
	printf("starting...");

	// led 初始化
	custom_led_init();
	custom_exti_init();

	int i = 0;
	
	while (1) // 无限循环
	{
		delay_ms(990);
		printf("i=%d", i);
		led_lightn(i);
		i++;
		if(i>9){
			i=0;
		}
		
	}
}

三、停机模式

停机模式在睡眠模式的基础上,关闭了所有1.8V区域的时钟,停止前会保存运行状态信息,恢复后可以接着停机前的程序继续运行。
停机模式本文不详细介绍。

四、待机模式

在停机模式的基础上,不再保存运行信息,系统复位从头运行程序,电源控制/状态寄存器PWR_CSR会指示内核由待机状态退出。

1. 进入待机模式的方法

  • 设系统控制寄存器的 SLEEPDEEP位;
  • 设置电源控制寄存器PWR_CR中的PDDS位;
  • 清除电源控制/状态寄存器(PWR_CSR)中的WUF位。

配置步骤如下:

  1. 使能电源时钟
  2. 设置唤醒源
  3. 进入待机模式

2. 退出待机模式的方法

  • WKUP引脚的上升沿;
  • RTC闹钟事件的上升沿;
  • NRST引脚上外部复位;
  • IWDG复位。

待机模式下,大部分IO引脚处于高阻态,复位引脚、TAMPER(PC13)引脚、WKUP(PA0)引脚可用。
从实验用的开发板原理图上可以看到,WKUP引脚已经接到按键的K_UP:
在这里插入图片描述
下面的示例将使用KEY_UP唤醒MCU。

3. 代码实现

下面示例程序与前例类似 , LED按顺序显示0-9数字 。 当按下“下”按键时,进入 待机模式。
通过K_UP按键唤醒。与睡眠模式不同,进入待机模式后,数码管不再显示。

注意使用相关库函数,需要引用 stm32f10x_pwr.c 文件。
在这里插入图片描述

(1)进入待机模式

standby_utils.c

#include "standby_utils.h"

/**
* @brief  进入待机模式
*/
void Standby_Enter(void){
	// ¿ªÆôʱÖÓ
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
	// ÉèÖû½ÐÑÔ´,ʹÓÃWakeUpPin»½ÐÑ
	PWR_WakeUpPinCmd(ENABLE);
	// Çå¿Õ±êÖ¾
	PWR_ClearFlag(PWR_FLAG_WU);
	// ½øÈë´ý»úģʽ
	PWR_EnterSTANDBYMode();
}

(2)主函数

#include "gpio_utils.h"
#include "stm32f10x.h"
#include "sys_tick_utils.h"
#include "led_utils.h"
#include "usart_utils.h"
#include "stdio.h"
#include "exti_utils.h"

// 主函数
int main(void)
{
	GPIO_Configuration(); // 调用GPIO配置函数
	// tick 初始化
	sys_tick_init(72);
	led_all_off();
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	USART3_Init(9600);
	printf("starting...");

	// led 初始化
	custom_led_init();
	custom_exti_init();

	int i = 0;
	
	while (1) // 无限循环
	{
		delay_ms(990);
		printf("i=%d", i);
		led_lightn(i);
		i++;
		if(i>9){
			i=0;
		}
		
	}
}


本系列文章代码开源地址:
https://gitee.com/xundh/stm32_arm_learn

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

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

相关文章

基于CAPL的BIN文件解析

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…

管理 Python 项目的艺术:在 PyCharm 中使用虚拟环境(以BPnP为例)

在 PyCharm 中使用虚拟环境对于 Python 项目开发具有多方面的重要作用,这些作用体现在提升项目管理的效率、保障代码的可运行性以及维护项目的长期稳定性等方面。以下是使用虚拟环境的几个关键好处: 1. 依赖管理和隔离 虚拟环境允许每个项目拥有…

Adobe Photoshop CC 2017无法打开解决方案

Adobe Photoshop CC 2017双击无反应,右键以管理员身份运行也没有反应 解决方案: 事件查看器中查看应用程序的事件 如果找到程序报错事件,网上下载ZXPSignLib-minimal.dll文件替换错误模块路径位置的该文件即可 ZXPSignLib-minimal.dll下载地…

20240423-bitlocker加密怎么解除

20240423-bitlocker加密怎么解除 2024/4/23 15:42 百度:bitlocker加密怎么解除 https://baijiahao.baidu.com/s?id1779469107112180136&wfrspider&forpc Bitlocker加密怎么解除 解除BitLocker加密的步骤如下: 打开“控制面板”:在…

重学java 20.面向对象 继承 下

对未来真正的慷慨,是把一切献给现在 —— 24.4.22 super和this 学习目标: 01.继承中构造方法的特点 02.super和this的具体使用 03.继承的特点 04.练习:为父类中private属性赋值 一、继承中构造方法的特点 1.注意: 在new子类对象时…

项目开发过程中的错误记录

一、VUE版本一致但是运行不起来。 管理员运行命令提示符 切换到可以看到package.json的目录下面 npm install --registryhttps://registry.npmmirror.com npm install npm run dev 二、git pull拉取不下来远程项目 三、ssm项目运行时,tomcat输出日志乱码 解决&am…

红黑树封装map和set(模拟实现)

troop主页 临近五一放假,祝大家节日快乐,我们的学习还在路上!! 在前面一章我们已经实现出了红黑树的基本框架,现在我们要有这个底层结构去封装map和set。 一 红黑树的迭代器 但在这之前我们要先把红黑树的迭代器实现出…

SRS WebRTC Whip 和 Whep 部署体验问题

whip 報錯 404 webrtc推流 小窗口一闪而过,然后查看f12回复404的报错信息 chrome版本: 正在检查更新 版本 123.0.6312.123(正式版本) (64 位) centos 7.9 源码安装部署, 代码分支5.0 完全按…

linux /openEuler/annocanda/SecretNote

国产操作系统欧拉(EulerOS)是华为公司自主研发并推广的开源操作系统。它基于Linux内核,旨在为各种设备提供统一的操作系统平台,从而为用户提供更加流畅、安全、可靠和智能的使用体验。 linux 中安装annocanda : Anaconda3-2024.0…

逆向修改app就可以游戏充值到账?

hello ,大家好, 现在市场仍然流行着非常多的传奇类游戏私服或者其他类型的游戏私服,随着私服越来越多(很多并不合法),越来越多的人加入了破解,逆向修改,或者代充的队伍并从中获利。这里我给大家分享一下这些做代充的常规的做法,以及大家作为游戏服务器如何避坑做强校验…

《LINUX运维从入门到精通 》:运维入门者的自学用书

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号:网络豆云计算学堂 座右铭:低头赶路,敬事如仪 个人主页: 网络豆的主页​​​​​ 写在前面 《Linux运维从入门到精通》从初学者角度…

NCF29A1 高端阻抗匹配

一、前言 Class E 高端 L-Front 匹配集成了额外的滤波器,提供了足够的谐波衰减,使 NCF29A1 与天线在比基频更高的频率下具有相当大的增益。向 PA 提供的阻抗和输出电容与表 1 ZPAOUT 所示相同。 二、原理图 图 1 高端 L-Front 匹配原理图 1&#xff…

【数据结构】AVL树(万字超详细 附动图)

一、前言 二、AVL树的性质 三、AVL树节点的定义 四、AVL树的插入 五、AVL树的平衡调整 六、AVL树的验证 6.1 验证有序 6.2 验证平衡 七、AVL树的删除 八、AVL树的性能和代码 一、前言 还没有学习过二叉搜索树的同学可以移步 【数据结构】二叉搜索树-CSDN博客https:/…

Acrobat Pro DC 2021:强大的PDF编辑软件

Acrobat Pro DC 2021是Adobe公司推出的一款全面而强大的PDF编辑软件,凭借其卓越的性能和丰富的功能,成为了PDF编辑领域的领军者。 Acrobat Pro DC 2021中文激活版下载 这款软件具备全面的PDF编辑功能,包括文本编辑、图片处理、页面组织等&…

Vue3引入高德地图js API 2.0

文章目录 前言一、地图加载1.本文准备环境2.引入库3.加载地图4.加载地图控件 二、POI搜索1.什么是poi搜索2.如何使用 三、绘制点标记与信息窗体1.场景描述2.案例3.信息窗体-链接路由跳转4.进阶-通过Marker自动触发标记点(非鼠标手动点击) 四、jsApi地图事…

指挥中心实战指挥平台-通信指挥类装备多链路聚合设备解决方案实例

一、建设目标及要求 坚持“一切为了实战、一切围绕实战、一切服务实战”的总要求,紧紧围绕大数据应用和自动化、智能化、智慧化这一主题主线,建设升级改造支队指挥中心,集成语音、视频、即时消息、短信、对讲、会议等多媒体通信能力&#xf…

AJAX——图片上传

图片上传流程 1.获取图片文件对象 2.使用FormData携带图片文件 3.提交表单数据到服务器&#xff0c;使用图片url网址 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible"…

埋点,自己写插件,自己写的按钮埋点,掘金同款投递简历

20分钟掌握 Vite 插件开发 - 掘金 vite的生命周期啥的 1.浏览器的控制台输出有样式的字 // const randomLetterPlugin ()>{ // const letters [wwwwwww,000000000000,888888888888]; // //随机获取一个字符并打印 // const printRandomLetter ()>{ // …

LCD彩屏显示方案选型攻略:从接口到GUI开发工具的全面评估

在现代人类社会&#xff0c;彩色显示技术是科技王国里最为绚丽夺目的技术奇葩&#xff0c;LCD彩屏通过显示实时信息并提供交互式的体验&#xff0c;将信息时代打扮得多姿多彩。无论是智能家电还是医疗健康设备领域&#xff0c;精美直观的LCD彩屏显示&#xff0c;往往能够为用户…

学习JFinal

1.五个配置类 configConstants&#xff08;配置&#xff09;&#xff1a; configRoute&#xff08;路由&#xff09;&#xff1a; 2.Controller层&#xff08;控制器&#xff09; 访问流程&#xff1a; Action&#xff1a; getPara&#xff1a; 参数说明&#xff1a;第一个参…