这又是一个系列的新品,ST的产品线越来越丰富了。U0系列应该是最新的低功耗产品。这里对NUCLEO-STM32U083RC 做个低功耗下的测试。该芯片内部时钟比早年产品多了个MSI时钟,就用MSI做系统时钟源新建工程。
- r' [' D/ u- C( I- i
& [ F" L G" m" y( N
Sleep Mode最为简单,仅内核停止,外设依旧运行,看起来就是停止执行程序了。可以配置为中断或事件唤醒。这里就测试外部中断唤醒,板卡的按键就可以方便的实现中断。8 S2 w \4 p" l8 L" ]. K7 N0 X1 T2 Z
C1 p8 h6 @- X; l0 U- g% {
- HAL_SuspendTick();6 J! i, I+ |& y
- printf("enter sleep mode \r\n");
- x2 [+ H; Y ]$ h) v: d - HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
! f$ D0 Q" T& V - HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);5 V; y% w- z2 U/ T( `
- ) L+ N4 D. B6 R# A/ p9 a# n
- HAL_ResumeTick();9 k1 n: ?. u8 ?7 j0 H5 E
- HA L_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
4 o A; c' O8 \7 M - printf("exit sleep mode \r\n");
复制代码 以上代码实现进入Sleep模式,打开LED灯,唤醒后关闭LED灯,并打印提示语句。因为这个低功耗模式下GPIO状态会保持,所以能看到在睡眠后LED依旧亮着。测试了下两种模式下的电流如下
% J; G9 Z3 b$ m, Y: w( ?1 E4 S7 o y" X% I8 a
本身的电流已经很小了,进入睡眠后的电流能降低一倍,还是不错的。
! |. K* ?" R/ }1 L+ ? Stop Mode下外设也会停止工作,理论上能够更省电。因为保留了1.2V的供电,所以能保留寄存器内存数据,唤醒后也可以继续执行上次停止时的代码。这里也测试下电流差异。! H [8 D2 |5 a0 |6 X
首先添加测试代码, 仍旧已外部中断做唤醒。
+ N7 j6 L% q& c# A c; t
3 }. R+ {$ ?) }, o; ~9 x) {- HAL_SuspendTick();
3 w* R9 I2 w; C- R0 z& k) I - printf("enter stop mode \r\n");
% V' G# e4 D/ K3 h+ [* j - HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
1 u c2 _ {: X- v - HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);
8 I8 s7 n. o, W - 8 L8 G9 Y) h \
- HAL_ResumeTick();! Q6 _ a w( ?; F2 V y# O
- HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);# V2 D% Z W# o8 ]2 t6 [4 e% K
- printf("exit stop mode \r\n");
复制代码 程序和sleep模式下相同,因为除了电流,表面看起来的状态最为相似。测试电流如下
6 |9 W3 V2 y4 f- c 这次就比较明显了,关了外设省电多了。
. ]8 V. Y$ i! V Standby Mode比起停止模式则更为省电。因为他把1.2V区域的供电也关闭了,正因为如此,唤醒后没有任何进入待机前的记录,要重新运行程序才能完成想要的功能。而且,唤醒条件也更为单一,仅为WKUP引脚。这块Nucleo板的按键默认没有焊接上拉电阻,也就没有上升沿产生。但是RTC可以继续运行,因此能够使用RTC的Alarm中断进行唤醒。测试代码如下
/ c! g% B" R1 I! {/ B4 z6 K" ~; Z! f' t+ `/ v/ R
: \+ M! n( k+ A( n1 G
- if (HAL_RTCEx_SetWakeUpTimer(&hrtc, 0x500C, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK)) y& h Q9 `6 `2 e4 A2 j
- {) ?* B& b" h: F/ m- P A) Y
- Error_Handler();
6 b1 r2 v( u: W3 w& C+ p - }2 ^& D5 @6 G3 c# I5 E K& Z- k
- printf("standby mode \r\n");' M5 n: _) X1 R; X" U
- HAL_PWR_EnterSTANDBYMode();
复制代码 设定一个RTC的唤醒中断,大概10秒钟。然后打印提示,进入待机模式。等待中断产生,程序从头运行,就会再次开启唤醒中断和打印提示语句。可怜我的小万用表已经测不到电流了,肯定是nA级别了。 还有个在L4上就有的低功耗模式,Shutdown Mode,这也许就是天花板级别了。LSI也关闭了,只能WKUP引脚去唤醒。最重要的是我的万用表已经没有用了。就不展示了。1 ~8 W; o+ ?" z& E
以上测试没有考虑唤醒后的时钟状态,仅作简单的功能测试。更详细的还有停止模式中分了模式0,模式1和模式2。对于不同的应用场景来说,U0系列有多种模式可选,能够实现不同的低功耗模式和唤醒方式,实现更低的电源消耗和更长时间的设备续航。9 V" `+ s5 z& T/ t8 r
|