这又是一个系列的新品,ST的产品线越来越丰富了。U0系列应该是最新的低功耗产品。这里对NUCLEO-STM32U083RC 做个低功耗下的测试。该芯片内部时钟比早年产品多了个MSI时钟,就用MSI做系统时钟源新建工程。
0 i& n$ L8 l! V# {' M) G$ e
- ^$ O/ v2 o1 H# a. @ Sleep Mode最为简单,仅内核停止,外设依旧运行,看起来就是停止执行程序了。可以配置为中断或事件唤醒。这里就测试外部中断唤醒,板卡的按键就可以方便的实现中断。
8 A2 i6 d+ ~2 d6 C- M
4 |+ t) }/ G2 w, g4 ]; D* U- HAL_SuspendTick();
% {( U/ k _1 p u, o, n - printf("enter sleep mode \r\n");# r$ H: n. a. u3 o. I: M
- HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);8 V4 w2 b9 g0 t% j3 x
- HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
. P/ S8 @( ?* c6 _$ V+ X4 p: K -
4 I* ^( a, G+ y; c2 z# r( ]# ^- E - HAL_ResumeTick();
# K0 w9 H2 H( ^ - HA L_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
/ n$ C w3 u9 L4 v' p3 z- y - printf("exit sleep mode \r\n");
复制代码 以上代码实现进入Sleep模式,打开LED灯,唤醒后关闭LED灯,并打印提示语句。因为这个低功耗模式下GPIO状态会保持,所以能看到在睡眠后LED依旧亮着。测试了下两种模式下的电流如下
& Y% I- {* C! h c
2 \8 y& ?, [, T4 N1 Y2 o
本身的电流已经很小了,进入睡眠后的电流能降低一倍,还是不错的。
- a3 n) j- B- `. l; U7 | Stop Mode下外设也会停止工作,理论上能够更省电。因为保留了1.2V的供电,所以能保留寄存器内存数据,唤醒后也可以继续执行上次停止时的代码。这里也测试下电流差异。
( V( O* Y7 U4 m2 u, L7 N8 o 首先添加测试代码, 仍旧已外部中断做唤醒。$ ]4 G! A( ^( P: |# u2 d
* |. S& r) P+ ]' V' n/ b0 J) _
- HAL_SuspendTick();2 g: K Z, r! k
- printf("enter stop mode \r\n");
8 M# y. R1 i: B& q- A - HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);; q0 S; ]+ t0 I/ D7 k& O4 Q3 T
- HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);6 S5 P' o" a2 y, ~% G. B9 I
- 5 A1 B; d9 }3 @
- HAL_ResumeTick();
4 B9 L7 H1 G# C# K# G - HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);% [/ h" E3 l- y8 _! |' x* t* ?
- printf("exit stop mode \r\n");
复制代码 程序和sleep模式下相同,因为除了电流,表面看起来的状态最为相似。测试电流如下
Q/ |1 m4 m5 ^% X
这次就比较明显了,关了外设省电多了。
8 _6 p) J. p9 ^1 F Standby Mode比起停止模式则更为省电。因为他把1.2V区域的供电也关闭了,正因为如此,唤醒后没有任何进入待机前的记录,要重新运行程序才能完成想要的功能。而且,唤醒条件也更为单一,仅为WKUP引脚。这块Nucleo板的按键默认没有焊接上拉电阻,也就没有上升沿产生。但是RTC可以继续运行,因此能够使用RTC的Alarm中断进行唤醒。测试代码如下
: Q l1 ]4 y4 K4 y% ?2 ~3 P5 m; q# M1 I% R/ q' E" q$ _
3 r1 `, V' Q3 r3 T& z- ^* A- if (HAL_RTCEx_SetWakeUpTimer(&hrtc, 0x500C, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK)) i7 E2 A2 D3 J, q: S
- { f/ f6 w7 e3 s% D5 m
- Error_Handler();% Z8 W: D# ~2 [
- }+ X" h9 T9 @6 E" B, P0 Z6 N
- printf("standby mode \r\n");% y# S$ t$ A( y; r
- HAL_PWR_EnterSTANDBYMode();
复制代码 设定一个RTC的唤醒中断,大概10秒钟。然后打印提示,进入待机模式。等待中断产生,程序从头运行,就会再次开启唤醒中断和打印提示语句。可怜我的小万用表已经测不到电流了,肯定是nA级别了。 还有个在L4上就有的低功耗模式,Shutdown Mode,这也许就是天花板级别了。LSI也关闭了,只能WKUP引脚去唤醒。最重要的是我的万用表已经没有用了。就不展示了。
" ~8 x6 h3 x; n7 n' D 以上测试没有考虑唤醒后的时钟状态,仅作简单的功能测试。更详细的还有停止模式中分了模式0,模式1和模式2。对于不同的应用场景来说,U0系列有多种模式可选,能够实现不同的低功耗模式和唤醒方式,实现更低的电源消耗和更长时间的设备续航。$ I) O7 H6 ?" S# Y* c1 u$ o. T: V
|
感谢总结