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

【经验分享】stm32l0 rtc休眠周期自动唤醒文档整理

[复制链接]
STMCU小助手 发布时间:2021-11-16 00:27
一、周期性自动唤醒--手册文档说明, V# A1 o9 w) R$ b
1 G/ m  ^: F0 j6 l2 y7 v
周期性唤醒标志由 16 位可编程自动重载递减计数器生成。唤醒定时器范围可扩展至 17 位。/ {# E( l& n$ Z5 Z! F8 ?5 a
7 D- }; O' `5 N3 k
可通过 RTC_CR 寄存器中的 WUTE 位来使能此唤醒功能。- w# I( [$ e' q2 p* M- ^2 t1 ~  b/ G

7 r, j$ c: k+ r8 g唤醒定时器的时钟输入可以是:  2、4、8 或 16 分频的 RTC 时钟 (RTCCLK)。1 F. ?7 R2 C3 F1 ]2 j8 q+ X' D
( T) Y5 V* |- q+ J" {! V: w
当 RTCCLK 为 LSE (32.768 kHz) 时,可配置的唤醒中断周期介于 122 µs 和 32 s 之 间,且分辨率低至 61 µs。
, i# T8 ~' g; J$ x' |7 @2 j% q/ v) `. |1 ^% I
· ck_spre(通常为 1 Hz 内部时钟)。
5 D# c, \: `+ e  E+ y" Q
* i/ ]" o) f. j9 K6 ^当 ck_spre 频率为 1 Hz 时,可得到的唤醒时间为 1s 到 36h 左右,分辨率为 1 秒。这 一较大的可编程时间范围分为两部分:
5 }/ k! S0 _5 L  S  l' W: E# v+ D$ _# ?# B2 K. n4 Q1 p3 x
– WUCKSEL [2:1] = 10 时为 1s 到 18h
* u; |! D: d  y$ A5 a
/ n$ d% `- |2 X, b) `– WUCKSEL [2:1] = 11 时约为 18h 到 36h。在后一种情况下,会将 216 添加到 16 位计数器当前值。完成初始化序列后(请参见第 600 页的编程唤醒定时器),定时 器开始递减计数。在低功耗模式下使能唤醒功能时,递减计数保持有效。此外,当 计数器计数到 0 时,RTC_ISR 寄存器的 WUTF 标志会置 1,并且唤醒寄存器会使用其重载值(RTC_WUTR 寄存器值)动重载。 之后必须用软件清零 WUTF 标志。8 ?' s7 O! C% c: X& {* I% M3 s

! N+ [$ O: ]  x; ]# ?( ?, h通过将 RTC_CR2 寄存器中的 WUTIE 位置 1 来使能周期性唤醒中断时,它会使器件退出低功耗模式。, p2 Y" c8 V* F# K( p

* O, r$ z9 @8 y" f/ ~  p! J, |8 q如果已通过 RTC_CR 寄存器的位 OSEL[1:0] 使能周期性唤醒标志,则该标志可连接到RTC_ALARM 输出。可通过 RTC_CR 寄存器的 POL 位配置 RTC_ALARM 输出极性。
7 a% D! E8 H& [! f
: _# z" L; h6 O2 f, ]系统复位以及低功耗模式(睡眠、停机和待机)对唤醒定时器没有任何影响。
# X8 Q7 E$ P7 J% n5 B0 E, i3 b* X* K
二、配置周期唤醒

# a! x1 t% U7 n/ H6 M. W4 q9 g
( ~+ V% Y/ H1 q- W8 p配置步骤如下:
/ f) H( s2 |* w; R, b! h( x/ k: V0 e# y! C. E% t" B- b. r
1. 禁用周期唤醒功能,复位RTC_CR2中WUTE位;- }2 X5 U8 \8 _2 v

* I6 u! ]9 s; k5 }2. 等待RTC_ISR1中WUTWF位置位,表示唤醒计数器可配置;. P8 n' r7 w0 c4 o( q' F
* a4 }1 `# O" [* ~; y) x9 ^
3. 配置唤醒时钟,设置RTC_CR1中WUCKSEL[2:0]位:( `  d3 B8 C2 b9 a+ e1 a
3 Y# ~3 [5 L! v8 l5 G+ }
- 000: RTCCLK/16
) s* d" s: T* u5 S, C! K: q2 Y7 x5 `# A. J3 D0 a$ P* j
- 001: RTCCLK/8! X: u- o# R& @" Y( H6 G
" _. m3 H' p0 ?* m
- 010: RTCCLK/4$ j2 q% D$ ^3 h4 A. W

1 r# O3 u+ a4 i8 ?+ _- 011: RTCCLK/2
8 E1 i- R0 G) ~" ]+ O$ T6 W* W
& Q. W2 e2 g- {: Q5 v2 i- 10x: ck_spre(1Hz,WUT计数范围:0x0000~0xFFFF)& G, k# E' G$ x$ o4 @' F5 B. D

! h+ w3 p, U# Q- Z  u% b4 A- 11x: ck_spre(1Hz,WUT计数范围:0x10000~0x1FFFF); |% K& {$ k$ t/ m: X

; b+ m  |9 V" P! \; q" v/ A4. 配置唤醒周期,装载寄存器RTC_WUTRH和RTC_WUTRL;
6 a9 J2 @& e  Z4 ?
9 e1 a3 W" r  A: Q# n: d5. 使能周期唤醒功能,置位RTC_CR2中WUTE位。(该中断会使MCU退出低功耗状态,进入运行状态。)
# k+ D( Q3 j8 l5 b- t5 n* a6 ~9 ^/ B4 A; y
RTCCLK,预分频2,4,8或16。如果RTCCLK为LSE,即32768Hz,则可配置唤醒周期为:(61us ~ 32s)
+ C4 u: \8 _+ R$ M$ b1 g& L3 Q3 q) H% ^# v1 M; y3 S; ~
20190814171352973.png

6 G# I9 H, Z5 W# f  Z; M3 x- ]. `! u7 v
ck_spre, 1Hz时钟,则可配置唤醒周期为1s ~ 36h)
" y( C5 ]" X$ J7 [7 ^5 v. U. t7 l$ _( z+ k' G% i
20190814171403618.png

  U, X1 j- K) H7 I" L$ U. @6 |4 @! Q6 ]
三、RTC时钟配置
+ D' J; W2 u7 i1 B! f/ ^" @3 n$ ?  W$ c2 n: k0 D5 z8 k7 I% x
1、时钟源选择:RTC时钟源可选HSE,LSE,HSI或LSI。
- M2 k, j2 q  q! j
! f4 V2 q3 [  W& \7 v4 q! g) U为确保RTC精确工作,要求系统时钟(SYSCLK)必须等于或大于4*RTCCLK值。如果系统时钟(SYSCLK)为LSE或LSI,则RTC时钟必须等于系统时钟(SYSCLK),并且禁用RTC同步机制(置位RTC_CR1寄存器RATIO位)。
% U; B  Z* ~$ e! J+ y# L% L0 A  H
! {( s! Y* B6 m9 A2 b2、配置RTC时钟源:配置RTC时钟源为LSE,1分频,即32768Hz。: T$ `$ }( Y' W5 z2 I) }; _7 @
  B+ Z7 _8 Y1 r) T, |9 c
3、配置ck_spre时钟; ck_spre时钟,默认1Hz时钟。- X: B2 v! H+ }5 X

# }, o/ I/ V" i0 B% _& x. d(1) 设置7位异步预分频,RTC_APREGREDIVA,默认127;
2 \  J/ \$ k# ~! v1 a
/ Y* S4 D, G: R(2) 设置13(Medium)或15位同步预分频,RTC_SPRERxREDIV_S,默认255。4 a/ U7 W% K. Y# `
8 A+ w( _. e; F
20190814171418490.png

# u: V  P5 t$ u2 g8 b
% ~; n; t2 \+ ]9 E; B! _即:1Hz=32768/((127+1)*(255+1))
$ v. Y4 ]) _: Q+ Cck_spre时钟可用于日历和定时唤醒时钟。, {5 w0 y+ V) F8 q
8 e' S) I1 ?- |$ g& d# @6 A
代码参考' T: n$ M! B7 X  X! l8 [
//参数time 秒
* e' Q/ U  z$ x* K
" H4 h6 G* d& x% T4 O* Y& S. f
  1. void APP_EnterLP(uint32_t time ), ^# t7 ?5 S: ]1 A, w+ X: a% f

  2. / |8 t& E3 j3 u4 y6 }
  3. {
    0 w) K0 z" ?& g/ ?7 C: @; I
  4. * D, h" W7 ~7 _0 c
  5.          MX_GPIO_Init_stop();
    - w6 L9 p$ m5 m( T

  6. ( f$ {: o! d$ M& }% U
  7. /* Enable Ultra low power mode */
    - K$ i# v  E+ h+ ?1 u. Q8 P
  8. , m; w1 s5 o& J! c3 \( Q
  9.           HAL_PWREx_EnableUltraLowPower(); //使能超低功耗
    ) d0 S6 v" j- A0 [! ^& I2 `

  10. ) B; c: K( Y* l0 j
  11.           /* Enable Fast WakeUP */  \; n( l% n# D% F: m( {' n

  12. 9 ~0 o" y7 n7 K4 i: U3 P) F
  13.           HAL_PWREx_EnableFastWakeUp();            //使能快速唤醒
    , H" u* }& [& w% k* I9 @

  14. 0 a% ]$ g& n- Z0 w; f
  15.            /* Disable Wakeup Counter */
    - N: y- F( d4 @5 t

  16. 6 ]4 G2 d- M' m. h7 j/ _1 g8 q% Q
  17.          HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);
    7 ?3 d" y0 Z! S  a+ d0 L

  18. 0 [/ K  C, `1 [% W' }" R0 V

  19. 1 P* h$ U& \5 c- ?5 }6 x8 u
  20. ) N" O: g  X( [' H- v: h+ c. m/ H
  21. ) F7 K+ C3 @% n; K1 A

  22. * g7 X& _: l! Q. g
  23.       /* Clear Wake Up Flag */6 _# A( @' U5 H7 C# _
  24. " c& ?+ Y; i# G) i. s
  25.         __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);5 m$ \8 {$ L! J- e! S; \

  26. ; G- Q4 [* L! C2 r5 X2 ~* l
  27. ) r/ f' v! y) O- H( K
  28. ' E5 u8 M9 A) R2 s
  29.     //    HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, (uint32_t)(time * 2048), RTC_WAKEUPCLOCK_RTCCLK_DIV16);//rtc LSE=32.768k   2048Hz   488us-- 32秒
    8 V, I' m- G  c% Z/ Y
  30. 0 y7 S; ~$ G( B4 Q0 |' C

  31. ( P% M8 L, W# z+ C/ o$ I( P$ e, e
  32. ; u; r  U, F  k: E5 @
  33.         HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, time-1, RTC_WAKEUPCLOCK_CK_SPRE_16BITS); //wangxl@20190814  时钟选择1Hz  65535/60/60 ~18  可得到的唤醒时间为 1s 到 18h 左右- f% `' s8 c$ M) b

  34. 8 N: Z: B/ X8 v: l$ O" n% {3 s
  35. 2 ~& x) s1 |& e7 g& j; n
  36. 7 ]  v$ I0 J6 e. v
  37.         printf("进入停止模式\r\n");
    8 X: \. I0 e0 z

  38. " I* s+ [9 k+ f8 v$ `" U4 ?

  39. 8 h+ U% `/ N& p
  40. 2 b, G" |/ U: V- q$ s1 O, V3 ~/ i
  41.         /* Select MSI as system clock source after Wake Up from Stop mode */
    ! ?2 m  S! _( _4 [" g7 @5 a

  42. ) s- J- [1 w0 F' |
  43.         __HAL_RCC_WAKEUPSTOP_CLK_CONFIG (RCC_STOP_WAKEUPCLOCK_HSI);. d' u) @" H% Z+ u1 |
  44. 9 u; Z' A+ t3 X) A5 s
  45.   p! L5 o  r8 w; n, V. z

  46. ; {8 w) {! `! H( n+ i- b7 s
  47.         HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON , PWR_STOPENTRY_WFI);7 N. ?  y2 J+ d6 r
  48. - G% W; R8 i. d; f' [3 U1 i" E

  49. # \! \8 ?% E. \1 ?" [

  50. 0 E' x! p+ Y/ r5 o
  51.         MX_GPIO_Init();% f* E0 g! b- G# n( _" o3 [4 p1 ?

  52. 0 K' ]. ?7 ]% s% s/ d

  53. # }6 _/ q1 Z3 j- A% K- s6 v! \
  54. 6 {( Y/ E& x9 _# R0 E- l6 j. Z0 y3 }
  55.         HAL_Delay(5);  //wangxl@20190814  稳定时钟 必免串口打印乱码" f+ \( k1 X& ~4 c* ~3 m

  56. " P; D* i$ x. \# K  a$ h  C! E, W
  57.         printf("wake up\r\n");+ z, c. W5 ?& F

  58. # z$ t% `- x1 q
  59. }
复制代码

3 t# H5 P  S( g) k$ |
* t, i0 j9 X* U6 V) k
2 u9 [8 \- {" W- \) g
赞 收藏 评论0 发布时间:2021-11-16 00:27

举报

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