这又是一个系列的新品,ST的产品线越来越丰富了。U0系列应该是最新的低功耗产品。这里对NUCLEO-STM32U083RC 做个低功耗下的测试。该芯片内部时钟比早年产品多了个MSI时钟,就用MSI做系统时钟源新建工程。
; G5 x! k. H5 D. S+ f
+ B& Z1 g! z, o Sleep Mode最为简单,仅内核停止,外设依旧运行,看起来就是停止执行程序了。可以配置为中断或事件唤醒。这里就测试外部中断唤醒,板卡的按键就可以方便的实现中断。% Y$ ?) Y4 ?& h0 l6 D" h
5 I4 B. c: ]2 [$ D) L( @/ e1 B- HAL_SuspendTick();
# h& O& F+ D I0 I F1 a - printf("enter sleep mode \r\n");% j3 [- z! {" G7 y
- HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
$ V& o' Q4 W- o4 P- V V - HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
# f! j0 w/ D7 U1 t0 ~: P/ X" I -
+ s6 q! x! f( l - HAL_ResumeTick();0 w1 N$ V" ?/ q6 h
- HA L_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
$ D* \3 M- ?" q$ | - printf("exit sleep mode \r\n");
复制代码 以上代码实现进入Sleep模式,打开LED灯,唤醒后关闭LED灯,并打印提示语句。因为这个低功耗模式下GPIO状态会保持,所以能看到在睡眠后LED依旧亮着。测试了下两种模式下的电流如下
0 V+ ^ c/ L. o$ k& T
) |1 m+ \( T- h% r1 y
本身的电流已经很小了,进入睡眠后的电流能降低一倍,还是不错的。2 G0 U# b9 C2 S2 \8 r |$ ^( q% r
Stop Mode下外设也会停止工作,理论上能够更省电。因为保留了1.2V的供电,所以能保留寄存器内存数据,唤醒后也可以继续执行上次停止时的代码。这里也测试下电流差异。! _1 d3 q" Q8 P* f {
首先添加测试代码, 仍旧已外部中断做唤醒。
" C$ ]6 k C, R1 R2 L6 u' B* F
- HAL_SuspendTick();
6 _( `* S% `) y/ p O" r. w! A - printf("enter stop mode \r\n");
3 C; _0 A9 J7 j7 K' Y1 Z - HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);" f( v3 \2 N+ |1 o9 ^: q
- HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);
% @/ B& h6 L/ S( ^) n2 w# y. j -
/ z; u8 B. `& Y& a" R+ K - HAL_ResumeTick();+ u) b. E( u- [2 x2 w
- HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
2 O$ b/ n) ]* q' \# Y1 E* N3 S - printf("exit stop mode \r\n");
复制代码 程序和sleep模式下相同,因为除了电流,表面看起来的状态最为相似。测试电流如下
Z; P) K' U# a+ @. v
这次就比较明显了,关了外设省电多了。
/ j8 D, X* w# }% } Standby Mode比起停止模式则更为省电。因为他把1.2V区域的供电也关闭了,正因为如此,唤醒后没有任何进入待机前的记录,要重新运行程序才能完成想要的功能。而且,唤醒条件也更为单一,仅为WKUP引脚。这块Nucleo板的按键默认没有焊接上拉电阻,也就没有上升沿产生。但是RTC可以继续运行,因此能够使用RTC的Alarm中断进行唤醒。测试代码如下
2 e; G9 b9 [' N
5 }1 _4 l: V; X) p5 o5 _' q1 a5 c
0 C m* n8 G* G, {% F- {" m- if (HAL_RTCEx_SetWakeUpTimer(&hrtc, 0x500C, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK)1 V" L, g* t! D' F, z
- {
4 V6 K5 @& `( _ Q - Error_Handler();
. e3 b X9 ~, N# C) q, H - }
- ~# r' v- ^* Q' ^% O) U - printf("standby mode \r\n"); U0 ?: L3 f3 S5 ^9 y& s; F- q
- HAL_PWR_EnterSTANDBYMode();
复制代码 设定一个RTC的唤醒中断,大概10秒钟。然后打印提示,进入待机模式。等待中断产生,程序从头运行,就会再次开启唤醒中断和打印提示语句。可怜我的小万用表已经测不到电流了,肯定是nA级别了。 还有个在L4上就有的低功耗模式,Shutdown Mode,这也许就是天花板级别了。LSI也关闭了,只能WKUP引脚去唤醒。最重要的是我的万用表已经没有用了。就不展示了。
4 I1 `+ n& r u# U' j) V 以上测试没有考虑唤醒后的时钟状态,仅作简单的功能测试。更详细的还有停止模式中分了模式0,模式1和模式2。对于不同的应用场景来说,U0系列有多种模式可选,能够实现不同的低功耗模式和唤醒方式,实现更低的电源消耗和更长时间的设备续航。6 b8 q" h2 q9 d' {, ~
|
感谢总结