细说STM32F407单片机电源低功耗StopMode模式及应用示例

目录

一、停止模式基础知识

1、进入停止模式

2、停止模式的状态

3、退出停止模式

4、SysTick定时器的影响

二、停止模式应用示例

1、示例功能和CubeMX项目配置

(1)时钟

(2)RTC

(3)ADC1

(4) NVIC

(5)DEBUG、LED1、USART6、CodeGenerator

2、软件设计

(1)KEYLED 

(2)main.h

(3)main.c

3、运行并调试


一、停止模式基础知识

1、进入停止模式

        用户可以通过执行WFI指令或WFE指令进入停止模式。进入停止模式之前,用户需要将Cortex-M4F系统控制寄存器SCR的SLEEPDEEP位置1,内部调压器可以设置为正常运行或低功耗模式。函数HAL_PWR_EnterSTOPMode()用于进入停止模式,其源代码如下:

        函数HAL_PWR_EnterSTOPMode()用于进入停止模式,其源代码如下:

void HAL_PWR_EnterSTOPMode(uint32_t Regulator,uint8_t STOPEntry)
{/*Check the parameters */assert_param(IS_PWR_REGULATOR(Regulator));assert_param(IS_PWR_STOP_ENTRY(STOPEntry));/*设置调压器的模式:根据参数Regulator设置PDDS位和LPDS位*/MODIFY_REG(PWR->CR,(PWR_CR_PDDS I PWR_CR_LPDS),Regulator);/*将Cortex系统控制寄存器SCR的SLEEPDEEP位置1*/SET_BIT(SCB->SCR,((uint32_t)SCB_SCR_SLEEPDEEP_Msk));/*Select Stop mode entry*/if(STOPEntry == PWR_STOPENTRY_WFI){/*Request Wait For Interrupt */__WFI();}else{/*Request Wait For Event */__SEV();__WFE();__WFE();}/*唤醒后,将SLEEPDEEP位清零*/CLEAR_BIT(SCB->SCR,((uint32_t)SCB_SCR_SLEEPDEEP_Msk));
}

        参数Regulator用于表示调压器在停止模式下的工作方式,取值为宏定义常量PWR_MAINREGULATOR_ON(调压器正常运行)或PWR_LOWPOWERREGULATOR_ON(调压器处于低功耗模式)。

        参数SLEEPEntry表示用何种指令进入睡眠模式,WFI或WFE指令。其取值为宏定义常量PWR_SLEEPENTRY_WFI或PWR_SLEEPENTRY_WFE。

        函数HAL_PWR_EnterSTOPMode()在进入停止模式之前,将Cortex-M4F系统控制寄存器SCR的SLEEPDEEP位置1,被唤醒后再将SLEEPDEEP位清零。

        特别地,要进入停止模式,所有EXTI线的中断挂起标志都必须清零,否则,将忽略进入停止模式的操作,而继续执行程序

        在停止模式下,可以保持或关闭Flash的电源,在进入停止模式之前,可以使用以下两个函数进行设置。

HAL_PWREX_EnableFlashPowerDown();  //关闭Flash的电源
HAL_PWREx_DisableFlashPowerDown(); //不关闭Flash的电源

2、停止模式的状态

        进入停止模式后,系统的状态如下。

  • CPU的时钟关闭,CPU停止运行,也就是程序暂停。
  • 所有1.2V域外设的时钟停止,外设停止工作。
  • ADC和DAC不会自动停止工作,需要编程使其停止。
  • 1.2V调压器开启或处于低功耗状态,所有寄存器、SRAM的内容保留。
  • Flash处于正常模式或掉电模式。
  • HSI振荡器和HSE振荡器关闭。

3、退出停止模式

        如果使用WFI指令进入停止模式,所有配置为中断模式的EXTI线都可以唤醒系统。由中断唤醒后,先执行中断的ISR,然后执行WFI指令后面的程序。

        如果使用WFE指令进入停止模式,所有配置为事件模式的EXTI线都可以唤醒系统,唤醒后执行WFE后面的程序。

        EXTI线共23根,EXTI线0:15对应于外部引脚中断,EXTI线16:22对应一些内部事件,如RTC闹钟事件、RTC周期唤醒事件等。

        从停止模式唤醒时,系统有一定的唤醒延迟时间,包括以下几个时间。

  • HSI振荡器的启动时间。系统将重新启动HSI振荡器,并且将HSI作为HCLK的时钟源。对STM32F407来说,HSI频率为16MHz,使用HSI作为时钟源的HCLK最高频率为16MHz。如果需要系统从停止模式唤醒后使用更高频率的HCLK,需要重新配置系统时钟。
  • 如果调压器处于低功耗模式,需要从低功耗模式恢复到正常模式的时间。
  • 若Flash处于掉电模式,需要从掉电模式恢复到正常模式的时间。

        在停止模式下,如果调压器处于低功耗模式、Flash处于掉电模式,则可以降低停止模式的功耗,但这同时也会增加唤醒延迟。

4、SysTick定时器的影响

        MCU进入停止模式后,将只会由EXTI中断或事件唤醒,而不受SysTick定时器的影响。此外,在进入停止模式后,所有的1.2V域外设都会停止工作,SysTick定时器其实也停止了。

二、停止模式应用示例

        本文将创建一个示例项目,测试系统的STOP模式。继续使用旺宝红龙开发板STM32F407ZGT6 KIT V1.0。一些设置参考本文作者的其他文章。

        参考文章:细说STM32F407单片机电源低功耗SleepMode模式及应用示例-CSDN博客  https://wenchm.blog.csdn.net/article/details/145226004

1、示例功能和CubeMX项目配置

        本文演示MCU的停止模式。示例的功能和操作流程如下。

  • 在主程序的while循环里,让MCU进入停止模式。
  • 使用RTC的周期唤醒中断,使MCU从停止模式唤醒,RTC唤醒周期为5s。
  • MCU从停止模式唤醒后,进行一次轮询方式ADC转换。

(1)时钟

        禁用HSE,这样做很重要,因为不这样做,依旧设置外部时钟的话,系统将不能清空EXTI的中断线标志位。将HSI直接作为HCLK时钟源,HCLK设置为16MHz。因为MCU从停止模式唤醒后,自动使用HSI作为SYSCLK时钟源,所以,如果要使用HSE或更高频率的HCLK,需要重新配置系统时钟。本示例在系统唤醒后,不再配置HCLK时钟频率,故正常运行时也使用HSI作为HCLK时钟源。

(2)RTC

        并使用LSE作为RTC的时钟源。开启RTC的周期唤醒功能,

        并设置唤醒时钟为1Hz信号,唤醒计数值为4。RTC的周期唤醒使用的是EXTI线22中断,在NVIC中开启RTC周期唤醒中断,设置其抢占优先级为1。这样设置后,每5s发生一次EXTI线22中断。

(3)ADC1

        启用ADC1的内部参考电压通道,设置为12位精度、右对齐、软件触发转换。ADC1的参数设置结果如图。

 

(4) NVIC

 

(5)DEBUG、LED1、USART6、CodeGenerator

        同参考文章。 

2、软件设计

(1)KEYLED 

        本示例工程继续引用KEYLED文件夹中的keyled.h,详见参考文章。

(2)main.h

        声明一个函数,用于EXTI线清零。 

/* USER CODE BEGIN Private defines */
void EXTI_ClearITPendingBit();
/* USER CODE END Private defines */

(3)main.c

/* USER CODE BEGIN Includes */
#include "keyled.h"
#include <stdio.h>	//用到函数sprintf()
#include <string.h>	//用到函数strlen()
/* USER CODE END Includes */
/* USER CODE BEGIN 2 */printf("Demo22_2_StopMode:Test Stop Mode.\r\n");printf("Wake up by RTC every 5s.\r\n");//如果配置了FSMC//HAL_PWREx_EnableFlashPowerDown();	//在停止模式下关闭Flash电源//HAL_PWREx_DisableFlashPowerDown();	//不关闭Flash电源/* USER CODE END 2 */
 /* USER CODE BEGIN 3 */LED1_OFF();								//LED1熄灭//以下3种清零除EXTI线pending位的方法都是正确的,确保能进入STOP模式//EXTI->PR = 0; 						//将EXTI线的pending位清零EXTI->PR = EXTI_PR_PR0 << 22; 		    //将EXTI线22的pending位清零//EXTI_ClearITPendingBit(EXTI_PR_PR22);	//将EXTI线22的pending位清零//进入停止模式, WFI指令进入HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_SLEEPENTRY_WFI);//RTC周期唤醒中断(EXTI22)唤醒系统LED1_ON();HAL_ADC_Start(&hadc1);		//使能ADC1并开始转换,内部通道参考电压if (HAL_ADC_PollForConversion(&hadc1,200) == HAL_OK){uint32_t val = HAL_ADC_GetValue(&hadc1) & 0x0000FFFF;	//12位数uint32_t Volt = 3300*val;	//单位:mVVolt = Volt>>12;			//除以2^12printf("ADC Voltage(mV) = %ld\r\n",Volt);}HAL_ADC_Stop(&hadc1);		//停止ADC1HAL_Delay(500);				//消除按键抖动影响,并且使LED1亮500ms}/* USER CODE END 3 */

        在进入while循环之前,调用了函数HAL_PWREx_EnableFlashPowerDown(),这可以在MCU进入停止模式后,关闭Flash存储器的电源,进一步降低功耗。也可以不关闭Flash存储器电源,也就是调用函数HAL_PWREx_DisableFlashPowerDown()(可选)。

        在while循环里,调用函数HAL PWR EnterSTOPMode()使系统进入停止模式。必须在所有EXTI线中断的挂起标志位清零的情况下,才能进入停止模式。为此,直接将外部中断挂起标志寄存器PR的内容清零,即执行语句:

EXTI->PR =0;

        进入停止模式后,CPU停止运行,程序暂停,所有外设停止工作,但RTC仍能正常工作。停止模式可以由任意EXTI线的中断或事件唤醒,RTC的周期唤醒中断是EXTI线22。本示例中设置的RTC唤醒周期是5s,所以,在发生RTC周期唤醒中断时系统会被唤醒,但是会先执行RTC中断的ISR,也就是会执行RTC周期唤醒回调函数HAL_RTCEx_WakeUpTimerEventCallback(),这个回调函数里读取RTC当前时间并显示在串口助手上。RTC中断的ISR退出后,再继续执行WFI指令后面的程序。后面的程序用轮询方式进行一次ADC转换,将结果显示在串口助手上。ADC转换结束后停止,然后MCU又进入停止模式。

/* USER CODE BEGIN 4 */
// RTC 周期唤醒中断回调函数
void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{RTC_TimeTypeDef sTime;RTC_DateTypeDef sDate;if (HAL_RTC_GetTime(hrtc,&sTime,RTC_FORMAT_BIN) == HAL_OK){HAL_RTC_GetDate(hrtc,&sDate,RTC_FORMAT_BIN);uint8_t	str[30];sprintf((char *)str,"%2d:%2d:%2d",sTime.Hours,sTime.Minutes,sTime.Seconds);//HAL_UART_Transmit(&huart6,str,strlen ((const char *)(str)),200);printf("RTC current time: %s\r\n",str);}
}//清除EXTI线[0:22]的Pending register
void EXTI_ClearITPendingBit(uint32_t EXTI_Line)
{/* Check the parameters */assert_param(IS_EXTI_LINE(EXTI_Line));EXTI->PR = EXTI_Line;
}int __io_putchar(int ch)
{HAL_UART_Transmit(&huart6,(uint8_t*)&ch,1,0xFFFF);return ch;
}
/* USER CODE END 4 */

3、运行并调试

        运行时会发现:每隔5s串口助手上刷新显示一次RTC时间和ADC转换结果,LED1点亮500ms后熄灭。

        停止模式比较适合于需要周期性唤醒,执行完一些操作后又进入低功耗模式的应用。例如,网络化的温度监测,可能每隔60s才需要测量一次数据并通过网络发送出去,使用周期唤醒的停止模式就可以大大降低功耗。 

        在CubeMX里可以对本示例进行功耗计算。因为使用了16MHz的HCLK,RUN模式下的耗电流是8.78mA,STOP模式下的耗电流是280μA。如果还选用3400mAh的锂电池供电,如果一个序列中RUN模式持续10ms,STOP模式持续100ms,电池可以用4月1210小时;若修改为STOP模式持续1000ms,其他参数不变,电池可以用1年28,可见降低功耗的效果是非常明显的。

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

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

相关文章

【三国游戏——贪心、排序】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; const int N 1e510; int a[N], b[N], c[N]; int w[4][N]; int main() {int n;cin >> n;for(int i 1; i < n; i)cin >> a[i];for(int i 1; i < n; i)cin >> b[i…

[Qt]事件-鼠标事件、键盘事件、定时器事件、窗口改变事件、事件分发器与事件过滤器

目录 前言&#xff1a;Qt与操作系统的关系 一、Qt事件 1.事件介绍 2.事件的表现形式 常见的Qt事件&#xff1a; 常见的事件描述: 3.事件的处理方式 处理鼠标进入和离开事件案例 控件添加到对象树底层原理 二、鼠标事件 1.鼠标按下和释放事件&#xff08;单击&#x…

【优选算法】----移动零

好久没写博客的兄弟姐妹们~ 今天来写一篇算法过过水吧~ --------------------------------------begin---------------------------------------- 题目要求&#xff1a; 给的难度是简单哦 题目解析&#xff1a; 这道题的思路可以借助双指针的思想&#xff0c;定义dest和c…

Java设计模式—观察者模式

观察者模式 目录 观察者模式1、什么是观察者模式&#xff1f;2、观察者模式优缺点及注意事项&#xff1f;3、观察者模式实现&#xff1f;4、手写线程安全的观察者模式&#xff1f; 1、什么是观察者模式&#xff1f; - 实例&#xff1a;现实生活中很多事物都是依赖存在的&#x…

使用Sum计算Loss和解决梯度累积(Gradient Accumulation)的Bug

使用Sum计算Loss和解决梯度累积的Bug 学习 https://unsloth.ai/blog/gradient&#xff1a;Bugs in LLM Training - Gradient Accumulation Fix 这篇文章的记录。 在深度学习训练过程中&#xff0c;尤其是在大批量&#xff08;large batch&#xff09;训练中&#xff0c;如何高…

WGAN - 瓦萨斯坦生成对抗网络

1. 背景与问题 生成对抗网络&#xff08;Generative Adversarial Networks, GANs&#xff09;是由Ian Goodfellow等人于2014年提出的一种深度学习模型。它包括两个主要部分&#xff1a;生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#xff09;…

Qt 5.14.2 学习记录 —— 십칠 窗口和菜单

文章目录 1、Qt窗口2、菜单栏设置快捷键添加子菜单添加分割线和菜单图标 3、工具栏 QToolBar4、状态栏 QStatusBar5、浮动窗口 QDockWidget 1、Qt窗口 QWidget&#xff0c;即控件&#xff0c;是窗口的一部分。在界面中创建控件组成界面时&#xff0c;Qt自动生成了窗口&#xf…

SpringCloud系列教程:微服务的未来(十四)网关登录校验、自定义过滤器GlobalFilter、GatawayFilter

前言 在微服务架构中&#xff0c;API 网关扮演着至关重要的角色&#xff0c;负责路由请求、执行安全验证、流量控制等任务。Spring Cloud Gateway 作为一个强大的网关解决方案&#xff0c;提供了灵活的方式来实现这些功能。 本篇博客将重点介绍如何在 Spring Cloud Gateway 中…

Redis源码-redisObject

解释 redis中&#xff0c;所有的数据类型最终都转换成了redisObject&#xff0c;该结构体的定义&#xff0c;在文件server.h中。 参数说明 参数名说明unsigned type:4对象对应的数据类型unsigned encoding:4对象的编码方式unsigned lru:LRU_BITSLRU算法清空对象&#xff0c…

为什么相关性不是因果关系?人工智能中的因果推理探秘

目录 一、背景 &#xff08;一&#xff09;聚焦当下人工智能 &#xff08;二&#xff09;基于关联框架的人工智能 &#xff08;三&#xff09;基于因果框架的人工智能 二、因果推理的基本理论 &#xff08;一&#xff09;因果推理基本范式&#xff1a;因果模型&#xff0…

兼职全职招聘系统架构与功能分析

2015工作至今&#xff0c;10年资深全栈工程师&#xff0c;CTO&#xff0c;擅长带团队、攻克各种技术难题、研发各类软件产品&#xff0c;我的代码态度&#xff1a;代码虐我千百遍&#xff0c;我待代码如初恋&#xff0c;我的工作态度&#xff1a;极致&#xff0c;责任&#xff…

js重要知识点

目录 一、冒泡排序的计算方法 二、数组forEach方法 三、Number(null)和Number(undefined) 四、es6中的set 一、冒泡排序的计算方法 冒泡排序的重点:两次循环&#xff0c;外层循环是总共要进行的躺数,为数组总长度-1,内层循环则是每个元素在每一次循环中需要比较的次数&#xff…

Chrome 132 版本新特性

Chrome 132 版本新特性 一、Chrome 132 版本浏览器更新 1. 在 iOS 上使用 Google Lens 搜索 在 Chrome 132 版本中&#xff0c;开始在所有平台上推出这一功能。 1.1. 更新版本&#xff1a; Chrome 126 在 ChromeOS、Linux、Mac、Windows 上&#xff1a;在 1% 的稳定版用户…

2024微短剧行业生态洞察报告汇总PDF洞察(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p39072 本报告合集洞察从多个维度全面解读微短剧行业。在行业发展层面&#xff0c;市场规模与用户规模双增长&#xff0c;创造大量高收入就业岗位并带动产业链升级。内容创作上&#xff0c;精品化、品牌化趋势凸显&#xff0c;题材走…

AI Agent:AutoGPT的使用方法

AutoGPT的使用方法 准备工作: 安装Python:确保你的电脑上安装了Python 3.8或更高版本。获取OpenAI API密钥:访问https://platform.openai.com/account/api-keys获取API密钥,并保存备用。获取Google API及Google Search Engine ID(可选):若要使用谷歌搜索功能,需访问htt…

使用 `scanpy` 观察 `AnnData` 对象内部数据结构

以下是使用 scanpy 观察 AnnData 对象内部数据结构的步骤: 一、导入必要的库: import scanpy as sc二、读取 AnnData 对象: 假设你的 AnnData 对象存储在一个文件中,例如 adata.h5ad,你可以使用以下代码读取它: adata = sc.read(adata.h5ad)如果你已经有了 adata 对象…

基于GRU实现股价多变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记…

Python基于Django的社区爱心养老管理系统设计与实现【附源码】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

基于OpenCV和Python的人脸识别系统_django

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 公告信息管理 操作日志管理 用户登录界面 用户…

吴恩达深度学习——神经网络编程的基础知识

文章内容来自BV11H4y1F7uH&#xff0c;仅为个人学习所用。 文章目录 二分分类一些符号说明 逻辑斯蒂回归传统的线性回归函数 y ^ w T x b \hat{y}w^T\boldsymbol{x}b y^​wTxbSigmoid激活函数逻辑斯蒂回归损失函数损失函数成本函数与损失函数的关系 梯度下降法计算图逻辑斯蒂…