这又是一个系列的新品,ST的产品线越来越丰富了。U0系列应该是最新的低功耗产品。这里对NUCLEO-STM32U083RC 做个低功耗下的测试。该芯片内部时钟比早年产品多了个MSI时钟,就用MSI做系统时钟源新建工程。
" V) w+ W4 h, Q ]: C1 [& v" {$ p2 X2 }6 h4 ~
Sleep Mode最为简单,仅内核停止,外设依旧运行,看起来就是停止执行程序了。可以配置为中断或事件唤醒。这里就测试外部中断唤醒,板卡的按键就可以方便的实现中断。7 S+ ]% `8 h' M/ z- Q: h
7 L9 ], Y! t7 H
- HAL_SuspendTick();
1 a' _5 r# q, @2 m9 V - printf("enter sleep mode \r\n");
" N+ G4 s: h9 S, E8 j0 ` - HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
+ g2 [! Z0 [6 [2 F - HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);9 }0 ^1 [% T) F( a/ Z
-
; k" P8 d( |4 q" Q8 m' F - HAL_ResumeTick();
8 K5 y& {4 N Q3 f$ i5 d" ] - HA L_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);' M# Y( l# L+ p4 i# o
- printf("exit sleep mode \r\n");
复制代码 以上代码实现进入Sleep模式,打开LED灯,唤醒后关闭LED灯,并打印提示语句。因为这个低功耗模式下GPIO状态会保持,所以能看到在睡眠后LED依旧亮着。测试了下两种模式下的电流如下
* r5 t! f( C. d% V, ~; [3 Y# c0 c4 j0 \
- K& T1 ^4 V" H) t6 J ]4 J 本身的电流已经很小了,进入睡眠后的电流能降低一倍,还是不错的。
6 g# \( a, r- o; c Stop Mode下外设也会停止工作,理论上能够更省电。因为保留了1.2V的供电,所以能保留寄存器内存数据,唤醒后也可以继续执行上次停止时的代码。这里也测试下电流差异。
* j2 U" E. u- ?; @7 y. e. V% _( ~ 首先添加测试代码, 仍旧已外部中断做唤醒。$ e% L! p) L2 N
7 e' W3 q) [8 a2 c' D
- HAL_SuspendTick();1 o1 V3 i/ f2 h" @) a) L
- printf("enter stop mode \r\n");* B$ a6 H5 V0 x) Y9 v
- HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
$ W$ j8 ^$ z5 }& M0 x - HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);1 N# T8 M+ M1 D, |+ c+ t) R
- 4 A/ k3 A: Y) H: M
- HAL_ResumeTick();0 N, l6 q5 f- y; Q4 m0 M% C
- HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);+ X J8 P) V# {( n0 P
- printf("exit stop mode \r\n");
复制代码 程序和sleep模式下相同,因为除了电流,表面看起来的状态最为相似。测试电流如下
- P, H- T' @, o3 C$ w
这次就比较明显了,关了外设省电多了。
6 U. A6 _/ q: q* Z2 \4 i- C Standby Mode比起停止模式则更为省电。因为他把1.2V区域的供电也关闭了,正因为如此,唤醒后没有任何进入待机前的记录,要重新运行程序才能完成想要的功能。而且,唤醒条件也更为单一,仅为WKUP引脚。这块Nucleo板的按键默认没有焊接上拉电阻,也就没有上升沿产生。但是RTC可以继续运行,因此能够使用RTC的Alarm中断进行唤醒。测试代码如下
P& U* D6 `* ~( i3 {1 q/ ]
* V, G- H+ [& _+ G7 C9 @, g
! `- M9 ]" U0 f! R9 [3 i1 s- if (HAL_RTCEx_SetWakeUpTimer(&hrtc, 0x500C, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK)! [0 ?- H: E) z9 O1 y
- {7 g h' M' s/ y0 l- B2 v$ E9 ~+ ~ K
- Error_Handler();
- R3 f1 ^* e, I - }7 F- z) P1 t$ F- m& Z" d8 R9 A# A
- printf("standby mode \r\n");- ]4 @- p6 ?0 {# Z& l
- HAL_PWR_EnterSTANDBYMode();
复制代码 设定一个RTC的唤醒中断,大概10秒钟。然后打印提示,进入待机模式。等待中断产生,程序从头运行,就会再次开启唤醒中断和打印提示语句。可怜我的小万用表已经测不到电流了,肯定是nA级别了。 还有个在L4上就有的低功耗模式,Shutdown Mode,这也许就是天花板级别了。LSI也关闭了,只能WKUP引脚去唤醒。最重要的是我的万用表已经没有用了。就不展示了。' y$ l/ e1 a% g# X% V$ Q, h
以上测试没有考虑唤醒后的时钟状态,仅作简单的功能测试。更详细的还有停止模式中分了模式0,模式1和模式2。对于不同的应用场景来说,U0系列有多种模式可选,能够实现不同的低功耗模式和唤醒方式,实现更低的电源消耗和更长时间的设备续航。
' y P6 n8 x5 r% l3 n. h& Y- o8 s# a |
感谢总结