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

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

[复制链接]
STMCU小助手 发布时间:2021-11-16 00:27
一、周期性自动唤醒--手册文档说明9 m' h; K8 R1 P7 T& R. [
: e2 O( ]5 q' j  d- r
周期性唤醒标志由 16 位可编程自动重载递减计数器生成。唤醒定时器范围可扩展至 17 位。0 l, U  c# e$ }/ Z. a

9 x$ a( @$ L0 @$ G8 A; j! d  G可通过 RTC_CR 寄存器中的 WUTE 位来使能此唤醒功能。
' L# v2 m/ Y/ _+ |3 L5 F0 |/ H% b, o) c/ `
唤醒定时器的时钟输入可以是:  2、4、8 或 16 分频的 RTC 时钟 (RTCCLK)。
7 e/ @. y' O" T" y4 k6 Q( E
# @2 m% y8 U: n) o& H当 RTCCLK 为 LSE (32.768 kHz) 时,可配置的唤醒中断周期介于 122 µs 和 32 s 之 间,且分辨率低至 61 µs。
7 K: F+ q+ d" Z6 Y
, P4 l5 \3 q) Q- g3 p/ i$ A, S· ck_spre(通常为 1 Hz 内部时钟)。
: W7 k) h* d3 L/ P& u2 ?5 P+ X( _0 e; c' ]* l. j* u8 f
当 ck_spre 频率为 1 Hz 时,可得到的唤醒时间为 1s 到 36h 左右,分辨率为 1 秒。这 一较大的可编程时间范围分为两部分:
5 @* p( L3 v* q* J/ f: E4 w3 h3 K; [2 \. @2 ^  F& d0 `0 C
– WUCKSEL [2:1] = 10 时为 1s 到 18h) q' N$ P* J& F; K; p- L
' @2 W5 v6 v3 n9 T
– WUCKSEL [2:1] = 11 时约为 18h 到 36h。在后一种情况下,会将 216 添加到 16 位计数器当前值。完成初始化序列后(请参见第 600 页的编程唤醒定时器),定时 器开始递减计数。在低功耗模式下使能唤醒功能时,递减计数保持有效。此外,当 计数器计数到 0 时,RTC_ISR 寄存器的 WUTF 标志会置 1,并且唤醒寄存器会使用其重载值(RTC_WUTR 寄存器值)动重载。 之后必须用软件清零 WUTF 标志。! H1 g; O1 T3 o3 \% t9 o
+ X/ D0 o5 c1 Y2 C* w
通过将 RTC_CR2 寄存器中的 WUTIE 位置 1 来使能周期性唤醒中断时,它会使器件退出低功耗模式。
; a# _7 O/ a: C1 D7 f2 p# r: @. B  n
如果已通过 RTC_CR 寄存器的位 OSEL[1:0] 使能周期性唤醒标志,则该标志可连接到RTC_ALARM 输出。可通过 RTC_CR 寄存器的 POL 位配置 RTC_ALARM 输出极性。
# h+ s' f3 Y, a" L% ?
0 L; P" b. P' B! M系统复位以及低功耗模式(睡眠、停机和待机)对唤醒定时器没有任何影响。* r2 m  n% n5 V" P' ]

- y6 A2 j5 {% T2 `$ a; o二、配置周期唤醒

, n4 D1 N; _1 v4 J9 q' }9 I( `" s8 W$ c
配置步骤如下:- @% g6 s* D' Y0 b& r; i6 Z

$ k" y0 o1 ~/ X) s1. 禁用周期唤醒功能,复位RTC_CR2中WUTE位;
4 n/ W( N3 }, E) G
! @1 ^( q& r& X9 [1 ]2. 等待RTC_ISR1中WUTWF位置位,表示唤醒计数器可配置;
8 {( T. L; {9 I& m$ y2 z0 X/ c# u# t% c4 a  D( C: c$ `5 o, I
3. 配置唤醒时钟,设置RTC_CR1中WUCKSEL[2:0]位:! ?7 ^; ~1 q5 \" @6 l& f- _3 J

+ L- I2 M- w' z" X3 w- 000: RTCCLK/16
; w* ?, x  T* Q
1 b/ a$ S8 I2 |) B) O# ^0 g- 001: RTCCLK/8
. B. V. H; t* A7 C
' N9 h' ~2 n" k/ X4 v/ [% U4 X% D- 010: RTCCLK/4% J" M+ ]7 M3 s

6 ~3 ^8 s- X, l3 F# B; u* r- 011: RTCCLK/2
3 X! C- O1 o9 c$ [# F4 s0 U# c& l  k  x9 ]2 P/ ^& t
- 10x: ck_spre(1Hz,WUT计数范围:0x0000~0xFFFF): S1 |& P1 u7 I2 Y; {9 r
6 @: k1 _" s. u
- 11x: ck_spre(1Hz,WUT计数范围:0x10000~0x1FFFF)' [3 S' r, B3 ]7 U( k. {7 f1 Z
3 h! V+ `, X/ d& |3 K( V
4. 配置唤醒周期,装载寄存器RTC_WUTRH和RTC_WUTRL;; Q9 q, B! j% M. I: [

" ^* F( I7 u: B" M5. 使能周期唤醒功能,置位RTC_CR2中WUTE位。(该中断会使MCU退出低功耗状态,进入运行状态。)
  ~: j( i5 }+ N9 V9 {, f% X' u% A0 _0 A+ s+ _6 U6 ]; |5 x
RTCCLK,预分频2,4,8或16。如果RTCCLK为LSE,即32768Hz,则可配置唤醒周期为:(61us ~ 32s)
! Q: e# D& X+ g0 c5 D( Q$ ~$ t. i. V+ d
20190814171352973.png

- P- |0 {" o$ M$ \# i6 j) Y4 {0 E/ Z6 }! D0 E+ ]- Z) _; U
ck_spre, 1Hz时钟,则可配置唤醒周期为1s ~ 36h)
7 Q6 K7 M% k+ Y$ f. j# T
0 E& a  I6 `3 ]$ O, {" M
20190814171403618.png

5 V3 j; U8 `# C0 e4 m8 y0 ^
$ q" ]! F2 h2 Q- Q三、RTC时钟配置5 J; K% N7 v0 F- D8 V

6 A6 R0 S1 v! k& [1、时钟源选择:RTC时钟源可选HSE,LSE,HSI或LSI。
- M% @& q2 O7 N! F- A3 O% \2 e! w! j9 q- _2 i
为确保RTC精确工作,要求系统时钟(SYSCLK)必须等于或大于4*RTCCLK值。如果系统时钟(SYSCLK)为LSE或LSI,则RTC时钟必须等于系统时钟(SYSCLK),并且禁用RTC同步机制(置位RTC_CR1寄存器RATIO位)。9 v: w! w. f" t, P' K; r3 [( N

3 G' K1 t/ B# W- G- m4 `9 @5 J3 h2 B: Q5 J2、配置RTC时钟源:配置RTC时钟源为LSE,1分频,即32768Hz。
$ |4 H7 u) x( T4 C. s+ z, ]7 [3 B* @/ J) ~4 b; y( z
3、配置ck_spre时钟; ck_spre时钟,默认1Hz时钟。2 X* r9 d& H- F. }7 j& y

4 k: S* V0 F: h$ ?0 B' x(1) 设置7位异步预分频,RTC_APREGREDIVA,默认127;
" u$ p* x  R2 e1 ^
2 Q1 m+ m: l% d# _0 S(2) 设置13(Medium)或15位同步预分频,RTC_SPRERxREDIV_S,默认255。1 F9 m$ B# W' m% ~

5 N% h! F, ~* e4 J" A# F
20190814171418490.png

+ Q- L; j# t% Y) P- a: b/ H
, n1 b# z9 Q$ `; b9 W' F$ U( q即:1Hz=32768/((127+1)*(255+1))4 I* @; N6 [& O8 N3 J, D  }2 t
ck_spre时钟可用于日历和定时唤醒时钟。( ?2 p% r/ U# c: E2 O
) G8 @) ]3 ~0 i/ \
代码参考
! W1 j: v' N4 {) N//参数time 秒
5 C( o; W+ `' @, g; J' s( _0 d9 a$ Q+ B- M1 m$ v4 _
  1. void APP_EnterLP(uint32_t time )2 G( s& O# I3 V" C6 B. y) d9 D
  2. ; e9 H5 C) E+ n( o9 y2 b. @+ D* j& ^
  3. {( L- [8 l) V  n
  4. ) c7 d! e; d: L% ~  C; d
  5.          MX_GPIO_Init_stop();
    ; _; x  G+ P% h: J

  6. / S5 m; k" O) M0 q
  7. /* Enable Ultra low power mode */, g/ r; J4 R1 c
  8. 6 Y0 P1 H7 u+ m" r0 M( a3 \
  9.           HAL_PWREx_EnableUltraLowPower(); //使能超低功耗6 @5 g1 ]8 C# J- H. q1 D

  10. & e5 M% F- x1 x, q+ h" V
  11.           /* Enable Fast WakeUP */8 @: u3 a! V, g  K, P  n  U1 {

  12. ' @3 }  Q+ t5 k' E8 U
  13.           HAL_PWREx_EnableFastWakeUp();            //使能快速唤醒
    4 E. e/ ~+ y! c
  14. % v* M8 J/ C- H
  15.            /* Disable Wakeup Counter */2 X5 t; t3 M6 m2 [

  16. - M. T; ~4 O$ b7 [" O$ m( M( x  ?
  17.          HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);
    - C# I2 N$ v/ |5 z8 i" k
  18. 7 N7 n* j5 E2 M2 M; \. q7 \
  19. : ?& Z8 z0 w( k
  20. % Y4 \3 [3 v2 e0 s  z

  21. 8 I) q0 W3 j* R8 t, |

  22. 2 @% q2 I1 \) x" R2 d) ?# r7 P" P- T( u
  23.       /* Clear Wake Up Flag */
    7 Z. b. S: {2 ~. T3 [

  24. . u! O; D' o% A& J0 z- {
  25.         __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
    ! Z% j! g! r! z  Y8 L  q4 r" {

  26. - |3 p. F- K, H

  27. * s$ v" d6 N+ X, a( s8 j
  28. - ?4 m3 ]5 |6 E
  29.     //    HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, (uint32_t)(time * 2048), RTC_WAKEUPCLOCK_RTCCLK_DIV16);//rtc LSE=32.768k   2048Hz   488us-- 32秒# h: y( i$ d3 B& H: w
  30. 1 ]0 \3 _0 T# P; D) H2 L1 O
  31. ! l0 m0 E+ ~5 u7 O+ k8 J

  32. ( ?; [7 f2 ~# s* `2 ~) ]
  33.         HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, time-1, RTC_WAKEUPCLOCK_CK_SPRE_16BITS); //wangxl@20190814  时钟选择1Hz  65535/60/60 ~18  可得到的唤醒时间为 1s 到 18h 左右
    # `1 ]" M; P2 |( c6 `6 a6 B1 R% B

  34. + ?  t7 f( F0 c* `6 z
  35. # H" j7 v2 w8 y# G

  36. $ |. x! A. |) I9 j6 U8 e# P( y2 l
  37.         printf("进入停止模式\r\n");7 T: H2 P  [* H5 h
  38.   m- ~1 p* h- T' |

  39. . m0 G; K& S( N9 @2 S( m# Y8 S

  40. ( M' Y" p5 S4 R
  41.         /* Select MSI as system clock source after Wake Up from Stop mode */6 A: j# D# \# J' j$ A* V
  42. 8 }& T4 O: R9 s  L+ {% O, O- ]
  43.         __HAL_RCC_WAKEUPSTOP_CLK_CONFIG (RCC_STOP_WAKEUPCLOCK_HSI);# c7 ~% d) z! h' l" o

  44. % u. }1 T7 F) h  {) f/ N

  45. ! ]; B8 v9 x& f1 j) D1 `

  46. # x: q/ b7 p6 L, R% K6 @& d
  47.         HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON , PWR_STOPENTRY_WFI);3 P7 S$ g: u% c- _5 ]0 {/ L1 ^1 T- m
  48. : D5 k1 V+ ^" M
  49. ! n$ ?4 Y, ^/ G1 W9 P( d

  50. # j1 b9 I, @3 H
  51.         MX_GPIO_Init();
    1 t- ]" S7 }/ S; o0 ^6 q
  52. ' I% o. K9 _. |& _. n" R
  53. , a3 ?! h7 B3 O3 w" }) i
  54. 1 Z0 g3 S7 E" W: `1 o: P+ U
  55.         HAL_Delay(5);  //wangxl@20190814  稳定时钟 必免串口打印乱码
    7 V5 _! d, N- b& ], r1 K7 L" c
  56. ) }/ y$ J( U" n7 |) j  G
  57.         printf("wake up\r\n");  [) `* o$ I4 B0 v7 Z- n7 M8 w

  58. 8 a8 @6 W9 i& P3 y" y* i6 P5 [+ t
  59. }
复制代码

; z5 M' u( _& U6 ?7 e% I7 h' W. i( s; n; |# T

2 b: i3 n% Y4 V4 Y  b
收藏 评论0 发布时间:2021-11-16 00:27

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版