这又是一个系列的新品,ST的产品线越来越丰富了。U0系列应该是最新的低功耗产品。这里对NUCLEO-STM32U083RC 做个低功耗下的测试。该芯片内部时钟比早年产品多了个MSI时钟,就用MSI做系统时钟源新建工程。
- ]+ \ T# C2 _" [( T/ g8 ^+ `! [: n: E
Sleep Mode最为简单,仅内核停止,外设依旧运行,看起来就是停止执行程序了。可以配置为中断或事件唤醒。这里就测试外部中断唤醒,板卡的按键就可以方便的实现中断。
* |) |! N. N' S% R1 Y% d9 k% j! B# ~. C! c. v+ T! ]
- HAL_SuspendTick();; v* G3 v: Z( d- N$ f8 G* h! q
- printf("enter sleep mode \r\n");8 ^$ v8 l1 q9 z
- HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);, d5 [5 z: Y4 e/ B
- HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
6 J1 T5 f0 f/ n% V7 m3 a! O' Q - 2 m! F% `6 f. R8 |* q' z V# q9 o
- HAL_ResumeTick();6 I; a6 L" |* @! b6 x
- HA L_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
& e" z" Z3 W' x( W9 ~$ ? - printf("exit sleep mode \r\n");
复制代码 以上代码实现进入Sleep模式,打开LED灯,唤醒后关闭LED灯,并打印提示语句。因为这个低功耗模式下GPIO状态会保持,所以能看到在睡眠后LED依旧亮着。测试了下两种模式下的电流如下
4 r9 B$ `3 c& X$ z( ^0 q/ y
( d, k* q! J+ E0 _5 [! U' M2 x4 D
本身的电流已经很小了,进入睡眠后的电流能降低一倍,还是不错的。
' w# b$ [ j6 Y; S; s1 L. \ Stop Mode下外设也会停止工作,理论上能够更省电。因为保留了1.2V的供电,所以能保留寄存器内存数据,唤醒后也可以继续执行上次停止时的代码。这里也测试下电流差异。
: f7 L0 a! `8 u" D( H" Q+ ` 首先添加测试代码, 仍旧已外部中断做唤醒。& H& @ H6 ?4 }# F! Q% [' m
5 B# a" {: ~3 T* V- HAL_SuspendTick();
0 x! ~4 x4 O% Y( i6 N - printf("enter stop mode \r\n");
4 L# x8 K: u( h4 C+ R- { - HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);: H B7 v) Y6 m) `& \# y) y
- HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);
: w8 a8 H A9 D - 9 s1 s0 S9 {/ J" c
- HAL_ResumeTick();
+ f0 m2 m, h' R0 w - HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);: \- |) _9 e" {& e% X! z7 s
- printf("exit stop mode \r\n");
复制代码 程序和sleep模式下相同,因为除了电流,表面看起来的状态最为相似。测试电流如下
: }" p! m2 `% d8 Q# k 这次就比较明显了,关了外设省电多了。
4 J. M& _& ?; x Standby Mode比起停止模式则更为省电。因为他把1.2V区域的供电也关闭了,正因为如此,唤醒后没有任何进入待机前的记录,要重新运行程序才能完成想要的功能。而且,唤醒条件也更为单一,仅为WKUP引脚。这块Nucleo板的按键默认没有焊接上拉电阻,也就没有上升沿产生。但是RTC可以继续运行,因此能够使用RTC的Alarm中断进行唤醒。测试代码如下
8 E3 G2 J+ U( ]0 j7 Y5 I# G
$ S" o+ P( O2 H$ Q/ P; q! N+ ~) i# o/ H& l
- if (HAL_RTCEx_SetWakeUpTimer(&hrtc, 0x500C, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK)# d4 s; |0 c/ H8 X4 E2 Q9 C
- {6 j: ? [) W8 d( h* P) R5 \; s
- Error_Handler();# i: O! O8 v- F9 v: o; d; ]6 k
- }9 @8 `# G5 v" s# _- e
- printf("standby mode \r\n");
# A1 s: [& G2 f3 K - HAL_PWR_EnterSTANDBYMode();
复制代码 设定一个RTC的唤醒中断,大概10秒钟。然后打印提示,进入待机模式。等待中断产生,程序从头运行,就会再次开启唤醒中断和打印提示语句。可怜我的小万用表已经测不到电流了,肯定是nA级别了。 还有个在L4上就有的低功耗模式,Shutdown Mode,这也许就是天花板级别了。LSI也关闭了,只能WKUP引脚去唤醒。最重要的是我的万用表已经没有用了。就不展示了。
1 g( ]1 B4 q4 j1 W! b 以上测试没有考虑唤醒后的时钟状态,仅作简单的功能测试。更详细的还有停止模式中分了模式0,模式1和模式2。对于不同的应用场景来说,U0系列有多种模式可选,能够实现不同的低功耗模式和唤醒方式,实现更低的电源消耗和更长时间的设备续航。8 T M) A4 `, O% q* Y/ y; g. W
|
感谢总结