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

STM32L4R5 Nucleo低功耗例程测试验证

[复制链接]
SimonLuk 提问时间:2018-3-1 18:30 /
本帖最后由 ahuaahua 于 2018-3-1 18:38 编辑

有幸在年初的答题中,获得Nucleo STM32L4R5ZI板一块。正所谓吃别人的嘴软,免费拿人家的……必须要发个评测弘扬一下ST大法好~~~但是板子寄到手时已接近春节,年后回来放浪至今才有时间拿出来玩,不知道还能不能参加评测奖励?

L4 Plus主打图形、低功耗,以及高主频、大Flash、和帅气的Ram,还有加密等等一系列特性(具体见手册),由于时间关系,本次先对最重要的低功耗特性进行验证。

1、原理验证
            根据Nucleo 144的原理图,MCU主要由两个地方提供电源:VDD和VDD_MCU。其中,VDD提供给IO、模拟、USB等部分。VDD_MCU则提供给VBAT,并通过SB167选择提供给模拟部分。详见下图:
VDD2.png
1.1  VDD来源:
经过JP6选择电源后,由U6降压为3.3V,经VDD提供给MCU。VDD前的JP5(IDD),即为板子提供的电流测试点。详见下图:
VDD1.png
1.2  VDD_MCU来源:
            由下图可知,VDD_MCU由VDD产生,产生的方式根据Nucleo板子是否带有SMPS功能(就是外部的开关电源)决定。本次到手的板子,是不带这个功能的,保持原样即可。如果有同学收到带“-P”版本的板子,需要注意这个问题,必要时修改对应的连接。
VDD3.png

SMPS1.png
SMPS2.png


1.3  由以上原理分析可知:
            只要在JP5跳线帽上测试电流,就可以大概知道MCU的功耗情况。为什么要说大概?因为还有一个器件也使用VDD_MCU,它就是U14:
VDD4.png
            追求极致的同学们可以详细查SN74LVC2T45的资料,在此我就不累赘了。




2  测试方法


2.1  必须再歌颂一次ST大法好
在STM32CubeL4库里,已经有对应的低功耗Example例程,直接编译下载到板子上即可测试。
Serial.png
            在用户的目录下,STM32Cube\Repository\STM32Cube_FW_L4_V1.11.0\Projects\NUCLEO-L4R5ZI\Examples\PWR\PWR_ModesSelection里,可以找到一个关于这个工程的readme.txt的文件:
  1. - PWR/PWR_ModesSelection/Inc/stm32l4xx_conf.h         HAL Configuration file
  2.   - PWR/PWR_ModesSelection/Inc/stm32l4xx_it.h           Header for stm32l4xx_it.c
  3.   - PWR/PWR_ModesSelection/Inc/main.h                   Header file for main.c
  4.   - PWR/PWR_ModesSelection/Src/system_stm32l4xx.c       STM32L4xx system clock configuration file
  5.   - PWR/PWR_ModesSelection/Src/stm32l4xx_it.c           Interrupt handlers
  6.   - PWR/PWR_ModesSelection/Src/main.c                   Main program
  7.   - PWR/PWR_ModesSelection/Src/lprun_test.c             Low Power RUN mode test
  8.   - PWR/PWR_ModesSelection/Src/lpsleep_test.c           Low Power SLEEP mode test
  9.   - PWR/PWR_ModesSelection/Src/run_range1_test.c        RUN mode in range 1 test
  10.   - PWR/PWR_ModesSelection/Src/run_range2_test.c        RUN mode in range 2 test
  11.   - PWR/PWR_ModesSelection/Src/shutdown_test.c          SHUTDOWN mode test
  12.   - PWR/PWR_ModesSelection/Src/sleep_range1_test.c      SLEEP mode in range 1 test
  13.   - PWR/PWR_ModesSelection/Src/sleep_range2_test.c      SLEEP mode in range 2 test
  14.   - PWR/PWR_ModesSelection/Src/standby_rtc_sram2_test.c STANDBY mode with RTC and SRAM2 preserved test
  15.   - PWR/PWR_ModesSelection/Src/standby_rtc_test.c       STANDBY mode with RTC test
  16.   - PWR/PWR_ModesSelection/Src/standby_test.c           STANDBY mode test
  17.   - PWR/PWR_ModesSelection/Src/stop1_mroff_rtc_test.c   STOP1 mode with RTC but Regulator OFF test
  18.   - PWR/PWR_ModesSelection/Src/stop1_mroff_test.c       STOP1 mode with Regulator OFF  test
  19.   - PWR/PWR_ModesSelection/Src/stop2_rtc_test.c         STOP2 mode with RTC test
  20.   - PWR/PWR_ModesSelection/Src/stop2_test.c             STOP2 mode test
复制代码

2.2  简单抽其中几个,看看这些模式究竟做了什么:
  1. void test_lprun_2mhz(void)
  2.   {
  3.   printf("\n\r Executing test (LPRUN 2MHz - with FLASH ART ON) \n\r");
  4.   printf(" Please measure current then use Reset button to select another test \n\r");

  5.   /* Set all GPIO in analog state to reduce power consumption */
  6.   GPIO_AnalogState_Config();
  7.   
  8.   /* Set the System clock to 2 MHz (MSI) */
  9.   SystemClock_2MHz();
  10.   
  11.   /* Suspend Tick increment to prevent wakeup by Systick interrupt.         */
  12.   /* Otherwise the Systick interrupt will wake up the device within 1ms     */
  13.   /* (HAL time base).                                                       */
  14.   HAL_SuspendTick();

  15. #ifdef USE_STM32L4XX_NUCLEO
  16.   /* Disable USART2 clock */
  17.   __HAL_RCC_USART2_CLK_DISABLE();
  18. #elif USE_STM32L4XX_NUCLEO_144
  19.   /* Disable LPUART1 clock */
  20.   __HAL_RCC_LPUART1_CLK_DISABLE();
  21. #endif
  22.   
  23.   /* Enable Power Clock */
  24.   __HAL_RCC_PWR_CLK_ENABLE();
  25.   
  26.   /* Enter LP RUN mode */
  27.   HAL_PWREx_EnableLowPowerRunMode();

  28.   /* Disable Power Clock */
  29.   __HAL_RCC_PWR_CLK_DISABLE();
  30.   
  31.   while1Aligned64();
  32.   
  33. }
复制代码
很简单的几步:
1、把IO口都设为模拟;
2、更改时钟;
3、停掉Systick和串口;
4、打开电源时钟;
5、使能一下LP RUN;
6、关闭电源时钟;
7、死循环。

  1. void test_run_range1_80mhz(void)
  2.   {
  3.   printf("\n\r Executing test (RUN Range 1, 80MHz - with FLASH ART ON) \n\r");
  4.   printf(" Please measure current then use Reset button to select another test \n\r");

  5.   /* Set all GPIO in analog state to reduce power consumption */
  6.   GPIO_AnalogState_Config();
  7.   
  8. #ifdef USE_STM32L4XX_NUCLEO
  9.   /* Disable USART2 clock */
  10.   __HAL_RCC_USART2_CLK_DISABLE();
  11. #elif USE_STM32L4XX_NUCLEO_144
  12.   /* Disable LPUART1 clock */
  13.   __HAL_RCC_LPUART1_CLK_DISABLE();
  14. #endif
  15.   
  16.   /* Set System clock to 80 MHz (MSI) */
  17.   SystemClock_80MHz();
  18.   
  19.   /* Suspend Tick increment to prevent wakeup by Systick interrupt.         */
  20.   /* Otherwise the Systick interrupt will wake up the device within 1ms     */
  21.   /* (HAL time base).                                                       */
  22.   HAL_SuspendTick();
  23.   
  24.   while1Aligned64();
  25.   
  26. }
复制代码
更为简单的几步:
1、把IO口都设为模拟;
2、关掉串口;
3、更改时钟;
4、停掉Systick;
5、死循环。

  1. void test_stop2(void)
  2. {
  3.   printf("\n\r Executing test (STOP2) \n\r");
  4.   printf(" Please measure current then use Reset button to select another test \n\r");

  5.   /* Set all GPIO in analog state to reduce power consumption */
  6.   GPIO_AnalogState_Config();
  7.   
  8.   /* Enable Power Clock */
  9.   __HAL_RCC_PWR_CLK_ENABLE();
  10.   
  11.   /* Enter STOP 2 mode */
  12.   HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);
  13.   
  14. }
复制代码
还可以更简单的几步:
1、把IO口都设为模拟;
2、关掉电源时钟;
3,发一个WFI指令。




2.4 这里需要补充啰嗦几句:
2.4.1、把IO设为模拟,这只是在测试中,排除外部干扰,使测试数据“单纯”一些的使用方法。实际产品一般不会这么用,因为这样会降低产品的抗干扰能力,比如EMI。
2.4.2、这里的测试,都没有使用外部HSE时钟,全部使用MSI(RC振荡产生)。在实际产品中,不使用外部晶振的情况比较少,而外部晶振所需要的电流,对测试的影响还是较大的。
2.4.3、由于Nucleo板的设置,VBAT是直连VDD_MCU和VDD的,所以测试并不能完全反映MCU在VDD断开,且VBAT在电池供电下的情况。



3、测试
            既然方法都知道了,撸起袖子动手干吧。由于财力有限(求土豪赞助,求高大上的老板收留),拿出手的只有一个比对过、精度相对较好的4位半万用表,结果如下:
  
No.
  
Desc.
Curr. (mA)
  
0
  
SHUTDOWN  
0.0000-0.0001
  
1
  
STANDBY
0.0001-0.0002
  
2
  
STANDBY  + RTC
0.0007
  
3
  
STANDBY  + RTC + SRAM2
0.0012
  
4
  
STOP2
0.0027
  
5
  
STOP2   + RTC
0.0033
  
6
  
STOP1   + MR OFF
0.0727
  
7
  
STOP1   + MR OFF + RTC
0.0731
  
8
  
LPSLEEP  2MHz - FLASH OFF
0.171
  
9
  
LPRUN   2MHz - with FLASH ART ON
0.517
  
10
  
SLEEP  Range 2, 24MHz - with FLASH ART ON
0.852
  
11
  
SLEEP  Range 1, 80MHz - with FLASH ART ON
2.803
  
12
  
RUN   Range 2, 24MHz - with FLASH ART ON
2.920
  
13
  
RUN   Range 1, 80MHz - with FLASH ART ON
11.249
IMG_2272.JPG IMG_2271.JPG


3.1测试结果的看法:
3.1.1、在STANDBY状态中,反正都停下来了,能不用SRAM就别用,功耗增加近1倍,尽量用备份域保存数据。
3.1.2、STOP1和STOP2的功耗区别是明显的。
3.1.3、如果要RUN,且没什么性能要求,LP RUN是很好的选择。但是要注意外设的处理。
3.1.4、仪表所限,电流较低的几个测试已接近仪表的极限和误差,仅作参考。



3.2  题不是白答的,板子不是白拿的,测试不是白做的。
清楚记得,L4R5是可以跑120MHz的,这个测试只是跑到了80MHz(也就是前任L4的速度,不知是故意为之,还是忘了修改),还没显示出这个测试中MCU,最高主频的状态。

重要的事情要说第三遍了:ST大法真的好!修改时钟这种事,小手一抖,简单得不得了!


3.2.1打开最新的CubeMX,选择NucleoL4R5ZI板子,Do NOT初始化默认外设设置(因为会打开很多功能),直接进去,看时钟配置:
3.2.2选择时钟源为MSI,PLLCLK,在HCLK输入120,然后就自动算出PLLM1的N为60,R为2。然后生成代码。
CubeMX Clock.png



3.2.3 为了偷懒,直接修改测试13。对比一下生成的代码以及测试13的代码:


CubeMX生成的代码:
  1. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
  2.   RCC_OscInitStruct.MSIState = RCC_MSI_ON;
  3.   RCC_OscInitStruct.MSICalibrationValue = 0;
  4.   RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;
  5.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  6.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
  7.   RCC_OscInitStruct.PLL.PLLN = 60;
  8.   RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
复制代码

测试13的代码:
  1. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
  2. RCC_OscInitStruct.MSIState = RCC_MSI_ON;
  3. RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;
  4. RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT; //这个宏的值是0
  5. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  6. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
  7. RCC_OscInitStruct.PLL.PLLM = 1;
  8. RCC_OscInitStruct.PLL.PLLN = 40;
  9. RCC_OscInitStruct.PLL.PLLR = 2;
复制代码

由此可见,直接把测试13的RCC_OscInitStruct.PLL.PLLN,改成60即可。

修改代码后,再跑一次测试,结果是:

  
No.
  
Desc.
Curr. (mA)
  
14
  
RUN   Range 1, 120MHz - with FLASH ART ON
16.61

IMG_2291.JPG
好了,测试到此就结束了。
按照测试的结果计算,3.3V的电源下,MCU在全速的时候功率约为55mW,还是相当不错滴。


最后,尽管是ST大法好,还是要吐槽一下:CubeMX的功率估算,L4R5的数据还没更新(只能到80MHz)。作为当前主推的产品,请注意细节~

CubeMX Power.png
感谢观看,请丢给我小红花。




收藏 评论2 发布时间:2018-3-1 18:30

举报

2个回答
zero99 回答时间:2018-3-2 09:32:52
不错的文章,学习下 ,已汇总到
https://www.stmcu.org.cn/module/forum/thread-614299-1-1.html

接下来也会汇总到3月的技术原创中~
sky_han 回答时间:2019-4-1 17:38:05
使用内部MSI測試功耗,参考意义不大,因为实际项目会使用外部晶振,外部晶振开启会增加0.4ma功耗

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版