这又是一个系列的新品,ST的产品线越来越丰富了。U0系列应该是最新的低功耗产品。这里对NUCLEO-STM32U083RC 做个低功耗下的测试。该芯片内部时钟比早年产品多了个MSI时钟,就用MSI做系统时钟源新建工程。
0 T* C# h: t8 L0 O
, v f; @% A1 J- u Sleep Mode最为简单,仅内核停止,外设依旧运行,看起来就是停止执行程序了。可以配置为中断或事件唤醒。这里就测试外部中断唤醒,板卡的按键就可以方便的实现中断。! H8 y& o$ ?) z% f9 R. f
% _7 {$ E1 G/ d1 ?7 O( s$ ?/ ~- HAL_SuspendTick();
3 w. S* [: P/ v% e, U5 c: Y - printf("enter sleep mode \r\n");
p" c4 U1 ^# X v, |" j, E - HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);+ F6 f- {/ |8 q# ^& |1 [0 J
- HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
5 ]" x9 S$ K2 ?4 H5 R J; ^ -
. p. t5 l3 ^) G7 f0 M - HAL_ResumeTick();
) V' a! X- D2 u( Q7 P) ? - HA L_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);' T) A: F" _& N
- printf("exit sleep mode \r\n");
复制代码 以上代码实现进入Sleep模式,打开LED灯,唤醒后关闭LED灯,并打印提示语句。因为这个低功耗模式下GPIO状态会保持,所以能看到在睡眠后LED依旧亮着。测试了下两种模式下的电流如下
9 E! x. a5 a9 Z% h
) U3 B6 @" S, L8 R9 z) F1 E0 [ e
本身的电流已经很小了,进入睡眠后的电流能降低一倍,还是不错的。
6 t i f2 o. E! W/ i( L- T, J. ~# u Stop Mode下外设也会停止工作,理论上能够更省电。因为保留了1.2V的供电,所以能保留寄存器内存数据,唤醒后也可以继续执行上次停止时的代码。这里也测试下电流差异。- G9 g8 l( x# g* Z, @" ^
首先添加测试代码, 仍旧已外部中断做唤醒。
) ?9 G2 Z2 \( b# S
% o& ?* r% I9 A% k. R: F5 ?- HAL_SuspendTick();4 B% Y* N2 h; {
- printf("enter stop mode \r\n");& f' W' D8 r8 u$ @0 g
- HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);9 i- \; V% Y# X& f
- HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);6 Z4 c6 j3 l" g& M2 t8 t
-
; R1 h v1 u& T - HAL_ResumeTick();8 g/ u5 E' z% P( y: r# o9 c* v
- HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
. @! P Z K7 | I/ \% Y) K - printf("exit stop mode \r\n");
复制代码 程序和sleep模式下相同,因为除了电流,表面看起来的状态最为相似。测试电流如下
5 _; _9 _2 w1 T! {4 ^) `0 B5 J6 O' O 这次就比较明显了,关了外设省电多了。
C& T9 h8 U4 E4 W: e Standby Mode比起停止模式则更为省电。因为他把1.2V区域的供电也关闭了,正因为如此,唤醒后没有任何进入待机前的记录,要重新运行程序才能完成想要的功能。而且,唤醒条件也更为单一,仅为WKUP引脚。这块Nucleo板的按键默认没有焊接上拉电阻,也就没有上升沿产生。但是RTC可以继续运行,因此能够使用RTC的Alarm中断进行唤醒。测试代码如下
0 t% j! P9 w( ]; B( ]9 E8 d
' _' r1 k% f8 D& V; `8 ]- w5 ?! o+ v
8 u& H1 w& H1 m; R9 b( W k- if (HAL_RTCEx_SetWakeUpTimer(&hrtc, 0x500C, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK)0 S% e1 J& ^ F$ i+ a! V: r
- {
! ~0 u9 E6 Q+ E1 P - Error_Handler();2 B! r6 a. r) q) s/ w$ d$ i1 U
- }0 B. L1 G/ E. u. C& X
- printf("standby mode \r\n");) [* M9 `3 b6 ?" p( o* u
- HAL_PWR_EnterSTANDBYMode();
复制代码 设定一个RTC的唤醒中断,大概10秒钟。然后打印提示,进入待机模式。等待中断产生,程序从头运行,就会再次开启唤醒中断和打印提示语句。可怜我的小万用表已经测不到电流了,肯定是nA级别了。 还有个在L4上就有的低功耗模式,Shutdown Mode,这也许就是天花板级别了。LSI也关闭了,只能WKUP引脚去唤醒。最重要的是我的万用表已经没有用了。就不展示了。. p+ d% a' l- e/ p* C
以上测试没有考虑唤醒后的时钟状态,仅作简单的功能测试。更详细的还有停止模式中分了模式0,模式1和模式2。对于不同的应用场景来说,U0系列有多种模式可选,能够实现不同的低功耗模式和唤醒方式,实现更低的电源消耗和更长时间的设备续航。
! m2 h2 }8 m& v |
感谢总结