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

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.rhkb.cn/news/316570.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang基础1-基本类型、if、switch、string

基本类型 bool 整数:byte(相当于uint8), rune(相当于int32), int/uint ,int8/uint8 ,int16/uint16 ,int32/uint32 ,int64/uint64 浮点数: float32 ,float64, complex64 ,complex128 array(值类型)、slice、map、chan(引用类型…

西瓜书学习——决策树形状、熵和决策树的本质

文章目录 决策树形状监督学习算法分类与回归 熵信息熵香农熵 (Shannon Entropy) - H(X)联合熵 (Joint Entropy) - H(X, Y)条件熵 (Conditional Entropy) - H(Y|X)互信息 (Mutual Information) - I(X; Y)相对熵 (Relative Entropy) / KL散度 (Kullback-Leibler Divergence) - DK…

小程序使用阿里巴巴矢量图标库

一、登录官网 www.iconfont.cn 二、在搜索框中搜索想要的图标,将鼠标移动到图标上会看到三个标记 可以使用下载,直接使用: 可以使用css文件使用: 首先点击购物车样式的选项,而后点击下图位置: 点击自己创…

【python笔记】datafram的时间动态可视化 pyecharts地图

import pandas as pd# 假设DataFrame是这样的: df pd.DataFrame({ year: [2014, 2015, 2016, 2014, 2015, 2016, 2014, 2015, 2016], province: [广东省, 广东省, 河南省, 湖南省, 北京市, 北京市, 上海市, 新疆维吾尔自治区, 上海市], values: [100, 150, 75…

tomcat 配置支持 ssl 附效果图

1、修改tomcat配置文件server.xml: vim ./conf/server.xml 把配置文件&#xff1a; <Connector port"8088" Server" " protocol"HTTP/1.1"connectionTimeout"20000"redirectPort"8443" URIEncoding"UTF-8" …

可平滑替代FTP的FTP替代解决方案,具有哪些强大功能?

FTP是一种广泛使用的文件传输协议&#xff0c;主要用于在网络上的计算机之间传输文件。具有以下特点&#xff1a; 1.简单易用&#xff1a;FTP协议相对简单&#xff0c;易于设置和使用&#xff0c;许多操作系统和应用程序都内置了对FTP的支持。 2.广泛的客户端支持&#xff1a…

Vue生命周期都有哪些?

定义 Vue的生命周期就是实例从创建到销毁的一个过程&#xff0c;即从创建、初始化数据、编译模板、挂载Dom($el)->渲染、更新->渲染&#xff0c;卸载等一系列的过程。el是挂载点如<div id"app"></div>。 Vue的生命周期分为八个阶段 1.beforeCreate…

Spring Data JPA数据批量插入、批量更新真的用对了吗

Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 前言 在前两篇文章已经介绍过&#xff0c;在使用Spring Data JPA时&#xff0c;DAO层的Respository通过继承J…

【基础算法总结】双指针算法二

双指针 1.有效三角形的个数2.和为S的两个数字3. 三数之和4.四数之和 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.有效三角形的个数 题目…

react实现时钟翻牌效果

需求&#xff1a;随着数字的变动要求有时钟翻动动效 问题&#xff1a;只在加载时有动效 解决方案&#xff1a;通过判断数字改变&#xff08;这里通过新旧数值变动来判断&#xff0c;不贴代码啦&#xff09;&#xff0c;每次变动的时候手动把animationIterationCount设置为inf…

Android --- 网络请求

通常在 Android 中进行网络连接一般使用 Scoket 和HTTP&#xff0c;HTTP 请求方式比 Scoket 多。HTTP 请求一般采用原生的 HttpClient 和 HttpUrlConnection 的两种网络访问方式&#xff08;系统自带的&#xff09;。但是在 Android 5.0 的时候 Google 就不推荐使用 HttpClient…

Python自学篇3-PyCharm开发工具下载、安装及应用

一、Python开发工具 自学篇1中讲到了安装Python之后出现的几个应用程序&#xff0c;其中IDLE、Python.exe都可以用来编写python程序&#xff0c;也可以进行调试&#xff1b;但是比较基础&#xff0c;比较原始&#xff0c;调试不方便&#xff0c;界面也不友好&#xff0c;需要更…

笔记本电脑耗电和发热比较厉害怎么处理

工作中会遇到有同事反馈笔记本电脑耗电和发热比较厉害&#xff0c;主要检查以下几个地方 1、CPU频率 很多人觉得是cpu使用率高就代表电脑跑得快&#xff0c;发热量就大&#xff0c;其实不是的&#xff0c;主要是看的cpu频率&#xff0c;频率越高&#xff0c;电脑发热量越大。如…

Visual Studio中怎样更改Nuget程序包源

场景 Visual Studio 2019 在使用NuGet添加依赖包时&#xff0c;在预览中搜索不到程序包。 排查下NuGet的程序包源为本地。 将程序包源修改下。 实现 在解决方案上右击选择管理解决方案中的NuGet程序包(在 Visual Studio 中打开“工具”>“选项”>“NuGet 包管理器”…

idea上传项目到gitee(码云)

1、打开码云&#xff0c;新建仓库 2、创建 3、这就是创建成功的页面 4、复制仓库地址&#xff0c;后面需要用到 2、打开我们的项目&#xff1a;例如我现在的项目 1、idea创建git仓库 2、选择我们项目文件夹的目录 3、查看文件是否变色&#xff0c;变色表示成功了 4、添加到缓…

STM32的GPIO输入和输出函数详解

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. GPIO模式 2. GPIO输出 2.1 RCC 2.2 GPIO 3. 代码示例 3.1 RCC时钟 3.2 GPIO初始化 3.3 GPIO输出函数 3.4 推挽输出和开漏输出 4. GPIO输入 4.1 输入模式 4.2 数据读取函数 5. C语言语法 1…

为什么很多企业都使用OV SSL证书

我们要了解什么是SSL OV证书 SSL OV证书&#xff0c;即组织验证型SSL证书&#xff0c;它要求证书颁发机构对申请证书的组织进行身份验证&#xff0c;确认组织的真实性后&#xff0c;才会发放证书。这种验证方式提高了安全性&#xff0c;因为它确保了证书背后的实体是真实存在的…

C语言(操作符)1

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

基于Springboot的点餐平台

基于SpringbootVue的点餐平台的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页展示 菜品信息 菜品资讯 购物车 后台登录 用户管理 菜品分类管理 菜品信息管理 …

【Linux】dlopen: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29‘ not found

[30116] Error loading Python lib /tmp/_MEIlvdUu6/libpython3.8.so.1.0: dlopen: /lib/x86_64-linux-gnu/libm.so.6: version GLIBC_2.29 not found (required by /tmp/_MEIlvdUu6/libpython3.8.so.1.0)1 cd到指定路径 cd /usr/local 2 下载 wget http://ftp.gnu.org/gnu/gl…