你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 3543|回复: 5

ST线下培训(05-23成都站)STM32L476低功耗设计(二)

[复制链接]

74

主题

1368

回帖

194

蝴蝶豆

版主

最后登录
2020-5-12
发表于 2017-6-18 19:27:02 | 显示全部楼层 |阅读模式
本帖最后由 wolfgang2015 于 2017-7-5 22:55 编辑

后篇链接:



ST线下培训(05-23成都站)STM32L476低功耗设计(二)   

——实际测量STM32L476 板子在不同功耗模式下的功耗值


1、实验目标及原理分析
操控STM32L476开发板在以下低功耗模式后测得低功耗值:
    1、Shutdown;
    2、Standby;
    3、Stop2;
    4、LPSLeep 2MHz
按照官方手册提供的方法,进入低功耗的相关操作如下:
  1)、如需要进入Shutdown模式,步骤如下:
     a) LPMS="1--";
     b) SleepDEEP置位;
     c) 执行WFI()汇编指令 或 从ISR/WFE返回
  在HAL库提供了进入Shutdown模式的函数,在stm32l4xx_hal_pwr_ex.h 中,使用HAL_PWREx_EnterSHUTDOWNMode(); 可进入Shutdown模式;

  2)、如需进入Standby模式,步骤如下:
    a)LPMS="011";
    b)RRS置零;
    c)SleepDEEP置位
    d) 执行WFI()汇编指令 或 从ISR/WFE返回
   在HAL库提供了进入Shutdown模式的函数, 在stm32l4xx_hal_pwr.h 中,使用HAL_PWR_EnterSTANDBYMode();可进入Standby模式;

  3)、如需进入Stop2模式,步骤如下:
     a)LPMS="010";
     b)SleepDEEP置位;
     c) 执行WFI()汇编指令 或 从ISR/WFE返回
  在HAL库提供了进入Stop2模式的函数, 在stm32l4xx_hal_pwr_ex.h中,使用HAL_PWREx_EnterSTOP2Mode();可进入Stop2模式;

  4)、如需进入LPSLeep 并使用2MHz系统频率,进入低功耗操作如下:
    a) LPR置位;
    B) 执行WFI()汇编指令 ISR返回;
    在HAL库提供了进入LPSLeep模式的函数, 在stm32l4xx_hal_pwr.h 中,使用HAL_PWR_EnterSLEEPMode();可进入LPSLeep模式;
   另外,需要限定MCU输出2MHz的时钟频率,需要在进入低功耗时对MCU的基础时钟频率进行设置,满足2MHz的系统频率。




2
、实验步骤
2.1过程CubeMX代码生成
a)、选择Nucleo-L476RG开发板
02-01.jpg

b)、使用默认引脚配置,并增加USART2的引脚PA2、PA3设置
02-02.jpg

c)、使用默认的80MHz的SysCLK

02-03.jpg

d)、USART2设置:
02-04.jpg
e)、GPIO设置:
LED2 Pin设置
02-05.jpg

KeyPin设置
02-06.jpg


f)、NVIC设置
02-07.jpg
02-08.jpg


  以上搭建了基本应用功能,然后用CubeMX自动生成代码,然后再Keil中进行调试。
备注:这里搭建代码初衷是建立一个标准的工作状态运行环境后,再利用低功耗函数进入低功耗模式,最后通过表格将标准工作状态的能耗与低功耗模式下的能耗进行比较:
   标准工作状态使用环境:MCU使用最大主频(80MHz);1~2个LED受程序控制正常闪亮;1个具备中断使能的按键;1个具备收发数据功能的串口设备。

2.2代码调试
之前的LED、按键中断、串口功能可以见之前的系列文章
这里低功耗核心功能函数如下:分别进入ShutDown模式、Standby模式、Stop2模式、LowerPowerSleep模式

  1. /* USER CODE BEGIN 4 */
  2.    
  3. ........
  4.    
  5. void Test_Shutdown(void){
  6.    
  7.      /* Enter the SHUTDOWN mode */
  8.    
  9.      HAL_PWREx_EnterSHUTDOWNMode();
  10.    
  11. }

  12. void test_standby(void){
  13.    
  14.      /* Request to enter STANDBY mode */
  15.    
  16.      HAL_PWR_EnterSTANDBYMode();
  17.    
  18. }

  19. void test_stop2(void){
  20.    
  21.      /* Enter STOP 2 mode */
  22.    
  23.      HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFE);
  24.    
  25. }

  26. void test_lpsleep_2mhz(void){
  27.    
  28.      SystemClock_2MHz();
  29.    
  30.      /* Enter SLEEP Mode, Main regulator is OFF */
  31.    
  32.      HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON,    PWR_SLEEPENTRY_WFI);
  33.    
  34. }

  35. ......
  36.    
  37. /* USER CODE END 4 */
复制代码

  1. void SystemClock_2MHz(void){
  2.    
  3.      RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  4.    
  5.      RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  6.    
  7.      /* MSI is enabled after System reset, update MSI to 2Mhz    (RCC_MSIRANGE_5) */
  8.    
  9.      RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
  10.    
  11.      RCC_OscInitStruct.MSIState = RCC_MSI_ON;
  12.    
  13.      RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_5;
  14.    
  15.      RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
  16.    
  17.      RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  18.    
  19.      if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  20.    
  21.      {
  22.    
  23.        /* Initialization Error */
  24.    
  25.        Error_Handler();
  26.    
  27.      }

  28.      /* Select MSI as system clock source and configure the HCLK, PCLK1    and PCLK2
  29.    
  30.         clocks dividers */
  31.    
  32.      RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
  33.    
  34.      RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI;
  35.    
  36.      RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  37.    
  38.      RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;  
  39.    
  40.      RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  41.    
  42.      if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) !=    HAL_OK)
  43.    
  44.      {
  45.    
  46.        /* Initialization Error */
  47.    
  48.        Error_Handler();
  49.    
  50.      }  
  51.    
  52. }
复制代码



这里值得注意的是:进入2MHz主频需要选择MSI,原因在后面描述。
使用以上基础功能对低功耗进行测量后的结果如下
RUN:     15mA;(外设功能活动)
SHUTDOWN:0.08uA;(外设功能停止)
STANDBY: 0.18uA;(外设功能停止)
STOP2:    2.6mA;(外设功能停止)
LPSLEEP2MHz: 1.0~3.6mA(外设功能活动);
02-001.jpg

在进入低功耗功能时还在串口还在发送数据“\0”(波特率不匹配的乱码),截图如下:
02-002.jpg

2.3试验改进与数据测量
2.3.1关闭必要调度器(FLASH 进入休眠模式)

  1. /* Enable Flash power down mode during    Sleep mode     */
  2.    
  3.      /* (uncomment this line if power consumption figures  */
  4.    
  5.      /*  must be measured with    Flash still on in Low Power */
  6.    
  7.      /*  Sleep mode)                                       */
  8.    
  9.      __HAL_FLASH_SLEEP_POWERDOWN_ENABLE();
复制代码


在进入Low Power Sleep 2MHz模式前关闭调度器
测的各种模式下的功耗值:
RUN:              15mA;(外设功能活动)
SHUTDOWN:      0.08uA;(外设功能停止)
STANDBY:       0.18uA;(外设功能停止)
STOP2:          2.6mA;(外设功能停止)
LPSLEEP2MHz: 1.0~3.6mA(外设功能活动);
    主要针对LPSLEEP的功能改进,应本应用未涉及FLASH的调用,所以对测量结果影响不大,待使用了FSMC接口或IAP相关功能代码后进一步测量。
2.3.2改进引脚功能设置
在进入低功耗之前将无关的引脚功能关闭,或者设置称为逻辑电路的功能。是否能有效降低各种模式下的能耗水平

  1. void GPIO_AnalogState_Config(void)
  2.    
  3. {
  4.    
  5.      GPIO_InitTypeDef GPIO_InitStruct1;     
  6.    
  7.      /* Set all GPIO in analog state to reduce power consumption, */
  8.    
  9.      __HAL_RCC_GPIOA_CLK_ENABLE();
  10.      __HAL_RCC_GPIOB_CLK_ENABLE();
  11.      __HAL_RCC_GPIOC_CLK_ENABLE();
  12.      __HAL_RCC_GPIOD_CLK_ENABLE();
  13.      __HAL_RCC_GPIOE_CLK_ENABLE();
  14.      __HAL_RCC_GPIOF_CLK_ENABLE();
  15.      __HAL_RCC_GPIOG_CLK_ENABLE();
  16.      __HAL_RCC_GPIOH_CLK_ENABLE();
  17.    
  18.      GPIO_InitStruct1.Pin = GPIO_PIN_All;
  19.      GPIO_InitStruct1.Mode = GPIO_MODE_ANALOG;
  20.      GPIO_InitStruct1.Speed = GPIO_SPEED_FREQ_LOW;
  21.      GPIO_InitStruct1.Pull = GPIO_NOPULL;

  22.      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct1);
  23.      HAL_GPIO_Init(GPIOB, &GPIO_InitStruct1);
  24.      HAL_GPIO_Init(GPIOC, &GPIO_InitStruct1);
  25.      HAL_GPIO_Init(GPIOD, &GPIO_InitStruct1);
  26.      HAL_GPIO_Init(GPIOE, &GPIO_InitStruct1);
  27.      HAL_GPIO_Init(GPIOF, &GPIO_InitStruct1);
  28.      HAL_GPIO_Init(GPIOG, &GPIO_InitStruct1);
  29.      HAL_GPIO_Init(GPIOH, &GPIO_InitStruct1);  

  30.      __HAL_RCC_GPIOA_CLK_DISABLE();
  31.      __HAL_RCC_GPIOB_CLK_DISABLE();
  32.      __HAL_RCC_GPIOC_CLK_DISABLE();
  33.      __HAL_RCC_GPIOD_CLK_DISABLE();
  34.      __HAL_RCC_GPIOE_CLK_DISABLE();
  35.      __HAL_RCC_GPIOF_CLK_DISABLE();
  36.      __HAL_RCC_GPIOG_CLK_DISABLE();
  37.      __HAL_RCC_GPIOH_CLK_DISABLE();

  38. }
复制代码

RUN:          15mA;(外设功能活动)
SHUTDOWN:  0.08uA;(外设功能停止)
STANDBY:   0.18uA;(外设功能停止)
STOP2:      1.55uA;(外设功能停止)
LPSLEEP2MHz: 1.0mA(外设功能停止);
    Stop2 模式 及 LPSLEEP 模式 均出现了功耗下降的情况。但LPSLEEP 2MHz模式与官方提供的最低功耗仍然有差距,优化模式还待挖掘。

2.3.3改进时钟及主频

  1. void SystemClock_Config(void){
  2.    
  3.      .........
  4.    
  5.      //2M时钟配置好后,关闭HSI时钟及相关的PLL时钟。最佳到函数内最后
  6.    
  7.      #ifdef CORRECT_STEP3
  8.    
  9.      RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  10.    
  11.      RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
  12.    
  13.      RCC_OscInitStruct.PLL.PLLState = RCC_PLL_OFF;
  14.    
  15.      if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  16.    
  17.      {
  18.    
  19.        /* Initialization Error */
  20.    
  21.        Error_Handler();
  22.    
  23.      }
  24.    
  25.      #endif
  26.    
  27. }
复制代码

在CubeMX生成的时钟配置函数中SystemClock_Config(),使用的是HSI,按80MHz额定最大频率跑应用,为规避相关时钟未关闭造成的空转能耗,这里需要将HSI及相关PLL配置关闭停用。
RUN:            15mA;(外设功能活动)
SHUTDOWN:    0.08uA;(外设功能停止)
STANDBY:     0.18uA;(外设功能停止)
STOP2:       1.51uA;(外设功能停止)
LPSLEEP2MHz: 0.351mA(外设功能停止);
    LPSLEEP 模式功耗下降特别大,但仍旧还在百uA级别与官方提供的几十uA还差一个数量级。还需要进一步优化处理。

2.3.4关闭SystemTick及AHB、APB外设时钟进入休眠模式
  1. void SystemClock_2MHz(void){
  2.    
  3.      .........
  4.    
  5.      /* Suspend Tick increment to prevent wakeup by Systick    interrupt.         */
  6.    
  7.      /* Otherwise the Systick interrupt will wake up the device within    1ms     */
  8.    
  9.      /* (HAL time base).                                                       */
  10.    
  11.      HAL_SuspendTick();

  12.      /* Switch off all clock enable ... */
  13.    
  14.      RCC->AHB1SMENR = 0x0;
  15.      RCC->AHB2SMENR = 0x0;
  16.      RCC->AHB3SMENR = 0x0;
  17.      RCC->APB1SMENR1 = 0x0;
  18.      RCC->APB1SMENR2 = 0x0;
  19.      RCC->APB2SMENR = 0x0;
  20.      ......
  21. }
复制代码
RUN:          15mA;(外设功能活动)
SHUTDOWN:  0.08uA;(外设功能停止)
STANDBY:   0.18uA;(外设功能停止)
STOP2:     1.51uA;(外设功能停止)
LPSLEEP2MHz: 86uA(外设功能停止);
  LPSLEEP 模式功耗下降几十uA数量级了,界此针对80MHz主频下LED、按键、串口基础功能应用上低功耗优化可以告一段落。已经满足和接近官方提供的参考数据。


2.4试验结果数据汇总一览
02-09.jpg

main.rar (5.08 KB, 下载次数: 79)
回复

使用道具 举报

60

主题

2051

回帖

31

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2017-6-19 10:01:03 | 显示全部楼层
感谢分享!!
回复 支持 反对

使用道具 举报

64

主题

744

回帖

23

蝴蝶豆

实习版主

最后登录
2020-12-8
发表于 2017-6-19 13:17:54 | 显示全部楼层

感谢分享!!
回复 支持 反对

使用道具 举报

1182

主题

3785

回帖

1

蝴蝶豆

论坛元老

最后登录
2020-3-17
发表于 2017-6-19 15:23:35 | 显示全部楼层
谢谢楼主~
回复 支持 反对

使用道具 举报

0

主题

56

回帖

3

蝴蝶豆

中级会员

最后登录
2018-8-7
发表于 2018-5-17 10:01:27 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

0

主题

21

回帖

0

蝴蝶豆

中级会员

最后登录
2020-11-30
发表于 2020-9-17 20:37:17 | 显示全部楼层
SSSSSSSSSSSSSSS
回复 支持 反对

使用道具 举报

请先关注话题后回复
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版