你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【NUCLEO-U083RC评测】⑦RTC&STANDBY WKUP功能及功耗测试

[复制链接]
小萝卜啦啦啦 发布时间:2024-5-31 00:04
上一篇简单配置了一下RTC,调用了一下设计及获取时间日期的函数。RTC在低功耗场景下还有一个功能就是作为一个低功耗唤醒源头,今天我要尝试进入standby模式,然后用RTC定时唤醒
" W! x" d+ ~- ?- o7 d/ m2 M8 s" H" A7 G7 e2 s% w) n
7 {1 b. q' [8 i5 Z3 s# |3 V2 E
工程的话我就沿用上一篇RTC的那个工程了,只是需要把while1中调用的测试函数全部去除,让while1为空
3 a4 \6 s7 M/ Q( o. D) c5 h# c9 p/ x
7 R& p! J  s( o# b: O" b
一.CUBE修改
) m6 t" J# l4 C1 Y8 e, r" k) h4 _来到RTC这里,把WeakUp打开,选择Internal WakeUp& h' c# b( ^5 l7 D  [
1 x+ g/ o# y; G; K/ h
下面的参数配置
% H) r  }3 Z6 aWake Up Clock是唤醒用的时钟源,可以是RTC CLK的2/4/8/16分频、1Hz、1Hz with 1bit added to Weak Up Counter。我这边先选择8分频,这个可以根据实际情况选择
2 C; k8 B5 t# z; e0 M. _, k! Y7 n, S+ o4 s$ e( f# I
然后第二个Counter参数与定时时间的关系是
0 j7 x5 ]2 @9 b. x1.如果选择RTC CLK的分频:Counter = 定时时间(S)* (RTC时钟 / 分频系数)- [- j# D) r, a6 F8 R" p7 Q
2.如果选择1Hz,那Counter = 定时时间(S)(看名字应该是这么回事,但是我没有试过,不敢确定)
1 ]$ O. i. ^: T( e- a* T3.如果选择1Hz with 1bit added to Weak Up Counter,这个情况我还没搞明白,主要是不明白“1bit added to Weak Up Counter”是个什么意思
4 Q& U* A2 @' u9 f5 X. O; Y( Y$ z
; G! r9 U4 J& D7 S6 M: p; @0 `. A我选择的RTC CLK 8分频,定时时间为5S,所以counter = 5 * (32.768k / 8) = 204803 b/ F& ~* X# z$ W4 l* a7 [+ l
) }' o! M0 B" e# {' Z6 g) P
第三个参数同第二个,是时间到了后的自动重装载值,为了保持定时唤醒,我就把这个参数和第二个参数一样3 G: k' m1 {3 w0 ]4 C5 h
2.png 3 C1 ?; T1 A5 J* q9 n" Y4 j

; \+ M5 F3 R" w) Y4 W1 _5 [" }
然后把中断打开; z! A1 {( p8 W$ H  {! a! w

  @5 s) g# s4 F# o
3.png
" W( h  [% g' S: Q: c; c: z8 R! c

  s" X/ S9 z& {- k- \
最后Project Manager中有一个选项是把所有没有用到的pin叫配置成analog,这个可以避免没有使用的引脚但是外部接了东西,导致的漏电,从而测量功耗偏高

2 }" s7 b- d, M) Z9 n3 P
4.png 5 C: Q- ]: D3 j* {

3 l& Y4 E4 g" M" z
最后生成工程(图略)
4 U4 A8 `, r+ x

' E1 G* ?- z/ {4 L! E& z/ D$ m4 J
二.代码编写
# K7 P, {& q4 Z/ ]' I
这次的代码修改很简单,先对cubemx生成的RTC的初始化函数做一下修改,如下
  1.   if(__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)
    & @% i8 w- p/ r! R1 y
  2.   {- `+ M# J4 u4 I  q2 Y1 t! J
  3.     return;
    . o  Y' Y3 R5 L' l
  4.   }
复制代码

1 `9 u4 d2 O5 N6 E( P, ^
5.png - v  J( S1 g( A6 V
如果本次唤醒不是从standby唤醒的,那我就让他向下运行去初始化RTC,反之直接return,这样就不会因为跑了RTC初始化函数导致RTC中的时间和定时被重置。(其实还有另一种方法,会更加准确,那就是使用后备域,这个在standby下也是不掉电的,可以在rtc初始化完成后写入一个值,然后在RTC初始化前读一下,我这儿偷懒了,反正这样也可以实现我的目标)
" s) K: {, c' D- t  m+ c& q: c. x

* v5 `/ }& |% T, w% C4 E( g
1 m* J9 r% k2 a
在while1前面加如下代码
  1.   /* 是否为首次上电 */, ?( ^6 R$ _: {4 M) O0 C$ s! ]: p
  2.   if(__HAL_PWR_GET_FLAG(PWR_FLAG_SB) == RESET)
    5 L/ {5 S* F, ]' b5 T! T. X' u
  3.   {
    + w" S! ^& i- J5 i9 J. k
  4.     printf("normal run\r\n");. C% t7 l, J. D' `7 J1 S
  5.   }
    ( ?9 R+ S; p4 O0 n! v2 e
  6.   /* 从standby唤醒后的复位 */
    % x3 l8 K, g3 c5 n9 }! ?9 l  n
  7.   else
    * y. e. P+ r* K& U0 N5 S
  8.   {
    ) e5 j( l) G8 U# H$ H- O
  9.     printf("wkup from standby run\r\n");- `9 w7 g$ Z2 m
  10.     /* 清除standby的标志位 */( E7 }( b. x) d# ^% E
  11.     __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
    ! l8 H( w! O4 N: U2 S- p4 z
  12.     ! e' {3 |+ W. ?+ z# u
  13.   }
    * W: h! w9 ]; X! T3 x
  14.   /* 打印RTC时间 */# ?- H- D" C9 P3 r
  15.   print_rtc_data();
    ( p0 q; F+ a5 G
  16.   /* 进入standby模式 */
    2 i  d( j1 U' n) Z
  17.   HAL_PWR_EnterSTANDBYMode();
复制代码
) N6 q1 F% ~4 e( P0 _

6 \) E% Y0 }) L  V3 d. _! J% E
6.png 5 b  |5 S1 Y0 A8 K/ B# X) Y9 U
简单解释一下,standby就是倒数第二深的睡眠模式了,从standby唤醒后芯片就会reboot,但是唤醒后我们可以知道本次代码运行是因为硬件复位还是唤醒。所以我在代码中对这个情况加了打印,待会儿我们可以看一下效果。
4 T+ s+ }2 b& ^. }( n
如果是从standby唤醒的,那就清除standby的标志位(这个如果不清除,等睡下去后会立刻唤醒)

) [5 l: T, @; U, I- D& ]
然后不管是从什么状态下运行代码,我都让他打印一下RTC时间,主要是避免RTC时间被重置,最后进入standby
* h; R5 Z+ L' V4 ]

4 P. K( _2 v) B5 j2 Q4 [! `
好了烧录,运行,LOG如下
7.png
* _) N5 @2 v; m9 w
符合预期,首次通电打印normal run,之后每隔5s打印一次wkup from standby run,并且RTC时间也是正常的向后跑

$ H+ V2 B1 H1 \7 b1 _. s+ l( Z# G- r) u, d
三.功耗测试

4 a$ K8 K( X3 Z/ s; {
功耗测试还是用上次LPTIM时用的PPK2

4 B5 A4 ]  r7 ~6 C2 g5 W0 D; U5 }
JP4供电跳帽调到CHG,JP6-11都去掉(不过这个不去掉也行,我试了不去掉也不影响功耗,毕竟STLINK已经断电了)

% h& O) O9 U$ ~: \9 k' G2 ?( c2 h7 _
' O9 G; q% m# `7 `% u) q" m8 G' S
接线如下
+ W' H' r# I# I7 P0 D
8.png
& q8 R  ?. z/ B0 k' W

+ s# _+ k6 u4 e' P# C# w
测量结果如下图

3 r% R# C+ x) W4 `. T  d0 S
9.png
" ?7 K' _; ]" o# a3 P/ j/ @, r
/ g9 I& \5 v8 y
690nA,我已经尝试了很多设置,但是不知道还有什么是没有配置对的(我现在还怀疑STLINK与MCU连接的串口,或者是睡眠时有些时钟没关?),和手册上的160nA还是差了好多,有没有懂行的大佬指导一下
7 y( Y& @* T6 I7 g/ W

: r4 X/ E( j$ f0 K* w
最后工程见附件 STM32U0_RTC AND STANDBY WKUP_test.rar (5.23 MB, 下载次数: 0)
+ j, p* D) P- u2 d) f
1.png
5.png
6.png
7.png

STM32U0_RTC&STANDBY WKUP_test.rar

下载

5.22 MB, 下载次数: 0

STM32U0_RTC AND STANDBY WKUP_test.rar

下载

5.22 MB, 下载次数: 1

赞 收藏 评论0 发布时间:2024-5-31 00:04

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版