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

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

[复制链接]
小萝卜啦啦啦 发布时间:2024-5-31 00:04
上一篇简单配置了一下RTC,调用了一下设计及获取时间日期的函数。RTC在低功耗场景下还有一个功能就是作为一个低功耗唤醒源头,今天我要尝试进入standby模式,然后用RTC定时唤醒. _2 [; M0 t$ x: g1 f$ t( W: g- h+ \

1 U( v; `- O( p& O, S
* E: q8 T7 w8 ^$ q( A7 Z工程的话我就沿用上一篇RTC的那个工程了,只是需要把while1中调用的测试函数全部去除,让while1为空! H. W. x! i9 h$ y" S3 m; I0 h
. d, D' w- U6 g0 s/ P
4 [. n8 Q9 `# _, j5 j
一.CUBE修改' B9 B( r4 W( y0 w. a
来到RTC这里,把WeakUp打开,选择Internal WakeUp- s% N( r2 I  ]) \5 E. E1 ?5 r
6 ]; u* @+ @1 d2 q  S' A+ J! q
下面的参数配置& g7 V6 i% _5 E# E2 ~- f* q+ Z' T$ A
Wake Up Clock是唤醒用的时钟源,可以是RTC CLK的2/4/8/16分频、1Hz、1Hz with 1bit added to Weak Up Counter。我这边先选择8分频,这个可以根据实际情况选择
/ T3 J* x" v8 u4 V
$ |: x6 B( j5 A) ^6 H7 M9 s然后第二个Counter参数与定时时间的关系是
( Y  R. k; t5 W# D7 L# x1.如果选择RTC CLK的分频:Counter = 定时时间(S)* (RTC时钟 / 分频系数)
  @/ }# h7 j5 A! {2.如果选择1Hz,那Counter = 定时时间(S)(看名字应该是这么回事,但是我没有试过,不敢确定)% H8 z, @! V3 `# f6 v, K: a. [
3.如果选择1Hz with 1bit added to Weak Up Counter,这个情况我还没搞明白,主要是不明白“1bit added to Weak Up Counter”是个什么意思
4 ?+ V% Q  y* l9 u  K
* u4 @+ W; v& n! F3 s, E+ F3 g- ]我选择的RTC CLK 8分频,定时时间为5S,所以counter = 5 * (32.768k / 8) = 20480( l: K* T. W; Q
0 c# ^, b0 m3 q1 `5 a8 p& U
第三个参数同第二个,是时间到了后的自动重装载值,为了保持定时唤醒,我就把这个参数和第二个参数一样1 {1 ^5 e& V% v
2.png
1 L8 ^; [0 C7 f1 [( d/ x

: O) K9 x! t' \) s
然后把中断打开7 L! j" `/ ^' W, S
/ ^; P  k, c8 p/ }6 m. G& a
3.png ( d) X7 ]' }! L5 o& z

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

3 `/ @0 m% T# k: F( h
4.png
2 O# p4 p5 K1 Y# ~  x9 f4 j. Z

  E$ O! s6 `# l8 `' B7 j0 ~( O  j- G
最后生成工程(图略)
% P9 ^( p# a3 h8 h$ B! M
; F8 v2 V$ y8 X# |: m2 p
二.代码编写
- l0 R$ p# m- v5 _3 h# X8 G
这次的代码修改很简单,先对cubemx生成的RTC的初始化函数做一下修改,如下
  1.   if(__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)
    7 \1 \8 r3 F: f+ O" f: C7 M
  2.   {: ~7 K0 _5 z3 J" M+ D& c  z# @
  3.     return;
    5 k8 e1 a- y% R0 U
  4.   }
复制代码
4 X0 e; T8 t: y. W3 r. f- s( X
5.png , |4 I# J' y  P! `3 A
如果本次唤醒不是从standby唤醒的,那我就让他向下运行去初始化RTC,反之直接return,这样就不会因为跑了RTC初始化函数导致RTC中的时间和定时被重置。(其实还有另一种方法,会更加准确,那就是使用后备域,这个在standby下也是不掉电的,可以在rtc初始化完成后写入一个值,然后在RTC初始化前读一下,我这儿偷懒了,反正这样也可以实现我的目标)
5 Y- U& s- k" H1 H* c* h0 H0 \1 h5 n; P' T5 ^8 `  O5 u
. _  h/ }8 o3 _4 ]5 R' l. n. Y

7 T$ h; Z: i5 c8 t0 ]
在while1前面加如下代码
  1.   /* 是否为首次上电 */
    1 h/ K, r0 R/ C+ U4 O; k
  2.   if(__HAL_PWR_GET_FLAG(PWR_FLAG_SB) == RESET)
    # }' J, [! H& [$ I( N
  3.   {+ ^3 G: ?/ M0 ]& T# M4 r
  4.     printf("normal run\r\n");
    : I! h/ ^  s' n" m6 B$ n: `
  5.   }
    & d) s' s! p5 ?0 j* r1 g
  6.   /* 从standby唤醒后的复位 */
    8 ~8 g( x- o5 p4 x* r! Z8 v% [# ^
  7.   else
    : ]/ @1 ^! b: g
  8.   {0 f& }" ~" v  m. W& r
  9.     printf("wkup from standby run\r\n");
    ; Q- p$ ^. W2 A+ _7 b1 k
  10.     /* 清除standby的标志位 */
    ; _) o/ p1 M# r& I/ n( b9 q% `' k& T" ^
  11.     __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
    ) Y3 f: A6 C/ i& q
  12.     ! n  P! t2 z' F0 S
  13.   }1 l1 L5 C) k+ d$ }
  14.   /* 打印RTC时间 */! a+ i  N- C2 \' z
  15.   print_rtc_data();
    + |, P* w' n$ o" J3 {
  16.   /* 进入standby模式 */" I/ X) ?, P. ]/ y9 ?. A
  17.   HAL_PWR_EnterSTANDBYMode();
复制代码
0 H" D9 K7 ~$ u

8 }4 o8 I1 k0 B0 T( `1 |& Z- h
6.png 0 ^' p. k" R9 N3 L2 P0 h, @: M9 [' G
简单解释一下,standby就是倒数第二深的睡眠模式了,从standby唤醒后芯片就会reboot,但是唤醒后我们可以知道本次代码运行是因为硬件复位还是唤醒。所以我在代码中对这个情况加了打印,待会儿我们可以看一下效果。

7 N; U- i2 n& ]7 C1 F
如果是从standby唤醒的,那就清除standby的标志位(这个如果不清除,等睡下去后会立刻唤醒)
( t* T2 j; D/ D8 B* W
然后不管是从什么状态下运行代码,我都让他打印一下RTC时间,主要是避免RTC时间被重置,最后进入standby
7 a9 w1 @# H1 O
; ~6 m. v  }  d- K: t6 _% L1 a
好了烧录,运行,LOG如下
7.png
( k' |5 V% k& G
符合预期,首次通电打印normal run,之后每隔5s打印一次wkup from standby run,并且RTC时间也是正常的向后跑

$ Q, u3 d5 Q$ }4 I2 ~& H3 E  S1 a; Z2 {; T! M6 T
三.功耗测试
4 E9 K* l1 F7 ~6 @" H; ~6 q) Q
功耗测试还是用上次LPTIM时用的PPK2
, A  ?% V6 Q3 Q: f$ \1 a
JP4供电跳帽调到CHG,JP6-11都去掉(不过这个不去掉也行,我试了不去掉也不影响功耗,毕竟STLINK已经断电了)

6 p; O, A8 h" s# v/ {+ @7 D
: E5 ?1 O) k3 R% T# R$ Y. _& ]
接线如下
' m6 k  h* X$ S4 D/ k
8.png / e- Z$ t8 r7 [+ Q# C$ R

5 M8 v- X6 A6 a% }  W
测量结果如下图
/ W: t0 f* ?" ^- L% v5 |6 ?
9.png + f, M5 X6 U. d

# {% N7 h, U- w' Z, O, L6 M
690nA,我已经尝试了很多设置,但是不知道还有什么是没有配置对的(我现在还怀疑STLINK与MCU连接的串口,或者是睡眠时有些时钟没关?),和手册上的160nA还是差了好多,有没有懂行的大佬指导一下
) @6 C- U1 f7 T& x: A2 z
' i0 Y' C7 l- n1 ?1 x# ?
最后工程见附件 STM32U0_RTC AND STANDBY WKUP_test.rar (5.23 MB, 下载次数: 0)

8 r4 [$ X3 \! _- T* o2 ?3 d8 W' J
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 手机版