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

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

[复制链接]
STMCU小助手 发布时间:2021-11-16 00:27
一、周期性自动唤醒--手册文档说明
+ V) h+ c) w8 W0 {3 f- @: U: \; [9 P5 v% @. G
周期性唤醒标志由 16 位可编程自动重载递减计数器生成。唤醒定时器范围可扩展至 17 位。
! R) d, T" E  ~5 l# I* ]. }0 v1 X; d$ z8 b$ ^8 m9 b% R
可通过 RTC_CR 寄存器中的 WUTE 位来使能此唤醒功能。
0 x9 S! R% Q8 f0 P) Q" }3 S. A$ T6 D' d) F
唤醒定时器的时钟输入可以是:  2、4、8 或 16 分频的 RTC 时钟 (RTCCLK)。
$ U/ i' N5 R* l6 ^. y, H: A% A8 A7 u8 ?7 J; x
当 RTCCLK 为 LSE (32.768 kHz) 时,可配置的唤醒中断周期介于 122 µs 和 32 s 之 间,且分辨率低至 61 µs。$ m  f; l; S# B, L* |# M1 O3 h

3 F% V9 ?$ B9 @. S# L* u4 F9 i· ck_spre(通常为 1 Hz 内部时钟)。
$ l- S! n* a3 J* C: Z8 Q- a: z7 i) B: T' }" A4 ^
当 ck_spre 频率为 1 Hz 时,可得到的唤醒时间为 1s 到 36h 左右,分辨率为 1 秒。这 一较大的可编程时间范围分为两部分:7 i2 [% O9 y9 E' O( D) ]  a# s, c9 f
  _/ N2 v" [) i8 D" L0 j
– WUCKSEL [2:1] = 10 时为 1s 到 18h
, v! r  {, f; P9 F' ]* [3 @, v$ W  p7 h% I# E5 {' j+ H* K
– WUCKSEL [2:1] = 11 时约为 18h 到 36h。在后一种情况下,会将 216 添加到 16 位计数器当前值。完成初始化序列后(请参见第 600 页的编程唤醒定时器),定时 器开始递减计数。在低功耗模式下使能唤醒功能时,递减计数保持有效。此外,当 计数器计数到 0 时,RTC_ISR 寄存器的 WUTF 标志会置 1,并且唤醒寄存器会使用其重载值(RTC_WUTR 寄存器值)动重载。 之后必须用软件清零 WUTF 标志。
# Z% {$ m: G( ]6 j" D9 x$ S* D5 T1 x1 e1 O0 P2 m- H% d
通过将 RTC_CR2 寄存器中的 WUTIE 位置 1 来使能周期性唤醒中断时,它会使器件退出低功耗模式。
# l* T+ x( k1 {+ R: R$ n  Y1 d: G5 T
如果已通过 RTC_CR 寄存器的位 OSEL[1:0] 使能周期性唤醒标志,则该标志可连接到RTC_ALARM 输出。可通过 RTC_CR 寄存器的 POL 位配置 RTC_ALARM 输出极性。' |: T+ I; B! y* Q

+ O/ W/ p4 t& ~6 x3 `系统复位以及低功耗模式(睡眠、停机和待机)对唤醒定时器没有任何影响。6 a' n$ Z2 F5 W, }- D
6 m5 ]0 ?* o+ l7 [2 Y$ H
二、配置周期唤醒

7 l; o5 ^$ {  g& |' j+ w3 n8 p) \9 V0 ^' s
配置步骤如下:. F6 |$ D% x3 v; M2 T% p1 T
: i* i5 y# M( z7 r1 Y
1. 禁用周期唤醒功能,复位RTC_CR2中WUTE位;
1 t2 j5 C2 e& u9 D
& E5 e0 |4 R/ X1 k, t" |2. 等待RTC_ISR1中WUTWF位置位,表示唤醒计数器可配置;1 j, w+ V* a  q" O, [  }

3 U; Y! f0 ^' A" l. k3. 配置唤醒时钟,设置RTC_CR1中WUCKSEL[2:0]位:4 B0 W' Z, U" F  a* |, n7 [  A" q, V

* f' O7 |$ l  b9 _0 F1 ]- 000: RTCCLK/16
, e# ^" s* f' `4 m7 ^2 k+ D; x( q% W5 y! i0 B9 X9 G
- 001: RTCCLK/8
2 q( [) o8 H! [! Y; a
" n5 S: k  n* j) P# H( ?- 010: RTCCLK/4
, Y' N' t7 e% Z" z( p: O6 ?& K9 ^" a( C  B/ d; W/ ~
- 011: RTCCLK/27 m  a; a* F0 q! g& [- [% _

; t- T# [# o2 u1 J$ B0 z: Z% I- 10x: ck_spre(1Hz,WUT计数范围:0x0000~0xFFFF)
5 H& u  _3 M. t$ ~
0 k' R0 H7 y1 b2 q$ }- 11x: ck_spre(1Hz,WUT计数范围:0x10000~0x1FFFF). Z# o/ E4 I. ]% M. r3 j3 S- V
  Z8 _- H( ~. h1 ~! k$ S1 S  S
4. 配置唤醒周期,装载寄存器RTC_WUTRH和RTC_WUTRL;; C7 G5 j) |2 [8 g) B. a# D7 `  s8 C

, {7 U) A4 ^# k* l5. 使能周期唤醒功能,置位RTC_CR2中WUTE位。(该中断会使MCU退出低功耗状态,进入运行状态。)
2 Q7 |5 R( P- b% G8 H
7 t) G% O/ n3 j7 P7 XRTCCLK,预分频2,4,8或16。如果RTCCLK为LSE,即32768Hz,则可配置唤醒周期为:(61us ~ 32s)5 V# d6 ]+ A9 c! p5 V
& {* l: w' f+ M
20190814171352973.png
, t- |2 P* k3 t  Q% ?- }
7 X* \5 @! ~7 |) q) I
ck_spre, 1Hz时钟,则可配置唤醒周期为1s ~ 36h)
' {6 X' Q) K+ h- Q9 o) r- u/ S0 j$ b8 f) ?
20190814171403618.png
8 }8 ]  n; e+ F4 F/ S) `& n
3 z$ F& f7 p: T$ u7 d7 u
三、RTC时钟配置
& H0 Z8 t3 {/ ~( s+ M% y3 k+ {; e6 f; C  I" a4 I
1、时钟源选择:RTC时钟源可选HSE,LSE,HSI或LSI。
! X% [' J" O  A4 r
/ a0 f7 H' w$ {# y1 [# U6 g, Q# g. t为确保RTC精确工作,要求系统时钟(SYSCLK)必须等于或大于4*RTCCLK值。如果系统时钟(SYSCLK)为LSE或LSI,则RTC时钟必须等于系统时钟(SYSCLK),并且禁用RTC同步机制(置位RTC_CR1寄存器RATIO位)。/ K4 R0 O1 i4 g! E8 X
: S0 S6 I3 y  {2 u  z  M9 O4 F
2、配置RTC时钟源:配置RTC时钟源为LSE,1分频,即32768Hz。
6 Y; O- _4 w, i" x9 b/ ?
( S# D# w' `; F) g5 R3、配置ck_spre时钟; ck_spre时钟,默认1Hz时钟。: W4 I$ k- p% S& u3 d9 x
( \1 D# E# g, u1 Y
(1) 设置7位异步预分频,RTC_APREGREDIVA,默认127;
5 `6 Q0 x5 S5 W$ I
. V& Q5 j7 W  A& p: s+ @(2) 设置13(Medium)或15位同步预分频,RTC_SPRERxREDIV_S,默认255。/ v. I$ V5 v4 y" ]6 t

; r- E5 X5 \0 ]5 X; [: n
20190814171418490.png

) h: i0 i5 b' u# `$ Q  S7 _! Y9 |$ H1 B% A0 @9 G0 o1 j$ d
即:1Hz=32768/((127+1)*(255+1))" J. o  l- ?& e! k% N
ck_spre时钟可用于日历和定时唤醒时钟。3 M$ p$ z) U3 E  a2 x6 B

, s! N) }7 Q+ R( P代码参考
/ j" ~+ E. d  f- D2 Z//参数time 秒
1 c5 h2 w$ u7 w8 `- C, d$ D& W+ n6 C  d. @
  1. void APP_EnterLP(uint32_t time )
    7 M9 @, H: |. I$ R; ~* L/ p* w
  2. ( P/ S" M$ ~) m$ X5 O3 h- f
  3. {6 |. ~- C- j/ P3 a" E

  4. & `0 ]- t+ H+ H/ e+ h7 B, t
  5.          MX_GPIO_Init_stop();
    0 z! R+ F2 o% s7 I$ x$ N) I3 ?
  6. ( e% F1 H/ |# t9 ?8 _
  7. /* Enable Ultra low power mode */- U5 n) A% z! D! Z
  8. / h& J4 l- J* H
  9.           HAL_PWREx_EnableUltraLowPower(); //使能超低功耗& ~9 n" |- R" o& d

  10. * `6 b+ L5 [5 c  ^! L# P, G
  11.           /* Enable Fast WakeUP */2 ~/ L$ i# Z$ i! r2 q

  12. ( f1 W( K( N9 D/ {( E) O$ N
  13.           HAL_PWREx_EnableFastWakeUp();            //使能快速唤醒
    4 v( r. s& i: }: V& v5 U' X' q) i
  14. 1 l; w; Z, Q5 @8 {
  15.            /* Disable Wakeup Counter */
    3 B0 x) O8 V" K! U" c) J9 \$ w$ M

  16. , J. W* i! d# x- [# S/ i7 ]) I  c# Q
  17.          HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);/ z( n- ]; ^/ F6 ]( O8 Z0 w
  18. 6 _* d- F) U' K& b4 T
  19. 8 w- l/ ^; [0 I' Y8 P% B

  20. $ Y! A- T- D" M; a/ D. h% ~5 e

  21. 8 w. a. u7 o  J7 v

  22. % u& l) T8 K( K# p+ u% l5 j5 y
  23.       /* Clear Wake Up Flag */
    & }* o! m( a2 d- @& l' q6 b
  24. / ~7 P. J9 ~6 h9 e, Y* D8 x- J1 g
  25.         __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
    2 c% c  k! f! i; t  p) ]

  26. . n1 L% b' `, K- H0 {: O
  27. 5 E4 q  [, o# U& C  G7 h6 d
  28. 2 h) m! Q% b: {6 B* M/ A. W4 s, \
  29.     //    HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, (uint32_t)(time * 2048), RTC_WAKEUPCLOCK_RTCCLK_DIV16);//rtc LSE=32.768k   2048Hz   488us-- 32秒
    - K, [5 q' c  V
  30.   v7 C1 X" n9 A/ [( B; n
  31. # _! I% [0 T4 j; t' O

  32. 4 W/ ^1 R" v2 M, r
  33.         HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, time-1, RTC_WAKEUPCLOCK_CK_SPRE_16BITS); //wangxl@20190814  时钟选择1Hz  65535/60/60 ~18  可得到的唤醒时间为 1s 到 18h 左右' `; P$ o, @+ t8 H2 y1 W# v

  34. 2 F+ Y/ b% |# r+ V( \% V7 r, M

  35. ; `" `' t. o) s' |9 f. C
  36. 5 F- O1 P3 g. J" ^! F5 @; l! u
  37.         printf("进入停止模式\r\n");
    0 G. h9 X4 N$ S! J5 M
  38. ( l8 B. G% i6 @- V) L% a
  39. , n: `  ?6 j/ y& g: ?

  40. : c* u6 ?* e9 D0 B5 h# v% N- N8 `
  41.         /* Select MSI as system clock source after Wake Up from Stop mode */9 L0 a* J' O" @

  42. 4 E1 o8 D, C$ ~- B* {2 T# Z) L
  43.         __HAL_RCC_WAKEUPSTOP_CLK_CONFIG (RCC_STOP_WAKEUPCLOCK_HSI);/ w! H% G* j, T" B1 j
  44. . t; ^* @$ H1 F: }
  45. 8 W6 s! _) ~$ W+ T7 @0 ]8 v
  46. " ^+ l8 h. v1 h8 c5 \0 ]* z8 P2 [
  47.         HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON , PWR_STOPENTRY_WFI);# k) U4 P2 g' M; e6 @

  48. . E1 o7 H) K7 M+ E
  49. - s  `; X+ Q* E; I1 i
  50. $ a# a" F9 B: {! {4 h; @
  51.         MX_GPIO_Init();
    4 z( y, D, S. \& r
  52. : ]7 W: G' m  B: U# p

  53. $ S5 g5 ~) c8 L+ n1 ]

  54. ! R: j3 a) a2 ]/ ]" f! r3 T
  55.         HAL_Delay(5);  //wangxl@20190814  稳定时钟 必免串口打印乱码
    $ F, {$ l: f( G0 i  n) M

  56. 3 Q% b' {+ G. t( m! D, W
  57.         printf("wake up\r\n");
    # u4 N3 b1 ]8 [+ z

  58. + ~8 f- E: Y% O& C6 c$ ?
  59. }
复制代码

4 h4 v) f/ w9 Z0 F6 W9 c- W) p4 D2 U: v( J
7 _! x- h& Q9 Q& J6 Z) e  p
收藏 评论0 发布时间:2021-11-16 00:27

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版