STM32速成笔记—低功耗模式

news2024/11/22 20:47:13

文章目录

  • 一、STM32低功耗模式介绍
  • 二、睡眠模式
    • 2.1 进入睡眠模式
    • 2.2 退出睡眠模式
  • 三、停止模式
    • 3.1 进入停止模式
    • 3.2 退出停止模式
  • 四、待机模式
  • 五、程序设计

一、STM32低功耗模式介绍

STM32提供了一些低功耗模式。默认情况下,系统复位或上电复位后,微控制器进入运行模式。在运行模式下,HCLK 为CPU提供时钟,并执行程序代码。当 CPU 不需要继续运行(例如等待外部事件) 时,可以利用多种低功耗模式来节省功耗。

STM32 提供了 3 种低功耗模式,以达到不同层次的降低功耗的目的

  • 睡眠模式(内核停止工作,外设仍在运行)
  • 停止模式(所有时钟都停止)
  • 待机模式( 1.8 V 内核电源关闭)

这三种模式所需的功耗是逐级递减,也就是说待机模式功耗是最低的。

在睡眠模式中,仅关闭了内核时钟,内核停止运行,但其片上外设,CM3 核心的外设全都照常运行。在停止模式中,进一步关闭了其它所有的时钟,于是所有的外设都停止了工作,但由于其 1.8V 区域的部分申源没有关闭,还保留了内核的寄存器、内存的信息,所以从停止模式唤醒,并重新开启时钟后,还可以从上次停止处继续执行代码。在待机模式中,它除了关闭所有的时钟,还把 1.8V 区域的电源也完全关闭了,也就是说,从待机模式唤醒后,由于没有之前代码的运行记录,只能对芯片复位,重新检测BOOT条件,从头开始执行程序

另外,在运行模式下也可以通过降低系统时钟,关闭APB和AHB总线上未被使用的外设时钟来降低功耗。

低功耗模式一览表

二、睡眠模式

2.1 进入睡眠模式

通过执行WFI或WFE指令进入睡眠状态。根据Cortex-M3系统控制寄存器中的SLEEPONEXIT位的值,有两种选项可用于选择睡眠模式进入机制

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

在睡眠模式下,所有的I/O引脚都保持它们在运行模式时的状态。

2.2 退出睡眠模式

如果执行WFI指令进入睡眠模式,任意一个被嵌套向量中断控制器(NVIC)响应的外设中断都能将系统从睡眠模式唤醒。也就是任意一个外部中断都可以唤醒。

如果执行WVFE指令进入睡眠模式,则一旦发生唤醒事件时,微处理器都将从睡眠模式退出。唤醒事件可以通过下述方式产生

  • 在外设控制寄存器中使能一个中断,而不是在NVIC(嵌套向量中断控制器)中使能,并且在Cortex-M3系统控制寄存器中使能SEVONPEND位。当MCU从WFE中唤醒后,外设的中断挂起位和外设的NVIC中断通道挂起位(在NVIC中断清除挂起寄存器中)必须被清除。
  • 配置一个外部或内部的EXIT线为事件模式。当MCU从WFE中唤醒后,因为与事件线对应的挂起位未被设置,不必清除外设的中断挂起位或外设的NVIC中断通道挂起位。

该模式唤醒所需的时间最短,因为没有时间损失在中断的进入或退出上。

SLEEP-NOW模式
SLEEP-ON-EXIT模式

三、停止模式

停止模式是在Cortex-M3的深睡眠模式基础上结合了外设的时钟控制机制,在停止模式下电压调节器可运行在正常或低功耗模式。此时在1.8V供电区域的的所有时钟都被停止,PLL、HSI和HSE RC振荡器的功能被禁止,SRAM和寄存器内容被保留下来。

在停止模式下,所有的I/O引脚都保持它们在运行模式时的状态。

3.1 进入停止模式

在停止模式下,通过设置电源控制寄存器(PWR CR)的LPDS位使内部调节器进入低功耗模式能够降低更多的功耗。

如果正在进行闪存编程,直到对内存访问完成,系统才进入停止模式。如果正在进行对APB的访问,直到对APB访问完成,系统才进入停止模式。在停止模式下,如果在进入该模式前ADC和DAC没有被关闭,那么这些外设仍然消耗电流。通过设置寄存器ADC CR2的ADON位和寄存器DAC CR的ENx位为0可关闭这2个外设。

3.2 退出停止模式

当一个中断或唤醒事件导致退出停止模式时,HSI RC振荡器被选为系统时钟。当电压调节器处于低功耗模式下,当系统从停止模式退出时,将会有一段额外的启动延时。如果在停止模式期间保持内部调节器开启,则退出启动时间会缩短,但相应的功耗会增加。

停止模式

四、待机模式

待机模式可实现系统的最低功耗。该模式是在Corex-M3深睡眠模式时关闭电压调节器。整个1.8V供电区域被断电。PLL、HSI和HSE振荡器也被断电。SRAM和寄存器内容丢失。只有备份的寄存器和待机电路维持供电。

待机模式的进出方法如下

待机模式

五、程序设计

这里介绍一下进入待机模式并唤醒的程序设计。配置进入待机模式有以下步骤

  • 使能PWR外设时钟
  • 使能唤醒管脚
  • 进入待机模式

库函数中提供了进入待机模式的函数

/**
 * @brief  Enters STANDBY mode.
 * @param  None
 * @retval None
  */
void PWR_EnterSTANDBYMode(void)
{
  /* Clear Wake-up flag */
  PWR->CR |= PWR_CR_CWUF;
  /* Select STANDBY mode */
  PWR->CR |= PWR_CR_PDDS;
  /* Set SLEEPDEEP bit of Cortex System Control Register */
  SCB->SCR |= SCB_SCR_SLEEPDEEP;
/* This option is used to ensure that store operations are completed */
#if defined ( __CC_ARM   )
  __force_stores();
#endif
  /* Request Wait For Interrupt */
  __WFI();
}

使能唤醒管脚的函数

/**
  * @brief  Enables or disables the WakeUp Pin functionality.
  * @param  NewState: new state of the WakeUp Pin functionality.
  *   This parameter can be: ENABLE or DISABLE.
  * @retval None
  */
void PWR_WakeUpPinCmd(FunctionalState NewState)
{
  /* Check the parameters */
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  *(__IO uint32_t *) CSR_EWUP_BB = (uint32_t)NewState;
}

测试代码如下

int main(void)
{
	Med_Mcu_Iint();   // 系统初始化
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);   // 使能PWR外设时钟
	PWR_WakeUpPinCmd(ENABLE);   // 使能唤醒管脚	使能或者失能唤醒管脚功能
	
	while(1)
  {
		printf ("Time: 5 \r\n");
		delay_ms(1000);
		
		printf ("Time: 4 \r\n");
		delay_ms(1000);
		
		printf ("Time: 3 \r\n");
		delay_ms(1000);
		
		printf ("Time: 2 \r\n");
		delay_ms(1000);
		
		printf ("Time: 1 \r\n");
		delay_ms(1000);
		
		printf ("进入待机模式\r\n");
		PWR_EnterSTANDBYMode();   // 进入待机模式
	}
}

测试结果如下

待机唤醒测试结果

串口输出完“进入待机模式”后,串口不再输出。当按下WK UP时,重新开始倒计时,进入待机模式。

值得注意的是,进入待机模式被唤醒后,程序是重新开始运行的。对于一些只需要第一次开机才显示的页面或者一些第一次开机校准参数的程序,可以通过第一次开机向Flash固定地址写入数据,下次复位读取对应地址的数据,来判断是否是第一次开机的方法,避免它们在待机唤醒后再次被执行。

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

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

相关文章

html中表格

一、table标签 参数说明 实例 <body><table border"1" align"center" width"300" height"200" cellspacing"10"><tr><td>1.1</td><td>1.2</td><td>1.3</td></t…

把labelme得到的json文件转换成yolov8需要的格式,划分数据集

使用labelme打标&#xff0c;得到json文件把所有json文件放到一个单独的文件夹&#xff0c;里面只有json文件使用脚本&#xff0c;把json里面的label,标注框的中心坐标、宽、高提取出来&#xff0c;注意这里的4个值都按照图像大小压缩了。 脚本如下&#xff1a; import json…

【网页设计】基于HTML的湖南渔鼓文化宣传网页的设计

1.引言 随着文化交流的不断深入&#xff0c;湖南渔鼓文化作为湖南省的非物质文化遗产&#xff0c;逐渐引起了人们的关注和研究。为了更好地推广和宣传湖南渔鼓文化&#xff0c;我们设计了一款基于HTML的湖南渔鼓文化宣传网页。 该网页旨在向广大用户介绍湖南渔鼓文化的深厚底…

第四章:SSD网络详解

(目标检测篇&#xff09;系列文章目录 第一章:R-CNN网络详解 第二章:Fast R-CNN网络详解 第三章:Faster R-CNN网络详解 第四章:SSD网络详解 第五章:YOLO v1网络详解 第六章:YOLO v2网络详解 第七章:YOLO v3网络详解 文章目录 系列文章目录技术干货集锦前言一、摘要二、正…

FME之发布全局变量和接收全局变量

1.发布变量用VariableSetter转换器&#xff0c;其中DH是全局变量名称&#xff0c;它的值是从上一步产生的数据中某个字段提取。发布之前我们一般都会用Sampler抽样保留一条记录即可。 2.接收全局变量用VariableRetriever转换器&#xff0c;其中变量名称用之前发布的全局变量名称…

Redis下载和安装(Windows系统)

本套教程中采用 Windows 系统对 Redis 数据库进行讲解。 虽然 Redis 官方网站没有提供 Windows 版的安装包&#xff0c;但可以通过 GitHub 来下载 Windows 版 Redis 安装包&#xff0c;下载地址&#xff1a;点击前往。 注意&#xff1a;Windows 安装包是某位民间“大神”根据 …

小白到运维工程师自学之路 第四十七集 (LNMP部署电影网站)

一、概述 Linux&#xff1a;作为操作系统&#xff0c;提供服务器的基本功能和稳定性。通常使用常见的Linux发行版&#xff0c;如Ubuntu、CentOS等。 Nginx&#xff1a;作为Web服务器和反向代理服务器&#xff0c;处理HTTP请求和传递数据。Nginx具有高性能、稳定性和并发处理能…

Java链式编程与Builder(建造者)设计模式

一、链式编程 1.1.释义 链式编程&#xff0c;也叫级联式编程&#xff0c;调用对象的函数时返回一个this对象指向对象本身&#xff0c;达到链式效果&#xff0c;可以级联调用。 1.2.特点 可以通过一个方法调用多个方法&#xff0c;将多个方法调用链接起来&#xff0c;形成一…

Mysql数据NULL避坑指南

NULL空值是mysql中一种特殊的数据值&#xff08;即"缺少的未知值"&#xff09;,NULL和字符串空值不是一回事&#xff0c;处理NULL与其他值不同&#xff0c;下面具体阐述相关差异&#xff1a; 一、NULL运算符 1、普通数据使用 > 、 < 、即可做常用的逻辑运算如…

Linux随机生成数

简介 在某些情况下&#xff0c;我们需要随机产生一个数来在一些场景中使用&#xff0c;例如验证码、ssh反向代理随机数的产生&#xff0c;又或者在一些shell脚本设计中需要用到随机数&#xff0c;下面以随机产生一个30000-40000之间的随机数为例。 使用shuf shuf 命令在一些 Li…

【FFMPEG】AVFilter使用流程

流程图 核心类 AVFilterGraph ⽤于统合这整个滤波过程的结构体 AVFilter 滤波器&#xff0c;滤波器的实现是通过AVFilter以及位于其下的结构体/函数来维护的 AVFilterContext ⼀个滤波器实例&#xff0c;即使是同⼀个滤波器&#xff0c;但是在进⾏实际的滤波时&#xff0c;也…

基于单片机水质检测系统的设计与实现

功能介绍 以STM32单片机作为主控系统&#xff1b;液晶显示当前参数&#xff1b;PH模块采集当前水质PH酸碱度&#xff1b;DS18B20温度传感器采集当前水体温度&#xff1b;TDS传感器采集当前水体TDS值&#xff1b;浊度传感器采集当前水体浑浊度&#xff1b;按键设置PH、温度、TDS…

基于vscode连接到远程服务中debug

本文章主要讲解以下两点的任务 1.在windows的vscode中去debug 本机子系统wsl2中运行的docker容器 该篇文件参考知乎上这篇文章 vscode远程连接到本机 wsl2子系统 中正在运行的 docker容器&#xff0c;该docker中有一个flask实例&#xff0c;通过vscode远程debug它 1.1安装v…

基于matlab配置单目鱼眼摄像头(附源码)

一、前言 此示例演示如何将鱼眼相机模型转换为针孔模型&#xff0c;并构建相应的单目相机传感器仿真。 要模拟安装在车辆中的单目摄像头传感器&#xff0c;请执行以下步骤&#xff1a; 通过使用棋盘格校准相机来估计固有的相机参数。内在参数描述了鱼眼镜头相机本身的特性。 …

抖音seo矩阵系统源码部署开发-可二开(二)

抖音seo短视频剧组嗯系统是以人工智能技术&#xff0c;通过多个短视频平台&#xff0c;多个短视频账号为核心&#xff0c;视频自动生成、自动发布智能优化&#xff0c;以达到矩阵营销的目的&#xff0c;从根本上解决短视频曝光难和获客少等难题&#xff0c;从而快速增加商家的运…

基于matlab使用卷积神经网络对晶圆图上的八种制造缺陷进行分类(附源码)

一、前言 此示例展示了如何使用简单的卷积神经网络 &#xff08;CNN&#xff09; 对晶圆图上的八种制造缺陷进行分类。 晶圆是半导体材料&#xff08;通常是硅&#xff09;的薄盘&#xff0c;用作集成电路的基础。每个晶圆产生几个单独的电路&#xff08;IC&#xff09;&…

XXX汽车ERP系统供应商索赔业务上线,助力业财数据快速闭环(投稿数据化月报四)

供应商三包索赔款项源起QMS质量系统&#xff0c;联动金税系统完成发票开具&#xff0c;最终在SAP系统中创建完成财务凭证。该流程上线前为手工操作&#xff0c;费时费力且效率低下容易出错。针对该业务现状&#xff0c;SAP与QMS业务顾问及开发团队组成开发小组&#xff0c;导入…

Java性能权威指南-总结26

Java性能权威指南-总结26 数据库性能的最佳实践异常日志 数据库性能的最佳实践 异常 Java的异常处理一直有代价高昂的坏名声。其代价确实比处理正常的控制流高一些&#xff0c;不过在大多数情况下&#xff0c;这种代价并不值得浪费精力去绕过。另一方面&#xff0c;因为异常处…

添加 zabbix 客户端主机 自定义监控内容 自动发现与注册(得不到假装不想要)

文章目录 一、添加zabbix客户端主机2.关闭防火墙和修改主机名 二、自定义监控内容1.需求&#xff1a;限制登录人数不超过 3 个&#xff0c;超过 3 个就发出报警信息在客户端创建自定义 key在 Web 页面创建自定义监控项模板 三、zabbix 自动发现与自动注册zabbix 自动发现&#…

HCIE-datacom | 网络准入控制

一、前言 之前提供网络技术咨询服务时&#xff0c;有一位实习生同学向我咨询了有关网络准入的相关情景&#xff0c;在这里我结合华为HCIE-datacom中“网络准入控制”这一节等相关资料&#xff0c;对网络准入技术进行一下简单的理论性说明&#xff0c;与资料的讲解思路相同&…