这又是一个系列的新品,ST的产品线越来越丰富了。U0系列应该是最新的低功耗产品。这里对NUCLEO-STM32U083RC 做个低功耗下的测试。该芯片内部时钟比早年产品多了个MSI时钟,就用MSI做系统时钟源新建工程。
% e; l3 K2 s6 H: `2 ?
* D# |1 d6 J0 E% `5 G# U- f/ V
Sleep Mode最为简单,仅内核停止,外设依旧运行,看起来就是停止执行程序了。可以配置为中断或事件唤醒。这里就测试外部中断唤醒,板卡的按键就可以方便的实现中断。
! r9 ~& w! q8 u6 n; |. k( S1 V4 v( d, u; K9 n
- HAL_SuspendTick();
9 z1 U- c# z0 \ - printf("enter sleep mode \r\n");. u" N. x& W" E- ?/ g2 u% m- L9 }6 B1 @
- HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
/ e& W! I& N: I1 r; V - HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
2 F% c! O+ B2 v$ l8 q- l, m; m* [ - 8 ^5 M8 M/ _+ {
- HAL_ResumeTick();
1 A* }/ i" A U4 |6 \& |8 U* C% ~ - HA L_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
. P. d% @ t+ c! \2 U: p - printf("exit sleep mode \r\n");
复制代码 以上代码实现进入Sleep模式,打开LED灯,唤醒后关闭LED灯,并打印提示语句。因为这个低功耗模式下GPIO状态会保持,所以能看到在睡眠后LED依旧亮着。测试了下两种模式下的电流如下
, K' n* G: }! m5 F7 F) @! _; S4 z2 \& ?
本身的电流已经很小了,进入睡眠后的电流能降低一倍,还是不错的。
: o8 A, C! U8 \7 o' x5 Y) q ] Stop Mode下外设也会停止工作,理论上能够更省电。因为保留了1.2V的供电,所以能保留寄存器内存数据,唤醒后也可以继续执行上次停止时的代码。这里也测试下电流差异。
& G2 Z; ]+ @ q/ D6 ` 首先添加测试代码, 仍旧已外部中断做唤醒。7 R6 s# D' `5 A4 u
. n: M v) g" t- HAL_SuspendTick();
* P, Y1 {; D* h/ C9 l# Q - printf("enter stop mode \r\n");
: F# J" r- T! f& Z! O! m+ r9 B - HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
5 B6 s) L- P. U# A - HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);$ H6 u3 f7 b4 d2 z
-
6 ~& @# d$ E. @3 B* v# F! } - HAL_ResumeTick();
) E8 @ c7 ?8 l' P0 z& b - HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);1 A; `$ M7 X9 f5 d& D) g
- printf("exit stop mode \r\n");
复制代码 程序和sleep模式下相同,因为除了电流,表面看起来的状态最为相似。测试电流如下
R. m1 c; @# c T4 F( f 这次就比较明显了,关了外设省电多了。+ n2 Z' |7 @1 g- S1 b
Standby Mode比起停止模式则更为省电。因为他把1.2V区域的供电也关闭了,正因为如此,唤醒后没有任何进入待机前的记录,要重新运行程序才能完成想要的功能。而且,唤醒条件也更为单一,仅为WKUP引脚。这块Nucleo板的按键默认没有焊接上拉电阻,也就没有上升沿产生。但是RTC可以继续运行,因此能够使用RTC的Alarm中断进行唤醒。测试代码如下
2 P, j+ ?! B3 @% X$ S. M
3 \# a4 v \5 H
- c$ A: w% S3 n2 `6 F) v, ?- if (HAL_RTCEx_SetWakeUpTimer(&hrtc, 0x500C, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK)3 r4 i* n! H+ T- J# @
- {
% k, s5 @; ~7 w& K) h - Error_Handler();1 S8 m# R; C7 e' F
- }
- D2 o6 ~+ _; _; N - printf("standby mode \r\n");
& z' T9 C( ` H* O3 r - HAL_PWR_EnterSTANDBYMode();
复制代码 设定一个RTC的唤醒中断,大概10秒钟。然后打印提示,进入待机模式。等待中断产生,程序从头运行,就会再次开启唤醒中断和打印提示语句。可怜我的小万用表已经测不到电流了,肯定是nA级别了。 还有个在L4上就有的低功耗模式,Shutdown Mode,这也许就是天花板级别了。LSI也关闭了,只能WKUP引脚去唤醒。最重要的是我的万用表已经没有用了。就不展示了。
6 k3 q2 @# m9 |) K% G4 _' r; b 以上测试没有考虑唤醒后的时钟状态,仅作简单的功能测试。更详细的还有停止模式中分了模式0,模式1和模式2。对于不同的应用场景来说,U0系列有多种模式可选,能够实现不同的低功耗模式和唤醒方式,实现更低的电源消耗和更长时间的设备续航。
+ g( J: M* |8 v2 C* J1 _' s1 a |
感谢总结