datasheet

STM32MX电源管理低功耗模式

2019-07-10来源: eefocus关键字:STM32MX  电源管理  低功耗模式

前言:

ST官方例程:(直接移植直接用,接口是现成的)


在你STM32Cube固件库安装路径下.


...STM32CubeRepositorySTM32Cube_FW_F4_V1.23.0ProjectsSTM32F429I-DiscoveryExamplesPWRPWR_CurrentConsumption



例程和测试程序下载链接:https://download.csdn.net/download/sudaroot/10891176


一、STM32电源三种低功耗模式介绍


节省功耗效果:待机  > 停止 > 睡眠。

 

 

 

1、睡眠模式


先说一下事件(WFI)和中断(WFE)的区别:事件包括中断事件和非中断事件,中断是发生中断事件后执行对应的xxx_IRQHandler()中断服务函数。非中断事件如GPIO电平变化,外设使能,初始化等不发生中断的事件。


详细原理框图可以看STM32F4XX英文参考手册的Figure 41. External interrupt/event controller block diagram


 


注意:睡眠模式下,无论设置事件(WFI)和中断(WFE),系统时钟SysTick_Handler()都能将其唤醒。


 

软件步骤(粗体是必须做的步骤):


1、进入睡眠前可以降低或者关闭外设的时钟速度达到更好的效果(唤醒后要恢复外设时钟)。


2、失能系统时钟SysTick_Handler()中断。


3、设置唤醒方式,进入睡眠模式(CPU时钟关闭,内核停止,对其他时钟和ADC时钟无影响,不改变GPIO管脚状态)。


4、唤醒方式:任意中断唤醒


5、唤醒延时:无


6、唤醒之后:使能系统时钟SysTick_Handler()中断(唤醒后要恢复外设时钟)。


7、程序继续运行。


 


代码:


/**

  * @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 2 second after exit from Sleep mode */

  HAL_Delay(200);

}

 


 


 


 


2、停止模式





 


软件步骤(粗体是必须做的步骤):


1、进入睡眠前可以降低或者关闭外设的时钟速度达到更好的效果(唤醒后要恢复外设时钟)。


2、芯片内部FLASH掉电。


3、设置唤醒方式:_WFI 或者 _WFE,(RTC闹钟中断也可以唤醒,后面说)


4、关闭电压调节器(电压调节器是动态调节芯片内部电压,关闭后更加节省功耗,但是唤醒时间加长)


5、进入停止模式:所有的1.2V时钟都关闭(HSI和HSE的振荡器关闭,不改变GPIO管脚状态)。


6、唤醒方式:任意外部中断 或者 RTC闹钟


7、唤醒延时:有,(关闭电压调节器唤醒时间更长)。


8、唤醒之后:重新初始化时钟。


9、程序继续运行。


 


代码:


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 Base

      To 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 ms

        Wakeup 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(); 

  }

}

 


3、待机模式


软件步骤(粗体是必须做的步骤):


1、是否允许访问备份区


2、是

[1] [2]

关键字:STM32MX  电源管理  低功耗模式

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/ic467323.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32低功耗时引脚配置
下一篇:STM32开发笔记46:STM32F0低功耗设计

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32Cube MX 下IIC的配置与使用--GPIO模拟

本文介绍了在STM32下的IIC的基本使用方法,通过对板载具备IIC接口EEPROM的读写,完成对IIC驱动程序的测试。硬件平台:STM32F107VCT6开发板软件平台:STM32Cube MX + MDK5.221. 进行STM32Cube MX的配置配置PB6和PB7为输出模式,同时配置了USART1进行串口调试使用。然后生成工程。2. 打开工程,可以看到GPIO的初始化状态3. 模拟IIC驱动程序源文件代码/**  * @file  iic_dup.c  * @brief IIC上层程序  * @par   date     
发表于 2019-07-09
STM32Cube MX 下IIC的配置与使用--GPIO模拟

STM32Cube MX学习二--定时器、外部中断

,我们需要调用定时器的基础启动函数:HAL_TIM_Base_Start_IT(&htim3)这里我们使用的是TIM3。5、中断函数我们寻找stm32.....it.c文件,里面是所有中断的路径,系统生成的中断函数当然也是在里面的。但是我们看到的就一个调用函数。void TIM3_IRQHandler(void){  /* USER CODE BEGIN TIM3_IRQn 0 */  /* USER CODE END TIM3_IRQn 0 */  HAL_TIM_IRQHandler(&htim3);  /* USER CODE BEGIN TIM3_IRQn 1 */ 
发表于 2019-06-15
STM32Cube MX学习二--定时器、外部中断

STM32Cube MX 下IIC的配置与使用

本文介绍了在STM32下的IIC的基本使用方法,通过对板载具备IIC接口EEPROM的读写,完成对IIC驱动程序的测试。硬件平台:STM32F107VCT6开发板软件平台:STM32Cube MX + MDK5.221. 进行STM32Cube MX的配置配置PB6和PB7为输出模式,同时配置了USART1进行串口调试使用。然后生成工程。2. 打开工程,可以看到GPIO的初始化状态3. 模拟IIC驱动程序源文件代码/**  * @file  iic_dup.c  * @brief IIC上层程序  * @par   date     
发表于 2018-11-26
STM32Cube MX 下IIC的配置与使用

STM32F10X SPI操作flash MX25L64读写数据

  简单的一种应用,ARM芯片作为master,flash为slaver,实现单对单通信。ARM主控芯片STM32F103,flash芯片为MACRONIX INTERNATIONAL的MX25L6465E,64Mbit。  SPI应该是嵌入式外围中最简单的一种应用了吧!一般SPI应用有两种方法:软件仿真,手动模拟产生时序和应用主控芯片的SPI控制器。  一般采用第二种方法比较好,比较稳定。应用主控芯片的SPI控制器,要点:正确的初始化SPI、操作SPI各寄存器和正确理解flash的时序。下面是过程,采用的是STM32F10X自带的库函数 1、初始化:void SpiFlashInitialzation(void
发表于 2017-02-07

Maxim凭借市场领先的汽车视频传输和电源管理创新技术提升联发科车载信息娱乐平台性能

Maxim的GMSL串行器/解串器技术将全景视频传输距离提高33%Maxim Integrated Products, Inc (NASDAQ: MXIM)今日宣布其汽车产品入选联发科技(MediaTek)的AUTUS (智能座舱系统)车载信息娱乐(IVI)平台。为了保障汽车制造商和1级供应商对高性能、灵活性和高效率的需求,Maxim的吉比特多媒体串行链路(GMSL)串行器和解串器(SerDes)技术提供业内最佳的视频传输性能。此外,Maxim的电源管理方案也帮助联发科平台有效提升多媒体性能和效率。了解Maxim汽车信息娱乐系统方案:https://www.maximintegrated.com/cn/markets
发表于 2019-07-09
Maxim凭借市场领先的汽车视频传输和电源管理创新技术提升联发科车载信息娱乐平台性能

减小EMI,提高密度和集成隔离是2019年电源发展的三大趋势

毫无疑问,电源在调节、传输和功耗等各个方面都成为日益重要的话题。人们期望产品功能日趋多样、性能更强大、更智能、外观更加酷炫,业界看到了关注电源相关问题的重要意义。展望2019年,三大广泛的问题最受关注,即:密度、EMI和隔离(信号和电源)。 实现更高的密度:将更多电源管理放入更小的空间 由于IC光刻工艺和每个功能运行功率的大幅缩减,使得芯片上可集成更多功能和栅极,对成品的总体功率需求迅速增长,如图1所示。一些处理器现在可以消耗几百安培电流,并且可以在不到一微秒的时间内从低电流状态上升到完全激活状态。通过降低损耗和提高热性能实现“在硬币大小的面积上达到千瓦级功率”的密度目标并非一句玩笑话。图1:从1992年
发表于 2019-05-24
减小EMI,提高密度和集成隔离是2019年电源发展的三大趋势

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved