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

查看: 3061|回复: 2

[STM32L4+] STM32L4R5 Nucleo低功耗例程测试验证

[复制链接]

6

主题

25

回帖

0

蝴蝶豆

中级会员

最后登录
2020-11-24
发表于 2018-3-1 18:30:42 | 显示全部楼层 |阅读模式
本帖最后由 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
感谢观看,请丢给我小红花。




<
回复

使用道具 举报

1182

主题

3785

回帖

1

蝴蝶豆

论坛元老

最后登录
2020-3-17
发表于 2018-3-2 09:32:52 | 显示全部楼层
不错的文章,学习下 ,已汇总到
https://www.stmcu.org.cn/module/forum/thread-614299-1-1.html

接下来也会汇总到3月的技术原创中~
回复 支持 反对

使用道具 举报

10

主题

45

回帖

18

蝴蝶豆

高级会员

最后登录
2020-8-17
发表于 2019-4-1 17:38:05 | 显示全部楼层
使用内部MSI測試功耗,参考意义不大,因为实际项目会使用外部晶振,外部晶振开启会增加0.4ma功耗
回复 支持 反对

使用道具 举报

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