这又是一个系列的新品,ST的产品线越来越丰富了。U0系列应该是最新的低功耗产品。这里对NUCLEO-STM32U083RC 做个低功耗下的测试。该芯片内部时钟比早年产品多了个MSI时钟,就用MSI做系统时钟源新建工程。
. j: ~8 b3 t, ^6 C
# T' q7 `( W3 P5 c+ m% [. t" b1 J Sleep Mode最为简单,仅内核停止,外设依旧运行,看起来就是停止执行程序了。可以配置为中断或事件唤醒。这里就测试外部中断唤醒,板卡的按键就可以方便的实现中断。
2 ~7 O9 t) C# G$ {9 R% S8 o; n- ]; ?/ u2 I8 g
- HAL_SuspendTick();% a6 B) q, w$ ^& U( V6 c
- printf("enter sleep mode \r\n");
- U! {6 T/ U5 f! Y - HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
; |$ e W! q2 k( i/ P - HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);$ }$ p7 y& W/ h; A4 o2 Y |+ Y5 ~; o5 Y
-
* j9 a8 `: O V0 J, b$ W4 o/ x6 E - HAL_ResumeTick();
. e$ }# A1 x# y1 \ - HA L_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);' G* ]+ I( }. P8 C2 b# `0 j
- printf("exit sleep mode \r\n");
复制代码 以上代码实现进入Sleep模式,打开LED灯,唤醒后关闭LED灯,并打印提示语句。因为这个低功耗模式下GPIO状态会保持,所以能看到在睡眠后LED依旧亮着。测试了下两种模式下的电流如下
' Q1 }. w9 C7 ~' p
4 f& ?4 J# W, Y3 x6 Y" `; Y. G; W 本身的电流已经很小了,进入睡眠后的电流能降低一倍,还是不错的。
* U; y! t6 |3 Q! z- z Stop Mode下外设也会停止工作,理论上能够更省电。因为保留了1.2V的供电,所以能保留寄存器内存数据,唤醒后也可以继续执行上次停止时的代码。这里也测试下电流差异。
6 G3 |! b9 u* t. c 首先添加测试代码, 仍旧已外部中断做唤醒。3 S- v% J1 z* M( Z
$ O" P5 X8 p- y5 R# |8 l0 o
- HAL_SuspendTick();9 A% y5 B* D8 Z- s% T4 W
- printf("enter stop mode \r\n");$ ~6 Y, g+ Q3 f; _/ K' q3 o
- HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);9 }' n6 ?, _/ M u/ A" m: B
- HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);( k4 m$ X% g$ I( |+ Z
- 9 C: M, Z' C6 Y3 U
- HAL_ResumeTick();
, a1 W2 j e* x$ S P3 c$ j6 p$ s0 Z - HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);; |! r$ \- x$ I9 }+ Q% e4 Y/ }
- printf("exit stop mode \r\n");
复制代码 程序和sleep模式下相同,因为除了电流,表面看起来的状态最为相似。测试电流如下
7 s) x7 @% ?' D; K `$ w3 o
这次就比较明显了,关了外设省电多了。8 i9 o+ D7 w4 d. P9 ]0 a1 u
Standby Mode比起停止模式则更为省电。因为他把1.2V区域的供电也关闭了,正因为如此,唤醒后没有任何进入待机前的记录,要重新运行程序才能完成想要的功能。而且,唤醒条件也更为单一,仅为WKUP引脚。这块Nucleo板的按键默认没有焊接上拉电阻,也就没有上升沿产生。但是RTC可以继续运行,因此能够使用RTC的Alarm中断进行唤醒。测试代码如下
' j! U! ?( }! H. _8 t
6 P- G8 x. w& W F4 H' T6 w0 Z" n( ]' _& d2 P! ^* u
- if (HAL_RTCEx_SetWakeUpTimer(&hrtc, 0x500C, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK)6 K. d/ w6 s1 x/ Z; [) _
- {
/ s0 [" y1 d7 h5 I. L - Error_Handler();6 Q$ G1 C5 }$ b+ \4 O7 n: C
- }
6 u1 [' ~. q* a8 z# x% D, W - printf("standby mode \r\n");, h4 D% L6 \3 `; \; S- W2 ~
- HAL_PWR_EnterSTANDBYMode();
复制代码 设定一个RTC的唤醒中断,大概10秒钟。然后打印提示,进入待机模式。等待中断产生,程序从头运行,就会再次开启唤醒中断和打印提示语句。可怜我的小万用表已经测不到电流了,肯定是nA级别了。 还有个在L4上就有的低功耗模式,Shutdown Mode,这也许就是天花板级别了。LSI也关闭了,只能WKUP引脚去唤醒。最重要的是我的万用表已经没有用了。就不展示了。
- A4 ~( u7 t/ o7 i 以上测试没有考虑唤醒后的时钟状态,仅作简单的功能测试。更详细的还有停止模式中分了模式0,模式1和模式2。对于不同的应用场景来说,U0系列有多种模式可选,能够实现不同的低功耗模式和唤醒方式,实现更低的电源消耗和更长时间的设备续航。
1 Y4 Z$ J9 p$ H |
感谢总结