这又是一个系列的新品,ST的产品线越来越丰富了。U0系列应该是最新的低功耗产品。这里对NUCLEO-STM32U083RC 做个低功耗下的测试。该芯片内部时钟比早年产品多了个MSI时钟,就用MSI做系统时钟源新建工程。
( ^1 O! e: R) V1 C
# K! F/ k N) c. m( f1 i* n
Sleep Mode最为简单,仅内核停止,外设依旧运行,看起来就是停止执行程序了。可以配置为中断或事件唤醒。这里就测试外部中断唤醒,板卡的按键就可以方便的实现中断。
, V1 w# ^' M# o1 y- ]( y3 b1 c8 e" P
- HAL_SuspendTick();! v) E* j, [3 R. @$ ^' L8 J% S
- printf("enter sleep mode \r\n");
* C& G; ~$ `9 E; m" C' w1 H - HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);# L9 O$ c9 p4 H; i" Q! u
- HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);0 I3 J, {0 p& C
-
s2 }) u; E4 K0 n& Z - HAL_ResumeTick();
7 J' y) _$ X0 x) I- p - HA L_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
1 A/ a6 |2 |$ ]4 f - printf("exit sleep mode \r\n");
复制代码 以上代码实现进入Sleep模式,打开LED灯,唤醒后关闭LED灯,并打印提示语句。因为这个低功耗模式下GPIO状态会保持,所以能看到在睡眠后LED依旧亮着。测试了下两种模式下的电流如下
& L: D( N; r8 d# O6 V8 f
) U, `3 ?, s7 Z$ R/ P+ s" ?
本身的电流已经很小了,进入睡眠后的电流能降低一倍,还是不错的。! W, K0 |, ?4 Z; w/ q2 M
Stop Mode下外设也会停止工作,理论上能够更省电。因为保留了1.2V的供电,所以能保留寄存器内存数据,唤醒后也可以继续执行上次停止时的代码。这里也测试下电流差异。/ s. [3 K2 S" n4 d n
首先添加测试代码, 仍旧已外部中断做唤醒。% F( q" e8 H2 B* M- Q3 s
# g" Q- s3 U; K9 Z
- HAL_SuspendTick();
! Y! b2 Z* s8 {8 }/ p/ \ - printf("enter stop mode \r\n");
" C! D( [% ?9 O7 ]( q - HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);1 {3 ~! s% {7 u' K
- HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);# w. u* l2 d' ]$ b6 a
-
% m) X+ p# ^1 |& q' ~8 G* ~ - HAL_ResumeTick();
: i, X. v% w! j - HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);" k1 _: j* C' |3 h3 M# ]
- printf("exit stop mode \r\n");
复制代码 程序和sleep模式下相同,因为除了电流,表面看起来的状态最为相似。测试电流如下
8 j! G& @( ]) Q. K 这次就比较明显了,关了外设省电多了。8 a( [. H$ M! ?* E- }0 q
Standby Mode比起停止模式则更为省电。因为他把1.2V区域的供电也关闭了,正因为如此,唤醒后没有任何进入待机前的记录,要重新运行程序才能完成想要的功能。而且,唤醒条件也更为单一,仅为WKUP引脚。这块Nucleo板的按键默认没有焊接上拉电阻,也就没有上升沿产生。但是RTC可以继续运行,因此能够使用RTC的Alarm中断进行唤醒。测试代码如下
7 x9 @7 k% c7 K& e& [
& }& i0 v1 i8 _4 [3 S% w+ Q5 } s y# a! T! Q ~
- if (HAL_RTCEx_SetWakeUpTimer(&hrtc, 0x500C, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK)) R1 W$ Q2 P+ ~9 P, H
- {# g/ W; ^% L% V: s/ x
- Error_Handler();
2 q+ K3 G7 c# {' U - }) Q B4 Q, U7 _- @2 o! s* {( k
- printf("standby mode \r\n");9 b) J$ J5 D: U7 z6 l
- HAL_PWR_EnterSTANDBYMode();
复制代码 设定一个RTC的唤醒中断,大概10秒钟。然后打印提示,进入待机模式。等待中断产生,程序从头运行,就会再次开启唤醒中断和打印提示语句。可怜我的小万用表已经测不到电流了,肯定是nA级别了。 还有个在L4上就有的低功耗模式,Shutdown Mode,这也许就是天花板级别了。LSI也关闭了,只能WKUP引脚去唤醒。最重要的是我的万用表已经没有用了。就不展示了。
9 \/ B- W1 N* a1 C. I/ K 以上测试没有考虑唤醒后的时钟状态,仅作简单的功能测试。更详细的还有停止模式中分了模式0,模式1和模式2。对于不同的应用场景来说,U0系列有多种模式可选,能够实现不同的低功耗模式和唤醒方式,实现更低的电源消耗和更长时间的设备续航。) E. h# I) h. `9 Y
|
感谢总结