STM32MX电源管理低功耗模式
前言:
ST官方例程:(直接移植直接用,接口是现成的)
在你STM32Cube固件库安装路径下.
.\..\STM32Cube\Repository\STM32Cube_FW_F4_V1.23.0\Projects\STM32F429I-Discovery\Examples\PWR\PWR_CurrentConsumption
例程和测试程序下载链接:STM32MX电源管理低功耗模式官方例程和测试程序-C/C++其他资源-CSDN下载
下面手册文字截图来源于《STM32F4xx中文参考手册.PDF》的第5 电源控制器(PWR)的5.3 低功耗模式
STM32电源三种低功耗模式介绍
节省功耗(最省电)效果:待机 > 停止 > 睡眠。
手册反复提到了事件和中断这两个词。
1. 事件(WFI)和中断(WFE)的区别:
事件:包括中断事件和非中断事件。
非中断事件:如GPIO电平变化,外设使能,初始化等不发生中断的事件。
中断事件:例如按键,按下按键会引起GPIO电平的变化(非中断事件)。若把按键配置为外部中断,即把非中断事件变成中断事件。中断是发生中断事件后执行对应的xxx_IRQHandler()中断服务函数。
详细原理框图可以看STM32F4XX英文参考手册的Figure 41. External interrupt/event controller block diagram
2. 睡眠模式
2.1 手册
注意:睡眠模式下,无论设置事件(WFI)和中断(WFE),系统时钟SysTick_Handler()都能将其唤醒。
2.2 软件步骤(粗体是必做步骤):
1、进入睡眠前可以降低或者关闭外设的时钟速度达到更好的效果(唤醒后要恢复外设时钟)。
2、失能系统时钟SysTick_Handler()中断。
3、设置唤醒方式,进入睡眠模式(CPU时钟关闭,内核停止,对其他时钟和ADC时钟无影响,不改变GPIO管脚状态)。
4、唤醒方式:任意中断唤醒或者事件(具体看你设置的唤醒方式)
5、唤醒延时:无
6、唤醒之后:使能系统时钟SysTick_Handler()中断(唤醒后要恢复外设时钟)。
7、程序继续运行。
2.3 代码:
/*** @brief This function configures the system to enter Sleep mode for* current consumption measurement purpose.* Sleep Mode* ========== * - System Running at PLL* - Flash 5 wait state* - Instruction and Data caches ON* - Prefetch ON * - Code running from Internal FLASH* - All peripherals disabled.* - Wakeup using EXTI Line (USER Button)* @param None* @retval None*/
void SleepMode_Measure(void)
{//挂起(暂停)系统时钟中断HAL_SuspendTick();/* 进入睡眠模式, 任意中断唤醒 */HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);/* 恢复系统时钟中断 */HAL_ResumeTick();/* Add a delay of 200ms after exit from Sleep mode */HAL_Delay(200);
}
3. 停止模式
3.1 手册
3.2 软件步骤(粗体是必做步骤):
1、进入睡眠前可以降低或者关闭外设的时钟速度达到更好的效果(唤醒后要恢复外设时钟)。
2、芯片内部FLASH掉电。
3、设置唤醒方式:_WFI 或者 _WFE,(RTC闹钟中断也可以唤醒,后面说)
4、关闭电压调节器(电压调节器是动态调节芯片内部电压,关闭后更加节省功耗,但是唤醒时间加长)
5、进入停止模式:所有的1.2V时钟都关闭(HSI和HSE的振荡器关闭,不改变GPIO管脚状态)。
6、唤醒方式:任意外部中断 或者 RTC闹钟
7、唤醒延时:有,(关闭电压调节器唤醒时间更长)。
8、唤醒之后:重新初始化时钟。
9、程序继续运行。
3.3 代码:
下面有两个停止模式函数StopMode_Measure()和StopUnderDriveMode_Measure();
前者是没有关闭电压调节器的,后者是关闭了电压调节器的,但是唤醒时间加长。
两个函数都RTC闹钟定时了20s唤醒。若不喜欢用RTC删除即可。
extern void SystemClock_Config(void); //外部链接用户初始化时钟/*** @brief This function configures the system to enter Stop mode with RTC * clocked by LSE or LSI for current consumption measurement purpose.* STOP Mode with RTC clocked by LSE/LSI* ===================================== * - RTC Clocked by LSE or LSI* - Regulator in LP mode* - HSI, HSE OFF and LSI OFF if not used as RTC Clock source* - No IWDG* - FLASH in deep power down mode* - Automatic Wakeup using RTC clocked by LSE/LSI (~20s)* @param None* @retval None* * @note * 此函数 没有关闭电压调节器 **/
void StopMode_Measure(void)
{RTCHandle.Instance = RTC;RTCHandle.Init.HourFormat = RTC_HOURFORMAT_24;RTCHandle.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;RTCHandle.Init.SynchPrediv = RTC_SYNCH_PREDIV;RTCHandle.Init.OutPut = RTC_OUTPUT_DISABLE;RTCHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;RTCHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;if(HAL_RTC_Init(&RTCHandle) != HAL_OK){Error_Handler(); }/*## 配置RTC唤醒 20s唤醒 ###########################################*/HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 0xA017, RTC_WAKEUPCLOCK_RTCCLK_DIV16);/* flash进入掉电 */HAL_PWREx_EnableFlashPowerDown();/*进入停止模式, 外部中断唤醒或者RTC闹钟唤醒 */HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);//重新初始化时钟SystemClock_Config();/* Disable Wake-up timer */if(HAL_RTCEx_DeactivateWakeUpTimer(&RTCHandle) != HAL_OK){/* Initialization Error */Error_Handler(); }
}/*** @brief This function configures the system to enter in Under-Drive stop mode with RTC * clocked by LSE or LSI for current consumption measurement purpose.* STOP Mode with RTC clocked by LSE/LSI* ===================================== * - RTC Clocked by LSE or LSI* - Regulator in LP mode* - Under drive feature enabled* - HSI, HSE OFF and LSI OFF if not used as RTC Clock source* - No IWDG* - FLASH in deep power down mode* - Automatic Wakeup using RTC clocked by LSE/LSI (~20s)* @param None* @retval None** @note * 此函数 关闭电压调节器 ,唤醒需要的时间更长,但是功耗理论更小**/
void StopUnderDriveMode_Measure(void)
{RTCHandle.Instance = RTC;/* Configure RTC prescaler and RTC data registers as follow:- Hour Format = Format 24- Asynch Prediv = Value according to source clock- Synch Prediv = Value according to source clock- OutPut = Output Disable- OutPutPolarity = High Polarity- OutPutType = Open Drain */ RTCHandle.Init.HourFormat = RTC_HOURFORMAT_24;RTCHandle.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;RTCHandle.Init.SynchPrediv = RTC_SYNCH_PREDIV;RTCHandle.Init.OutPut = RTC_OUTPUT_DISABLE;RTCHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;RTCHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;if(HAL_RTC_Init(&RTCHandle) != HAL_OK){/* Initialization Error */Error_Handler(); }/*## Configure the Wake up timer ###########################################*//* RTC Wakeup Interrupt Generation:Wakeup Time Base = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSI))Wakeup Time = Wakeup Time Base * WakeUpCounter = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSI)) * WakeUpCounter==> WakeUpCounter = Wakeup Time / Wakeup Time BaseTo configure the wake up timer to 20s the WakeUpCounter is set to 0xA017:RTC_WAKEUPCLOCK_RTCCLK_DIV = RTCCLK_Div16 = 16 Wakeup Time Base = 16 /(~32.768KHz) = ~0,488 msWakeup Time = ~20s = 0,488ms * WakeUpCounter==> WakeUpCounter = ~20s/0,488ms = 40983 = 0xA017 */HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 0xA017, RTC_WAKEUPCLOCK_RTCCLK_DIV16);/* FLASH Deep Power Down Mode enabled */HAL_PWREx_EnableFlashPowerDown();/* Enter under-drive Stop Mode */HAL_PWREx_EnterUnderDriveSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);/* Configures system clock after wake-up from STOP: enable HSE, PLL and select PLL as system clock source (HSE and PLL are disabled in STOP mode) */
// SYSCLKConfig_STOP();SystemClock_Config();/* Disable Wake-up timer */if(HAL_RTCEx_DeactivateWakeUpTimer(&RTCHandle) != HAL_OK){/* Initialization Error */Error_Handler(); }
}
4. 待机模式
4.1 手册
4.2 软件步骤(粗体是必做步骤):
1、是否允许访问备份区
2、是否备份区使用RTC(用于唤醒)
3、设置唤醒方式:WKUP 引脚上升沿、 RTC 闹钟(闹钟 A 和闹钟 B)、 RTC 唤醒事件、 RTC入侵事件、 RTC 时间戳事件、 NRST 引脚外部复位 和 IWDG 复位。
4、进入待机模式:关闭1.2V所有时钟,HSI和HSE的振荡器关闭,电压调节器关闭。
5、唤醒延时:有
6、唤醒之后:复位程序(和按下复位键效果一致)
4.3 代码:
/*** @brief This function configures the system to enter Standby mode for* current consumption measurement purpose.* STANDBY Mode* ============* - Backup SRAM and RTC OFF* - IWDG and LSI OFF* - Wakeup using WakeUp Pin (PA.00)* @param None* @retval None*/
void StandbyMode_Measure(void)
{/* Enable Power Clock*/__HAL_RCC_PWR_CLK_ENABLE();/* Allow access to Backup */HAL_PWR_EnableBkUpAccess();/* Reset RTC Domain */__HAL_RCC_BACKUPRESET_FORCE();__HAL_RCC_BACKUPRESET_RELEASE();/* Disable all used wakeup sources: Pin1(PA.0) */HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);/* Clear all related wakeup flags */__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);/* Re-enable all used wakeup sources: Pin1(PA.0) */HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);/* Request to enter STANDBY mode */HAL_PWR_EnterSTANDBYMode();
}/*** @brief This function configures the system to enter Standby mode with RTC * clocked by LSE or LSI for current consumption measurement purpose.* STANDBY Mode with RTC clocked by LSE/LSI* ========================================* - RTC Clocked by LSE/LSI* - IWDG OFF* - Backup SRAM OFF* - Automatic Wakeup using RTC clocked by LSE/LSI (after ~20s)* @param None* @retval None*/
void StandbyRTCMode_Measure(void)
{RTCHandle.Instance = RTC; /* Configure RTC prescaler and RTC data registers as follow:- Hour Format = Format 24- Asynch Prediv = Value according to source clock- Synch Prediv = Value according to source clock- OutPut = Output Disable- OutPutPolarity = High Polarity- OutPutType = Open Drain */ RTCHandle.Init.HourFormat = RTC_HOURFORMAT_24;RTCHandle.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;RTCHandle.Init.SynchPrediv = RTC_SYNCH_PREDIV;RTCHandle.Init.OutPut = RTC_OUTPUT_DISABLE;RTCHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;RTCHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;if(HAL_RTC_Init(&RTCHandle) != HAL_OK){/* Initialization Error */Error_Handler(); }/*## Configure the Wake up timer ###########################################*//* RTC Wakeup Interrupt Generation:Wakeup Time Base = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSI))Wakeup Time = Wakeup Time Base * WakeUpCounter = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSI)) * WakeUpCounter==> WakeUpCounter = Wakeup Time / Wakeup Time BaseTo configure the wake up timer to 20s the WakeUpCounter is set to 0xA017:RTC_WAKEUPCLOCK_RTCCLK_DIV = RTCCLK_Div16 = 16 Wakeup Time Base = 16 /(~32.768KHz) = ~0,488 msWakeup Time = ~20s = 0,488ms * WakeUpCounter==> WakeUpCounter = ~20s/0,488ms = 40983 = 0xA017 *//* Disable Wake-up timer */if(HAL_RTCEx_DeactivateWakeUpTimer(&RTCHandle) != HAL_OK){/* Initialization Error */Error_Handler(); }/*## Clear all related wakeup flags ########################################*//* Clear PWR wake up Flag */__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);/* Clear RTC Wake Up timer Flag */__HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&RTCHandle, RTC_FLAG_WUTF);/*## Setting the Wake up time ##############################################*/HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 0xA017, RTC_WAKEUPCLOCK_RTCCLK_DIV16);/*## Enter the Standby mode ################################################*//* Request to enter STANDBY mode */HAL_PWR_EnterSTANDBYMode();
}/*** @brief This function configures the system to enter Standby mode with RTC * clocked by LSE or LSI and with Backup SRAM ON for current consumption * measurement purpose.* STANDBY Mode with RTC clocked by LSE/LSI and BKPSRAM* ====================================================* - RTC Clocked by LSE or LSI* - Backup SRAM ON* - IWDG OFF* - Automatic Wakeup using RTC clocked by LSE/LSI (after ~20s)* @param None* @retval None*/
void StandbyRTCBKPSRAMMode_Measure(void)
{ /* Configure RTC prescaler and RTC data registers as follow:- Hour Format = Format 24- Asynch Prediv = Value according to source clock- Synch Prediv = Value according to source clock- OutPut = Output Disable- OutPutPolarity = High Polarity- OutPutType = Open Drain */ RTCHandle.Instance = RTC;RTCHandle.Init.HourFormat = RTC_HOURFORMAT_24;RTCHandle.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;RTCHandle.Init.SynchPrediv = RTC_SYNCH_PREDIV;RTCHandle.Init.OutPut = RTC_OUTPUT_DISABLE;RTCHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;RTCHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;if(HAL_RTC_Init(&RTCHandle) != HAL_OK){/* Initialization Error */Error_Handler(); }/*## Configure the Wake up timer ###########################################*//* RTC Wakeup Interrupt Generation:Wakeup Time Base = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSI))Wakeup Time = Wakeup Time Base * WakeUpCounter = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSI)) * WakeUpCounter==> WakeUpCounter = Wakeup Time / Wakeup Time BaseTo configure the wake up timer to 20s the WakeUpCounter is set to 0xA017:RTC_WAKEUPCLOCK_RTCCLK_DIV = RTCCLK_Div16 = 16 Wakeup Time Base = 16 /(~32.768KHz) = ~0,488 msWakeup Time = ~20s = 0,488ms * WakeUpCounter==> WakeUpCounter = ~20s/0,488ms = 40983 = 0xA017 *//* Disable Wake-up timer */if(HAL_RTCEx_DeactivateWakeUpTimer(&RTCHandle) != HAL_OK){/* Initialization Error */Error_Handler(); }/*## Clear all related wakeup flags ########################################*//* Clear PWR wake up Flag */__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);/* Clear RTC Wake Up timer Flag */__HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&RTCHandle, RTC_FLAG_WUTF);/*## Setting the Wake up time ##############################################*/HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 0xA017, RTC_WAKEUPCLOCK_RTCCLK_DIV16);/* Enable BKPRAM Clock */__HAL_RCC_BKPSRAM_CLK_ENABLE();/* Enable the Backup SRAM low power Regulator */HAL_PWREx_EnableBkUpReg();/*## Enter the Standby mode ################################################*//* Request to enter STANDBY mode */HAL_PWR_EnterSTANDBYMode();
}
5. RTC闹钟唤醒
5.1 手册
RTC唤醒代码,上面停止和待机模式都有。
个人感觉手册写的很详细(我懒,用的少),认真看完就懂了,不懂再交流。
全篇完。
本人是一个嵌入式未入门小白,博客仅仅代表我个人主观见解,记录成长笔记。
笔记是以最简单的方式,只展示最核心的原理。
若有与 大神大大 见解有歧义,我绝对坚信 大神大大 见解是对的,我的是错的。
若无积分等无法下载源码,可加入QQ群657407920下载交流经验。感谢~!
STM32MX电源管理低功耗模式相关推荐
- 【STM32】初识STM32(型号+封装+内核+储存器+时钟、复位和电源管理+工作模式+ADC)
折腾着折腾着终于开始了 目录 ■STM32型号的说明: ■几种封装样式: ■ 内核:ARM 32位的Cortex™-M3 CPU ■ 存储器 ■ 时钟.复位和电源管理 ■内嵌RC振荡器和外接晶振: ■ ...
- 【STM32】HAL库-电源控制(低功耗模式)
电源框图 STM32 的电源系统主要分为备份域电路.内核电路以及 ADC 电路三部分 备份域电路 STM32 的 LSE 振荡器.RTC.备份寄存器及备份 SRAM 这些器件被包含进备份域电路中,这部 ...
- linux 电池管理软件,Linux电源管理笔记本模式工具1.65来延长电池续航能力
笔记本模式工具是一个Linux电源管理工具包,它可以让用户以多种方式延长笔记本电池续航能力,现在它已经升级到1.65. 笔记本模式工具的发布的版本曾经很少而且间隔很长,但开发者在最新的版本中做了一些很 ...
- STM32CubeMX学习笔记(15)——电源管理(PWR)低功耗睡眠模式
一.低功耗模式简介 系统提供了多个低功耗模式,可在 CPU 不需要运行时(例如等待外部事件时)节省功耗.由用户根据应用选择具体的低功耗模式,以在低功耗.短启动时间和可用唤醒源之间寻求最佳平衡. 睡眠模 ...
- STM32CubeMX学习笔记(16)——电源管理(PWR)低功耗停止模式
一.低功耗模式简介 系统提供了多个低功耗模式,可在 CPU 不需要运行时(例如等待外部事件时)节省功耗.由用户根据应用选择具体的低功耗模式,以在低功耗.短启动时间和可用唤醒源之间寻求最佳平衡. 睡眠模 ...
- STM32CubeMX学习笔记(17)——电源管理(PWR)低功耗待机模式
一.低功耗模式简介 系统提供了多个低功耗模式,可在 CPU 不需要运行时(例如等待外部事件时)节省功耗.由用户根据应用选择具体的低功耗模式,以在低功耗.短启动时间和可用唤醒源之间寻求最佳平衡. 睡眠模 ...
- linux系统电源时钟,linux电源管理的一些梳理
由于项目产品需要过能源之星3.0,所以最近做了一些电源管理低功耗方面的工作,抽个时间正好梳理一下. 其实Linux 电源管理非常复杂,牵扯到很多方面,比如系统级的待机.频率电压变换.系统空闲时的处理以 ...
- STM8L的低功耗模式的配置
低功耗可以说是stm8l系列单片机的核心特色了.假设假设我们有一个温度传感器设备,他处于某种很特殊的地方,只能使用电池,而且我们很难去更换,那么低功耗就显得尤为重要.那么继续假设我们这个温度传感器不需 ...
- stm32f103c6t6下的HAL库搭建三种低功耗模式及实战分析(stm32通用)
目录 三种低功耗模式介绍 睡眠模式(sleep mode) 停止模式(stop mode) 待机模式(standby mode) 总结 实战测试 个别电路原理图 功耗分析 ADC功耗大解决方案 ADC ...
最新文章
- 美团全链路压测自动化实践
- Sublime Text
- oracle性能调整的九大要点:四诊断latch竞争
- 信用贷款常见问题应对话术
- Linux内核社区迁移到github?
- python如何高效办公_Python教你高效办公,自制屏幕翻译工具
- Spring 静态代理和动态代理
- Nginx服务器学习(一)CentOS7系统安装Nginx
- 将table导出为Excel的标准无乱码写法
- Atitiit java通过Exchange协议同步note 记事本 目录 1.1.1. 使用EWS(Exchange Web Service)协议读取邮件、发送邮件	1 最新问题	1 热门问题	1
- Power Designer创建概念数据模型
- 文件系统管理 之 reiserfs文件系统反删除(Undelete)操作的实践
- 解决VMware安装ubuntu16.04后无法全屏的问题
- 【AI数学原理】函数求导(精髓篇)
- html 数字大小写转换,数字大小写转化
- 如何一条命令查询笔记本电池损耗情况-生成报告
- 解决微信emjoy特殊符号插入数据库出错
- c语言种子数使用方法,C语言中的srand的用法,什么是种子?
- 光明区支持现代服务业高质量发展若干措施(征求意见稿)
- zookeeper的脑裂问题