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

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

[复制链接]
小萝卜啦啦啦 发布时间:2024-5-31 00:04
上一篇简单配置了一下RTC,调用了一下设计及获取时间日期的函数。RTC在低功耗场景下还有一个功能就是作为一个低功耗唤醒源头,今天我要尝试进入standby模式,然后用RTC定时唤醒
/ G1 q: F' u' |5 z1 C! T1 w$ ]! F- b: q. O5 D7 g1 X: E& A, V

8 Q+ E% @% `: |0 @6 z4 H/ Q工程的话我就沿用上一篇RTC的那个工程了,只是需要把while1中调用的测试函数全部去除,让while1为空( }0 z+ G5 W& P( s* H; C

5 i. q# O: Q; \2 G/ |, B5 ^1 P
! p) K+ E! m7 @' c- I, q一.CUBE修改# o1 o5 k5 f# t3 Q
来到RTC这里,把WeakUp打开,选择Internal WakeUp: }: z/ q& j* }
4 ^: M& Y3 v4 {9 u/ J
下面的参数配置; |; V1 M2 x! z
Wake Up Clock是唤醒用的时钟源,可以是RTC CLK的2/4/8/16分频、1Hz、1Hz with 1bit added to Weak Up Counter。我这边先选择8分频,这个可以根据实际情况选择7 ^) r/ G+ `3 U. R  t7 ]" }" Q8 e- W; b

! t  V+ Y9 M# Q! w然后第二个Counter参数与定时时间的关系是( E6 c: |& o7 v1 x) |7 T8 Q8 O9 J
1.如果选择RTC CLK的分频:Counter = 定时时间(S)* (RTC时钟 / 分频系数)4 q  F& N# o: J+ X- e# m3 N
2.如果选择1Hz,那Counter = 定时时间(S)(看名字应该是这么回事,但是我没有试过,不敢确定)8 f2 p) R! n$ t' \( A) R2 v/ W+ j
3.如果选择1Hz with 1bit added to Weak Up Counter,这个情况我还没搞明白,主要是不明白“1bit added to Weak Up Counter”是个什么意思
" e2 X% M* \6 Q1 ^9 `8 L% G9 s/ c1 w$ g8 ^- S% }$ |
我选择的RTC CLK 8分频,定时时间为5S,所以counter = 5 * (32.768k / 8) = 20480; x$ y% d4 e7 b5 d" ]- X- q

# Q8 r$ w- |& `) M$ q第三个参数同第二个,是时间到了后的自动重装载值,为了保持定时唤醒,我就把这个参数和第二个参数一样
6 r2 K: n7 e! L( a1 ?, e- |4 x
2.png / L7 }7 R, l7 I; @. p4 |

( B% D% }0 K0 q  M- E) k
然后把中断打开
) `7 ~$ X; c/ b  W/ y0 d

1 S5 ]& m$ ~5 J: `) v1 V; B; H- I& x
3.png - J% U$ R+ b, [0 \

' A$ c2 i4 i# Y, e
最后Project Manager中有一个选项是把所有没有用到的pin叫配置成analog,这个可以避免没有使用的引脚但是外部接了东西,导致的漏电,从而测量功耗偏高
  F6 b. b! r" R
4.png
2 {# ?) [' e4 M
: `, h  e2 l8 z
最后生成工程(图略)

% y$ @$ k: k6 n/ j
, a6 O/ b% I" _# [! i
二.代码编写

+ d/ Q' Y) z# h
这次的代码修改很简单,先对cubemx生成的RTC的初始化函数做一下修改,如下
  1.   if(__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)
    : \4 k1 g6 k* \6 M# q( @
  2.   {
    9 r5 ?; x9 Q5 d$ m6 v1 n
  3.     return;
    % r9 d5 {( n. A! G
  4.   }
复制代码
# M- S% e) I/ ?8 h0 {) G& w% A
5.png
8 c  V) P6 U0 `0 z3 y% q2 o
如果本次唤醒不是从standby唤醒的,那我就让他向下运行去初始化RTC,反之直接return,这样就不会因为跑了RTC初始化函数导致RTC中的时间和定时被重置。(其实还有另一种方法,会更加准确,那就是使用后备域,这个在standby下也是不掉电的,可以在rtc初始化完成后写入一个值,然后在RTC初始化前读一下,我这儿偷懒了,反正这样也可以实现我的目标)) d5 M3 u# A! P6 o

% C; `& W" q6 r! Y8 o  c+ p; O5 S8 V3 x

' j2 A# l, b9 p, D  ]7 d
在while1前面加如下代码
  1.   /* 是否为首次上电 */! q* @- }4 `8 R/ U
  2.   if(__HAL_PWR_GET_FLAG(PWR_FLAG_SB) == RESET)
    ) l: X& A; r0 V/ d& H2 I
  3.   {
    0 m% K/ u1 Z" O9 r/ h$ t: X& m% L
  4.     printf("normal run\r\n");  d% P, F, d' Z6 j0 K* N  M
  5.   }4 ^( c" B' j8 @
  6.   /* 从standby唤醒后的复位 */
    2 y. O6 }# @: F) w% p
  7.   else
    2 @: h% r/ I: L6 Y3 K; e5 ~
  8.   {
    - U4 U+ W# k, `* {* ^
  9.     printf("wkup from standby run\r\n");" u6 t1 l& `( B8 E+ t+ g
  10.     /* 清除standby的标志位 */
    ! c- H  W. l7 k4 T6 f) K
  11.     __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);3 F/ [$ X. J8 |1 c+ Y+ @1 X
  12.     & d  n: o/ Z  h. H/ ^
  13.   }
    7 g4 j" t  G0 h$ K4 P
  14.   /* 打印RTC时间 */& E: c3 z5 ]2 E% }0 ?
  15.   print_rtc_data();
    $ A7 t. ]0 G8 `6 I% A) ~0 V
  16.   /* 进入standby模式 */
    1 j9 V+ p0 a. V8 E
  17.   HAL_PWR_EnterSTANDBYMode();
复制代码
' v! T0 }- a1 F: }/ Q& v1 h) D- c
0 |9 m$ Z. d. Q0 ?! T1 ^! l, G
6.png
. g4 b* u, G, g0 ~" T
简单解释一下,standby就是倒数第二深的睡眠模式了,从standby唤醒后芯片就会reboot,但是唤醒后我们可以知道本次代码运行是因为硬件复位还是唤醒。所以我在代码中对这个情况加了打印,待会儿我们可以看一下效果。

$ B5 X+ O1 S0 p; [- _
如果是从standby唤醒的,那就清除standby的标志位(这个如果不清除,等睡下去后会立刻唤醒)

) e( D8 J  e& k7 Z9 {
然后不管是从什么状态下运行代码,我都让他打印一下RTC时间,主要是避免RTC时间被重置,最后进入standby

* W2 y" d* Z9 l# u6 w- i
) a) a% n, N" d# |( \
好了烧录,运行,LOG如下
7.png
0 Z, M2 d( g$ [4 w% J
符合预期,首次通电打印normal run,之后每隔5s打印一次wkup from standby run,并且RTC时间也是正常的向后跑
7 r# S- B  m& u. q
7 ~0 `6 l5 M  ]  p
三.功耗测试

$ D6 n6 W: r, v9 H$ H  N
功耗测试还是用上次LPTIM时用的PPK2

& r2 P! G! g7 s% A
JP4供电跳帽调到CHG,JP6-11都去掉(不过这个不去掉也行,我试了不去掉也不影响功耗,毕竟STLINK已经断电了)

8 V$ w; ?: [- O+ W! K' _( \1 J  f' U4 g. |: C8 l
接线如下

7 A! r, ~0 O/ }5 j* {
8.png 7 d+ C$ M' ~6 |. X& s9 |1 \  o

7 K) M* R3 H2 D
测量结果如下图
4 g, E! M2 U' u& K+ W
9.png
4 ]$ j, d# |+ @* N) h* w9 K* T( e

0 E" A) Y/ u6 O0 P6 }
690nA,我已经尝试了很多设置,但是不知道还有什么是没有配置对的(我现在还怀疑STLINK与MCU连接的串口,或者是睡眠时有些时钟没关?),和手册上的160nA还是差了好多,有没有懂行的大佬指导一下

1 p. r$ O6 k+ }, x. d6 {* Y' d2 \5 |
最后工程见附件 STM32U0_RTC AND STANDBY WKUP_test.rar (5.23 MB, 下载次数: 0)

. }* B- o& {( k4 o
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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版