这又是一个系列的新品,ST的产品线越来越丰富了。U0系列应该是最新的低功耗产品。这里对NUCLEO-STM32U083RC 做个低功耗下的测试。该芯片内部时钟比早年产品多了个MSI时钟,就用MSI做系统时钟源新建工程。
1 @4 \+ r/ a2 F a) E& B
0 B( f4 d6 o# T( |' J/ _
Sleep Mode最为简单,仅内核停止,外设依旧运行,看起来就是停止执行程序了。可以配置为中断或事件唤醒。这里就测试外部中断唤醒,板卡的按键就可以方便的实现中断。
4 F, s0 c% j6 ~1 T9 w D7 P
( O8 R' K. ~6 a8 s. R2 ? T, W- HAL_SuspendTick();
% w4 {" q( u' X6 b- o - printf("enter sleep mode \r\n");/ f8 v; f$ Q! X# a
- HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);1 z# g+ w g- M- L: W# U3 J; u" T, {5 d
- HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);/ i* H' F, w8 o- F( Y
-
* T$ J! B- D5 Z3 f - HAL_ResumeTick();
; J7 j: e( c+ ~6 K9 i - HA L_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
5 ~+ {/ ]) M$ C) N - printf("exit sleep mode \r\n");
复制代码 以上代码实现进入Sleep模式,打开LED灯,唤醒后关闭LED灯,并打印提示语句。因为这个低功耗模式下GPIO状态会保持,所以能看到在睡眠后LED依旧亮着。测试了下两种模式下的电流如下
1 Q: f( \: d# @: z" R
7 D' |" F' w+ B
本身的电流已经很小了,进入睡眠后的电流能降低一倍,还是不错的。
4 q) u1 g, z) {" w5 J/ d7 H- D( ? Stop Mode下外设也会停止工作,理论上能够更省电。因为保留了1.2V的供电,所以能保留寄存器内存数据,唤醒后也可以继续执行上次停止时的代码。这里也测试下电流差异。
" X' N# E% Q3 g! v* D* k 首先添加测试代码, 仍旧已外部中断做唤醒。
) b8 Q; U& h6 A6 @& N0 s0 w" O; g9 e& K
- HAL_SuspendTick();4 l- Y) A8 |8 b3 w- S
- printf("enter stop mode \r\n");* r9 V! o/ l. t. E4 [
- HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
2 f: Z, Z2 H8 B+ C4 k - HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);1 a. W2 r, V' Y( P4 x& u# s
-
; A+ b' G/ X- N! @ - HAL_ResumeTick();
& a; X3 T# H1 Z& n! b% e) N8 F - HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);8 s$ i( k9 F% G% E" B
- printf("exit stop mode \r\n");
复制代码 程序和sleep模式下相同,因为除了电流,表面看起来的状态最为相似。测试电流如下
! P3 [: y' P6 I0 j/ J: G" d) b
这次就比较明显了,关了外设省电多了。" x- j* a6 [% [# ^
Standby Mode比起停止模式则更为省电。因为他把1.2V区域的供电也关闭了,正因为如此,唤醒后没有任何进入待机前的记录,要重新运行程序才能完成想要的功能。而且,唤醒条件也更为单一,仅为WKUP引脚。这块Nucleo板的按键默认没有焊接上拉电阻,也就没有上升沿产生。但是RTC可以继续运行,因此能够使用RTC的Alarm中断进行唤醒。测试代码如下! \' e$ X) i: q- W5 A
( x( `9 O5 [ b3 N0 z3 Y
& Q# [, L6 Y! S+ e6 j. |- if (HAL_RTCEx_SetWakeUpTimer(&hrtc, 0x500C, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK)
: ^1 Z. A, @' c' I9 M; L - {+ g0 ]% `" m1 m; r2 |- W+ }' h) E" ?* Z
- Error_Handler();
" o W9 A9 c8 ?2 }- V. p: o - }- V0 q- O4 p; ]2 i+ Y# s
- printf("standby mode \r\n");/ w/ k T4 x x* _# M1 S: X% j' l
- HAL_PWR_EnterSTANDBYMode();
复制代码 设定一个RTC的唤醒中断,大概10秒钟。然后打印提示,进入待机模式。等待中断产生,程序从头运行,就会再次开启唤醒中断和打印提示语句。可怜我的小万用表已经测不到电流了,肯定是nA级别了。 还有个在L4上就有的低功耗模式,Shutdown Mode,这也许就是天花板级别了。LSI也关闭了,只能WKUP引脚去唤醒。最重要的是我的万用表已经没有用了。就不展示了。& p, Q% a1 s. p
以上测试没有考虑唤醒后的时钟状态,仅作简单的功能测试。更详细的还有停止模式中分了模式0,模式1和模式2。对于不同的应用场景来说,U0系列有多种模式可选,能够实现不同的低功耗模式和唤醒方式,实现更低的电源消耗和更长时间的设备续航。
/ U' ^1 ^/ a& v |