理解STM32的低功耗模式

低功耗模式简介

TM32的低功耗模式是特别设计来减少微控制器在不活跃状态下的能耗。这些模式允许STM32在保持核心功能的同时尽可能减少电力消耗,适合用在电池供电或需长期运行的场景。理解各种低功耗模式如何节能,主要包括以下几个方面:


关闭时钟信号:在微控制器非活跃阶段关闭CPU和不必要外围设备的时钟信号,减少硬件运行所消耗的能量。
降低工作频率:通过降低微控制器的工作频率,减少能量消耗。
停止不必要的外围设备:如果外围设备(如ADC,通讯接口)暂时不需要,将它们关闭或设置成低能耗状态。
利用休眠状态:在设备不需要执行任务时进入休眠状态,某些模块和处理器核心完全关闭,仅保持极少量电路活跃以保持必要状态或等待唤醒信号。
唤醒机制:在需要的时候,可以通过外部事件(如按键、定时器或其他中断源)快速唤醒微控制器。


通过对这些策略的应用,可以使STM32在不牺牲功能性的情况下,有效延长电池寿命,优化能源使用。

STM32的不同低功耗模式差异

Sleep模式:

特点:在该模式下,CPU停止工作,但所有外设仍然运行,时钟继续运转。
适用场景:当应用只需要暂时关闭CPU但外围设备(如ADC,通信接口)需要继续工作时使用。


Stop模式:

特点:进入Stop模式时,CPU和核心外围设备的时钟会停止,仅有部分唤醒源仍然运行,如外部中断和某些定时器。
适用场景:适用于需要长时间等待外部事件唤醒的应用,比如等待用户输入或外部信号。


Standby模式:

特点:Standby模式会关闭CPU、外围设备和时钟,只保留唤醒逻辑和备份寄存器。电源开关电路(PWR)的电源电压监测器(PVD)继续工作,可以监视电源电压。
适用场景:当设备不需要保留RAM内容且可以从复位状态恢复时使用,常见于需要极低功耗且稀疏唤醒的应用。


Shutdown模式:

特点:这是最节能的模式,几乎所有电源都会关闭,仅保持唤醒逻辑和少部分寄存器。除了低功耗唤醒和复位电路,收发器的唤醒引脚也保持激活。
适用场景:适合于极端省电场合,可以忍受较长的启动时间。


唤醒机制

Sleep模式下的唤醒:

中断信号:任何配置好的可用中断都可以从Sleep模式唤醒STM32,包括外部GPIO中断或内部模块产生的中断。
事件:像DMA传送完成或从等待模式中的事件可以唤醒。


Stop模式下的唤醒:

外部中断:通过配置的引脚检测到外部信号变化(如按键按下)可以唤醒STM32。
RTC唤醒:实时时钟(RTC)中断或者唤醒定时器到期事件可以从Stop模式中唤醒微控制器。


Standby模式下的唤醒:

唤醒引脚(Wake-up Pin):STM32的某些引脚可以配置为唤醒引脚,当这些引脚检测到特定信号(通常是高电平或低电平信号)时可以唤醒微控制器。
RTC事件:和Stop模式类似,具有唤醒功能的RTC事件也可以用来从Standby模式唤醒。


Shutdown模式下的唤醒:

唤醒引脚:即使在Shutdown模式,某些特定的唤醒引脚也是可以配置并激活的,并可以通过边沿或电平触发来唤醒微控制器。
RTC唤醒:实时时钟设定唤醒事件是另一种常见的从Shutdown模式中唤醒STM32的方式。

实战代码示例

Sleep模式:

#include "stm32f10x.h"void Enter_SleepMode(void) {// 以下是进入Sleep模式前的相关设置// 配置中断唤醒源等...// 设置SLEEPONEXIT位,CPU退出所有中断服务函数后直接进入睡眠模式SCB->SCR |= SCB_SCR_SLEEPONEXIT_Msk;// 进入Sleep模式__WFI(); // 使用WFI指令进入Sleep模式
}

Stop模式:

#include "stm32f10x.h"
#include "stm32f10x_pwr.h"
#include "stm32f10x_rcc.h"void Enter_StopMode(void) {// 先关闭所有用不到的外设的时钟以节省能耗RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, DISABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, DISABLE);// 其它外设时钟也要关闭// 配置中断唤醒源等...// 进入Stop模式PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
}

Standby模式:

#include "stm32f10x.h"
#include "stm32f10x_pwr.h"
#include "stm32f10x_rcc.h"void Enter_StandbyMode(void) {// 配置唤醒引脚或RTC等唤醒源// 设置PDDS位进入Standby模式PWR->CR |= PWR_CR_PDDS;// 清除Wake-up标志PWR->CR |= PWR_CR_CWUF;// 进入Standby模式__WFI();
}

Shutdown模式:

请注意,标准外设库不直接支持Shutdown模式,因为这是STM32L4系列种特有的模式,属于低功耗模式的一种。对于使用标准库的STM32F1系列,最接近于Shutdown模式的是Standby模式。

注意事项:

这些示例代码针对的是STM32F1系列的微控制器。对于其它系列(如STM32F4或STM32L4),代码会稍有不同,因为不同系列的STM32可能有轻微不同的低功耗模式功能。


在进入低功耗模式之前,通常需要关闭或配置为低能耗状态的外设,以及配置唤醒源或重置源。


上面的代码片段主要涉及到电源管理部分的代码,实际应用中还需要添加外设初始化、中断配置和必要的外围逻辑。


如需进入低功耗模式之前或唤醒后执行特定操作,请根据应用实际需要补充相关功能代码。


请根据实际的微控制器型号和开发需求,查阅对应的参考手册,在理解了每个函数和寄存器操作的含义后,将这些代码片段整合到你的项目中。

唤醒操作实战代码

进入STM32低功耗模式后,你需要提前配置好一个或多个唤醒源,并在唤醒后执行相应的操作。这些唤醒源通常包括外部中断、定时器、实时时钟(RTC)事件等。以下是如何配置唤醒源以及唤醒后如何执行特定操作的示例:

一、配置外部中断作为唤醒源

以配置GPIO为外部中断作为唤醒Stop模式为例:

#include "stm32f10x.h"
#include "misc.h"void EXTI0_IRQHandler(void) {if(EXTI_GetITStatus(EXTI_Line0) != RESET) {// 执行唤醒后的操作// ...// 清除中断标志位EXTI_ClearITPendingBit(EXTI_Line0);}
}void Configure_EXTI(void) {NVIC_InitTypeDef NVIC_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;// Configure NVICNVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; // Enable external interrupt channelNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0; // Preemption PriorityNVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0; // Sub PriorityNVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // Enable interrupt channelNVIC_Init(&NVIC_InitStructure);// Configure EXTI Line0EXTI_InitStructure.EXTI_Line = EXTI_Line0; // Line0EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // Interrupt modeEXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // Rising edge triggerEXTI_InitStructure.EXTI_LineCmd = ENABLE; // Enable lineEXTI_Init(&EXTI_InitStructure);
}void Enter_StopMode(void) {// 配置中断和停止模式等...// 进入Stop模式PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
}int main(void) {// 初始化代码,配置GPIO等...Configure_EXTI();Enter_StopMode();while(1) {// 微控制器醒来后会继续在这里执行}
}

二、配置实时时钟(RTC)唤醒

以RTC唤醒作为例:

#include "stm32f10x.h"
#include "stm32f10x_rtc.h"
#include "stm32f10x_pwr.h"
#include "misc.h"void RTC_IRQHandler(void) {if(RTC_GetITStatus(RTC_IT_ALR) != RESET) {// 执行唤醒后的操作// ...// 清除RTC闹钟中断RTC_ClearITPendingBit(RTC_IT_ALR);// 等待最近一次对RTC寄存器的写操作完成RTC_WaitForLastTask();}
}void Configure_RTC(uint32_t time) {// 启用PWR和BKP时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);// 允许访问备份寄存器PWR_BackupAccessCmd(ENABLE);// 备份寄存器复位BKP_DeInit();// 启用LSERCC_LSEConfig(RCC_LSE_ON);// 等待直到LSE稳定while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {}// 设置RTC时钟源RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);// 启用RTCRCC_RTCCLKCmd(ENABLE);// 等待RTC寄存器同步RTC_WaitForSynchro();// 等待最近一次对RTC寄存器的写操作完成RTC_WaitForLastTask();// 设置RTC预分频器,设置时钟为1HzRTC_SetPrescaler(32767);// 等待最近一次对RTC寄存器的写操作完成RTC_WaitForLastTask();// 设置唤醒时间RTC_SetAlarm(time);// 等待最近一次对RTC寄存器的写操作完成RTC_WaitForLastTask();// 允许闹钟中断RTC_ITConfig(RTC_IT_ALR, ENABLE);// 等待最近一次对RTC寄存器的写操作完成RTC_WaitForLastTask();
}int main(void) {NVIC_InitTypeDef NVIC_InitStructure;// 配置中断NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);// 配置RTC唤醒Configure_RTC(5); // 设置闹钟在5秒钟后触发Enter_StopMode();while(1) {// 微控制器醒来后会继续在这里执行}
}

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

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

相关文章

C++类和对象(下篇)

目录 一.再谈构造函数 二.static成员 三.友元 四.内部类 五. 再次理解类和对象 一.再谈构造函数 1.构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。 class Date { public:Date(int year, int month…

MES系统是怎么进行数据采集的?

在MES管理系统中,数据采集作为最基础也最为关键的一环,对于实现生产过程的透明化、可控好以及优化生产流程具有重要意义。 mes系统是怎么采集数据的? 一、PLC类数据采集:使用C#或C直接编程访问PLC(不需要花钱买组态软件或第三方软件) 二、…

HTML 学习笔记(四)图片

<!--通过图片标签"<img src "图片路径">"来调用图片在网页中进行显示--> <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthd…

PostgreSQL索引篇 | GiST索引

GiST索引 PostgreSQL版本为8.4.1 &#xff08;本文为《PostgreSQL数据库内核分析》一书的总结笔记&#xff0c;需要电子版的可私信我&#xff09; GiST&#xff08;Generalized Search Tree&#xff0c;通用搜索树&#xff09;是一种平衡的、树状结构的访问方法。 它在系统中…

【数学建模】传染病模型笔记

传染病的基本数学模型&#xff0c;研究传染病的传播速度、空间范围、传播途径、动力学机理等问题&#xff0c;以指导对传染病的有效地预防和控制。常见的传染病模型按照传染病类型分为 SI、SIR、SIRS、SEIR 模型等&#xff0c;按照传播机理又分为基于常微分方程、偏微分方程、网…

Redis特性与应用场景

Redis是一个在内存中存储数据的中间件&#xff0c;用于作为数据库&#xff0c;用于作为数据缓存&#xff0c;在分布式系统中能够发挥重要作用。 Redis的特性 1.In-memory data structures: MySQL使用表的方式存储数据&#xff0c;这意味着数据通常存储在硬盘上&#xff0c;并且…

python 网络库集锦

目录 通用网络库 网络爬虫框架 1.功能齐全的爬虫 2.其他 HTML/XML解析器 1.通用 2.清理 文本处理 自然语言处理 浏览器自动化与仿真 多重处理 异步网络编程库 队列 云计算 网页内容提取 WebSocket DNS解析 计算机视觉 通用网络库 1.urllib -网络库(stdlib)。…

【MATLAB】语音信号识别与处理:一维信号NLM非局部均值滤波算法去噪及谱相减算法呈现频谱

1 基本定义 一维信号NLM非局部均值滤波算法是一种基于非局部均值思想的滤波方法&#xff0c;它通过对信号进行分块&#xff0c;计算每个块与其他块之间的相似度&#xff0c;以非局部均值的方式去除噪声。该算法的主要思想是在一定范围内寻找与当前块相似的块&#xff0c;以这些…

分享一些实用性的大语言模型(GitHub篇)

1.多模态大模型 GitHub网址&#xff1a;haotian-liu/LLaVA&#xff1a;[NeurIPS23 Oral] 视觉指令调优 &#xff08;LLaVA&#xff09; 构建&#xff0c;旨在实现 GPT-4V 级别及以上的能力。 (github.com) 下面是LLaVA模型的介绍&#xff0c;作者都有一直维护和更新&#xff0c…

【leetcode热题】排序链表

给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4]示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0] 输出&#xff1a;[-1,0,3,4,5]示例 3&#xff1a; 输入…

操作系统:环境变量

目录 1.命令行参数 1.1.概念引入 1.2.命令行参数概念 2.环境变量 2.1.概念引入 2.2.环境变量概念 2.2.1常见的环境变量 2.3. 如何获取环境变量 2.3.1.Linux操作系统 2.3.2.代码获取 2.3.3.系统调用 2.4.环境变量的来源 2.5.环境变量的全局性 1.命令行参数 1.1.概念…

uniapp开发的跳转到小程序

uniapp开发的h5跳转到小程序 https://www.cnblogs.com/xiaojianwei/p/16352698.html uniapp拉起小程序 在uniapp中拉起小程序&#xff0c;可以使用官方提供的API uni.navigateToMiniProgram。以下是一个简单的示例代码&#xff1a; uni.navigateToMiniProgram({appId: 目标…

unity学习(54)——选择角色界面--解析赋值服务器返回的信息1

1.decode这种照猫画虎的工作 把逆向出来UserHandler.cs中的内容&#xff0c;融到自建客户端的MessageManager.cs中&#xff1a; 2.此时登录账号&#xff0c;马上显示当前账号下已有三名角色&#xff1a; 此时返回数据包中的command的值是1&#xff1a; 3.当注册玩家数超过三名…

【大厂AI课学习笔记NO.78】智能芯片产业人才能力图谱

有志于从事智能芯片产业的朋友&#xff0c;可以参考下上面的图谱。 比如C站的程序猿很多&#xff0c;那么技能能力中&#xff0c;你要掌握的就包括C/C、Python、Bash等常用的编程语言。 还要熟悉TensorFlow、PyTorch等主流的深度学习框架。 这两个框架&#xff0c;我们都介绍…

一 超级数据查看器 讲解稿 系统介绍

一 超级数据查看器 讲解稿 系统介绍 APP下载地址 百度手机助手 下载地址4 点此此处 以新页面方式 打开B站 教学视频 讲解稿 大家好&#xff0c;这里我给大家介绍一下超级数据查看器&#xff0c; 超级数据查看器。就是桌面这个蓝色的房子图形的APP。 超级数据查看器是一个提供数…

HTML 学习笔记 总结

总结 【标签按照功能进行分类】&#xff1a; <!DOCTYPE html>&#xff1a;声明为 HTML5 文档 <html>&#xff08;双标记、块标记&#xff09;&#xff1a;是 HTML 页面的根元素&#xff0c;定义 HTML 文档 <head>&#xff08;双标记、块标记&#xff09;&a…

算法-双指针、BFS与图论-1224. 交换瓶子

题目 思路 可以交换任意两个瓶子&#xff0c;最多n-1次&#xff1b;如果是只能交换相邻的瓶子&#xff0c;那么相当于逆序对的个数&#xff08;这篇博客是介绍如何计算逆序对的算法&#xff1a;算法篇&#xff1a;逆序对_逆序对算法-CSDN博客&#xff09;本题转换为图论去看:边…

【数据结构与算法】绪论

目录 一、数据结构研究 二、基本概念和术语 2.1 基本概念 2.2 什么是数据结构&#xff1f; 2.3 数据结构内容 2.4 逻辑结构种类 2.5 存储结构种类 2.6 数据类型和抽象数据类型 三、算法和算法分析 3.1 算法的定义 3.2 算法的特性 3.3 算法设计要求 3.4 算法好坏评…

JAVA虚拟机实战篇之GC调优[1](GC调优基知、方法、工具和常见GC模式)

文章目录 版权声明GC调优概念GC调优核心指标(KPI)吞吐量延迟&#xff08;Latency&#xff09;内存使用量 GC调优方法GC调优步骤GC调优工具jstat工具visualvm插件Prometheus Grafana GC日志分析GC日志保存GC日志分析工具GC ViewerGCeasy 常见的GC模式正常情况缓存对象过多情况内…

01_electron入门

由于毕业论文可能需要用 electron&#xff0c;所以 Linux 驱动学习慢了下来。 一、安装 node.js 进入 node.js 官网&#xff1a;Node.js (nodejs.org) 咱们就是用稳定版&#xff0c;安装包除了安装路径自己选择外&#xff0c;一直点 Next。 安装完成后需要配置环境&#xff0c…