前言:

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电源管理低功耗模式相关推荐

  1. 【STM32】初识STM32(型号+封装+内核+储存器+时钟、复位和电源管理+工作模式+ADC)

    折腾着折腾着终于开始了 目录 ■STM32型号的说明: ■几种封装样式: ■ 内核:ARM 32位的Cortex™-M3 CPU ■ 存储器 ■ 时钟.复位和电源管理 ■内嵌RC振荡器和外接晶振: ■ ...

  2. 【STM32】HAL库-电源控制(低功耗模式)

    电源框图 STM32 的电源系统主要分为备份域电路.内核电路以及 ADC 电路三部分 备份域电路 STM32 的 LSE 振荡器.RTC.备份寄存器及备份 SRAM 这些器件被包含进备份域电路中,这部 ...

  3. linux 电池管理软件,Linux电源管理笔记本模式工具1.65来延长电池续航能力

    笔记本模式工具是一个Linux电源管理工具包,它可以让用户以多种方式延长笔记本电池续航能力,现在它已经升级到1.65. 笔记本模式工具的发布的版本曾经很少而且间隔很长,但开发者在最新的版本中做了一些很 ...

  4. STM32CubeMX学习笔记(15)——电源管理(PWR)低功耗睡眠模式

    一.低功耗模式简介 系统提供了多个低功耗模式,可在 CPU 不需要运行时(例如等待外部事件时)节省功耗.由用户根据应用选择具体的低功耗模式,以在低功耗.短启动时间和可用唤醒源之间寻求最佳平衡. 睡眠模 ...

  5. STM32CubeMX学习笔记(16)——电源管理(PWR)低功耗停止模式

    一.低功耗模式简介 系统提供了多个低功耗模式,可在 CPU 不需要运行时(例如等待外部事件时)节省功耗.由用户根据应用选择具体的低功耗模式,以在低功耗.短启动时间和可用唤醒源之间寻求最佳平衡. 睡眠模 ...

  6. STM32CubeMX学习笔记(17)——电源管理(PWR)低功耗待机模式

    一.低功耗模式简介 系统提供了多个低功耗模式,可在 CPU 不需要运行时(例如等待外部事件时)节省功耗.由用户根据应用选择具体的低功耗模式,以在低功耗.短启动时间和可用唤醒源之间寻求最佳平衡. 睡眠模 ...

  7. linux系统电源时钟,linux电源管理的一些梳理

    由于项目产品需要过能源之星3.0,所以最近做了一些电源管理低功耗方面的工作,抽个时间正好梳理一下. 其实Linux 电源管理非常复杂,牵扯到很多方面,比如系统级的待机.频率电压变换.系统空闲时的处理以 ...

  8. STM8L的低功耗模式的配置

    低功耗可以说是stm8l系列单片机的核心特色了.假设假设我们有一个温度传感器设备,他处于某种很特殊的地方,只能使用电池,而且我们很难去更换,那么低功耗就显得尤为重要.那么继续假设我们这个温度传感器不需 ...

  9. stm32f103c6t6下的HAL库搭建三种低功耗模式及实战分析(stm32通用)

    目录 三种低功耗模式介绍 睡眠模式(sleep mode) 停止模式(stop mode) 待机模式(standby mode) 总结 实战测试 个别电路原理图 功耗分析 ADC功耗大解决方案 ADC ...

最新文章

  1. 美团全链路压测自动化实践
  2. Sublime Text
  3. oracle性能调整的九大要点:四诊断latch竞争
  4. 信用贷款常见问题应对话术
  5. Linux内核社区迁移到github?
  6. python如何高效办公_Python教你高效办公,自制屏幕翻译工具
  7. Spring 静态代理和动态代理
  8. Nginx服务器学习(一)CentOS7系统安装Nginx
  9. 将table导出为Excel的标准无乱码写法
  10. Atitiit java通过Exchange协议同步note 记事本 目录 1.1.1. 使用EWS(Exchange Web Service)协议读取邮件、发送邮件 1 最新问题 1 热门问题 1
  11. Power Designer创建概念数据模型
  12. 文件系统管理 之 reiserfs文件系统反删除(Undelete)操作的实践
  13. 解决VMware安装ubuntu16.04后无法全屏的问题
  14. 【AI数学原理】函数求导(精髓篇)
  15. html 数字大小写转换,数字大小写转化
  16. 如何一条命令查询笔记本电池损耗情况-生成报告
  17. 解决微信emjoy特殊符号插入数据库出错
  18. c语言种子数使用方法,C语言中的srand的用法,什么是种子?
  19. 光明区支持现代服务业高质量发展若干措施(征求意见稿)
  20. zookeeper的脑裂问题

热门文章

  1. 计算机发展未来的畅想英语作文,科技畅想未来英语作文
  2. MOS管认识及选型的一点见解
  3. 什么是VPS(Virtual Private Server 虚拟专用服务器)技术?
  4. UIpath for each遍历文件,判断,删除文件。catch捕捉全局异常
  5. 学校计算机操作培训方案,学校信息化培训方案.doc
  6. 英语六级口语备考指南
  7. 关于数据挖掘相关知识汇集
  8. Win7系统下使用猎豹浏览器兼容模式替代IE浏览器
  9. 浙大PTA C语言练习2-11 计算分段函数[2]
  10. 【经验分享】期刊缩写汇总