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://xiahunao.cn/news/2981128.html

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

相关文章

MongoDB数据恢复—拷贝MongoDB数据库文件后无法启动服务的数据恢复案例

服务器数据恢复环境: 一台Windows Server操作系统服务器,服务器上部署MongoDB数据库。 MongoDB数据库故障&检测: 工作人员在未关闭MongoDB数据库服务的情况下,将数据库文件拷贝到其他分区。拷贝完成后将原MongoDB数据库所在分…

图像处理之Retinex算法(C++)

图像处理之Retinex算法(C) 文章目录 图像处理之Retinex算法(C)前言一、单尺度Retinex(SSR)1.原理2.代码实现3.结果展示 二、多尺度Retinex(MSR)1.原理2.代码实现3.结果展示 三、带色…

探索ChatGPT在提高人脸识别与软性生物识准确性的表现与可解释性

概述 从GPT-1到GPT-3,OpenAI的模型不断进步,推动了自然语言处理技术的发展。这些模型在处理语言任务方面展现出了强大的能力,包括文本生成、翻译、问答等。 然而,当涉及到面部识别和生物特征估计等任务时,这些基于文…

STM32,复位和时钟控制

外部时钟 HSE 以后需要用到什么就这样直接拿去配就行了

用户中心 -- 插件使用 插件使用思路

易错注意点 1 5.1启动类 & 入口类 需保持一致 网址: 第一节课,用户管理--后端初始化,项目调通。二次翻工2-CSDN博客 一、 用户管理 框架 网址: 用户管理 --汇总 -- 明细-CSDN博客 1.2 更改路径,并生效 网址…

使用linux,c++,创作一个简单的五子棋游戏

#include <iostream> #include <vector> #include <unordered_map> using namespace std; // 棋盘大小 const int BOARD_SIZE 15; // 棋子类型 enum ChessType { EMPTY, BLACK, WHITE }; // 棋盘类 class ChessBoard { private: vect…

【Transformer】detr之decoder逐行梳理(三)

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 detr之decoder逐行梳理 1. 整体 decoder由多个decoder layer串联构成 输入 tgt: query是一个shape为(n,bs,embed),内容为0的tensormemory: encoder最…

BERT-CRF 微调中文 NER 模型

文章目录 数据集模型定义数据集预处理BIO 标签转换自定义Dataset拆分训练、测试集 训练验证、测试指标计算推理其它相关参数CRF 模块 数据集 CLUE-NER数据集&#xff1a;https://github.com/CLUEbenchmark/CLUENER2020/blob/master/pytorch_version/README.md 模型定义 imp…

【北京迅为】《iTOP-3588开发板系统编程手册》-第20章 socket 应用编程

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

deep learning

谷歌在线notebook 一、基本数据类型与用法 1.torch.tensor(张量) 按照维度不同(中括号的对数)&#xff0c;可以用torch.tensor创建scalar(标量)、vector(向量)、matrix(矩阵)&#xff0c; 一般的&#xff0c;一维是标量&#xff0c;二维是向量&#xff0c;三维是矩阵&#…

七星创客新零售系统:颠覆性商业模式的崛起

大家好&#xff0c;我是微三云周丽&#xff0c;今天给大家分析当下市场比较火爆的商业模式&#xff01; 小编今天跟大伙们分享什么是七星创客新零售系统&#xff1f; 随着经济的快速发展和科技的不断进步&#xff0c;商业模式的革新成为了企业发展的关键。在这个新旧动能转换、…

sudo的设置

sudo指令就是提高你的用户权限&#xff0c;用来完成root可以完成的工作&#xff0c;但是有一个前提&#xff0c;就是被root添加到信任名单中&#xff0c;接下来我们要讲解如何在root中添加用户到信任名单中。 在root中输入指令&#xff1a; 即可到达添加信用列表的位置&#x…

【漏洞复现】卡车卫星定位系统 /user/create接口处存在未授权密码重置漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

Linux:进程与计划任务

文章目录 Linux&#xff1a;进程与计划任务一、进程1、进程是什么2、进程状态 二、列出进程命令1、查看静态的进程统计信息——“ps”Play1&#xff1a;“ps aux”Play2:ps -elf 2、查看静态的进程统计信息——“top”段首解析进程信息区解释 三、运行与终止进程3.1、运行进程3…

【网络安全】对称加密、非对称加密以及密钥分配

目录 1、对称加密 2、非对称加密 3、如何分配对称密钥&#xff1f; 4、如何分配非对称密钥&#xff1f; 1、对称加密 所谓对称加密&#xff0c;就是指加密密钥与解密密钥都使用相同的密钥。如下图所示&#xff0c;通信双方使用的就是对称加密密钥。//代表&#xff1a;DES和…

军工单位安全内网文件导出,怎样做到严密的安全管控?

军工单位是指承担国家下达的军事装备、产品研制、生产计划任务的企、事业单位&#xff0c;主要包括电子工业部、航空工业总公司、航天工业总公司、兵器工业总公司、核工业总公司、船舶工业总公司、中国工程物理研究院及各省国防工业办公室等。 军工单位的特点主要体现在以下几个…

多目标应用:基于非支配排序粒子群优化算法NSPSO求解无人机三维路径规划(MATLAB代码)

一、无人机多目标优化模型 无人机三维路径规划是无人机在执行任务过程中的非常关键的环节&#xff0c;无人机三维路径规划的主要目的是在满足任务需求和自主飞行约束的基础上&#xff0c;计算出发点和目标点之间的最佳航路。 1.1路径成本 无人机三维路径规划的首要目标是寻找…

学习笔记记录ensp中防火墙配置(trust,unstrus,dmz 资源下载可用)

实验目的&#xff0c;通过配置防火墙控制相互之间的访问&#xff0c;拓扑图如下 资源已上传&#xff0c;注意lsw1和ar2的路由表到各个网段的路由表配置&#xff0c;通过防火墙来控制各个区域能否访问成功。 防火墙通过cloud2链接&#xff0c;方便登录网页配置防火墙策略。防火…

js的算法-交换排序(快速排序)

快速排序 基本思想 快速排序的基本思想是基于分治法的&#xff1a;在待排序表L【1...n】中任意取一个元素p 作为枢轴&#xff08;或基准&#xff0c;通常取首元素&#xff09;。通过一趟排序将待排序表划分为独立的两部分L【1...k-1】和L【k1...n】;这样的话&#xff0c;L【1…

数据结构 第六章 树与二叉树(二)

&#x1f680; 【考纲要求】二叉树的定义及其主要特征&#xff1b;二叉树的顺序存储和链式存储 二、二叉树的概念 1&#xff09;什么是二叉树&#xff1f; 对于二叉树来说&#xff0c;它是一个特殊的树形结构&#xff0c;其每个节点都最多有两个孩子&#xff08;即节点的度最…