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

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

[复制链接]
STMCU小助手 发布时间:2021-11-16 00:27
一、周期性自动唤醒--手册文档说明4 I9 A1 w' W2 x1 n
2 r3 o' }4 n1 g% v" B; U
周期性唤醒标志由 16 位可编程自动重载递减计数器生成。唤醒定时器范围可扩展至 17 位。4 j  T& {, i5 d
' Q4 A2 p6 H5 b3 Z. A* N
可通过 RTC_CR 寄存器中的 WUTE 位来使能此唤醒功能。
. Y( C/ P1 Y5 h3 A" M# n9 M
$ M. y( w. q# V2 f9 j2 W唤醒定时器的时钟输入可以是:  2、4、8 或 16 分频的 RTC 时钟 (RTCCLK)。* y: K4 V6 R8 w7 k* x

# |( X8 N/ m9 N. E, W  u: B当 RTCCLK 为 LSE (32.768 kHz) 时,可配置的唤醒中断周期介于 122 µs 和 32 s 之 间,且分辨率低至 61 µs。& ~- n/ P. x; |4 E6 |

, O$ V6 C4 E# i5 y· ck_spre(通常为 1 Hz 内部时钟)。
3 w0 _0 _; X7 n1 o. }/ P" ], S; L" D5 P
当 ck_spre 频率为 1 Hz 时,可得到的唤醒时间为 1s 到 36h 左右,分辨率为 1 秒。这 一较大的可编程时间范围分为两部分:5 [: f) t5 Z* \

) b- _% `+ @6 e9 b, W# A: K1 M( {0 T* X– WUCKSEL [2:1] = 10 时为 1s 到 18h
$ J0 ~. c0 g9 I
1 K: m, z2 e; r– WUCKSEL [2:1] = 11 时约为 18h 到 36h。在后一种情况下,会将 216 添加到 16 位计数器当前值。完成初始化序列后(请参见第 600 页的编程唤醒定时器),定时 器开始递减计数。在低功耗模式下使能唤醒功能时,递减计数保持有效。此外,当 计数器计数到 0 时,RTC_ISR 寄存器的 WUTF 标志会置 1,并且唤醒寄存器会使用其重载值(RTC_WUTR 寄存器值)动重载。 之后必须用软件清零 WUTF 标志。
4 @( ^( B% J' b6 C- K. b
' [2 S* ~1 z9 z# J8 t通过将 RTC_CR2 寄存器中的 WUTIE 位置 1 来使能周期性唤醒中断时,它会使器件退出低功耗模式。& [. e. n$ v* B; p

; ~( t1 z/ B. Q- h8 H2 M如果已通过 RTC_CR 寄存器的位 OSEL[1:0] 使能周期性唤醒标志,则该标志可连接到RTC_ALARM 输出。可通过 RTC_CR 寄存器的 POL 位配置 RTC_ALARM 输出极性。
* w- ]9 `2 P5 x1 `" j' H. h- F$ i7 d
系统复位以及低功耗模式(睡眠、停机和待机)对唤醒定时器没有任何影响。3 J% w7 |! ~0 c3 K& c* V; v
) C0 K6 w5 Q; w) j1 u. Z
二、配置周期唤醒

/ R! O* m6 V, T& z
, M9 K' t% r3 \1 K) s' Z1 C( V- w( Q" q配置步骤如下:3 x( Y% F, k5 V: q) {3 i

: ?( q/ f9 a6 I: K3 V1. 禁用周期唤醒功能,复位RTC_CR2中WUTE位;
. `$ ]: f( r( {! i# a4 U( O4 ?2 O6 f4 Y7 R* P8 d4 o" n
2. 等待RTC_ISR1中WUTWF位置位,表示唤醒计数器可配置;
5 ^. V" Q- w. s8 h% }* ^) j) d
2 X& T% I: [$ i3. 配置唤醒时钟,设置RTC_CR1中WUCKSEL[2:0]位:% g- p% W# w5 m3 ?! D. H
, }* c4 C4 ?2 `  V
- 000: RTCCLK/16) K5 e# i8 d/ b
- O. B# [& y0 y* }, x( {) ]
- 001: RTCCLK/8! m$ f1 R! y& E7 E1 _1 n: h
' }) J# t$ _' _% i$ t: Y
- 010: RTCCLK/4
% c2 a4 N, B4 \$ P2 Q( u8 R
/ ~. Z9 \, o2 I% T- 011: RTCCLK/2
" q' X! C4 ]. j; @
+ D- f! F) F0 b4 s- 10x: ck_spre(1Hz,WUT计数范围:0x0000~0xFFFF), J7 V  `* r; q: F; g
7 L. W! z, s) H! E
- 11x: ck_spre(1Hz,WUT计数范围:0x10000~0x1FFFF)
& [6 m9 G' U5 P6 y1 `  I* x4 L' w, g  b
4. 配置唤醒周期,装载寄存器RTC_WUTRH和RTC_WUTRL;& K5 Q- ^5 V  [

" a* J& ~0 b, o, L5. 使能周期唤醒功能,置位RTC_CR2中WUTE位。(该中断会使MCU退出低功耗状态,进入运行状态。)
- F- q$ w# D* M; K1 \* M; k, Z2 @9 ?- E! N4 ]
RTCCLK,预分频2,4,8或16。如果RTCCLK为LSE,即32768Hz,则可配置唤醒周期为:(61us ~ 32s)
' _* z1 A4 X# p7 E, p6 ]7 z$ E. ~& ?
7 D  D/ F+ s9 d; a
20190814171352973.png
0 [1 T, |& d/ F! O' N3 J

: s$ M  y7 ~4 _ck_spre, 1Hz时钟,则可配置唤醒周期为1s ~ 36h)
$ a  H0 E' Y0 N% a
+ z0 [$ L: `$ n" _! ~
20190814171403618.png

# |) @, Z. x( K' J/ _2 Y, d3 h
+ r* I5 ~- N! ?2 ?9 O1 w7 a三、RTC时钟配置) T' r+ L8 H: v/ |+ d
- {& ^# V5 O7 c" l5 b
1、时钟源选择:RTC时钟源可选HSE,LSE,HSI或LSI。
# A: ~0 L) \$ t! i6 A) ^* i9 V" X) F4 P. g8 K6 {6 w
为确保RTC精确工作,要求系统时钟(SYSCLK)必须等于或大于4*RTCCLK值。如果系统时钟(SYSCLK)为LSE或LSI,则RTC时钟必须等于系统时钟(SYSCLK),并且禁用RTC同步机制(置位RTC_CR1寄存器RATIO位)。
) t# A. \% Q1 K: [, T, X9 c! l- \1 ?$ {2 Z; \
2、配置RTC时钟源:配置RTC时钟源为LSE,1分频,即32768Hz。. e, |6 |, }. A2 u, v7 m# H

: b& _% D- l% v8 r) I! U3、配置ck_spre时钟; ck_spre时钟,默认1Hz时钟。
7 U( G( g) x7 u8 O7 ~* N* a  C
# h" T5 ^7 b/ C7 a(1) 设置7位异步预分频,RTC_APREGREDIVA,默认127;
# b% J# q6 I$ s: W6 Z& y0 e. X9 |1 L; q- N: n5 P# x
(2) 设置13(Medium)或15位同步预分频,RTC_SPRERxREDIV_S,默认255。; {2 Z4 u, `; p" K
8 e! z. }- x3 z. V- y' A3 |
20190814171418490.png
- Q  Y6 R$ J5 n8 l
8 c$ s' n" }, j3 w0 U2 F5 C) v" {
即:1Hz=32768/((127+1)*(255+1))
* a8 L% `" J: h+ g6 Q* j- A2 lck_spre时钟可用于日历和定时唤醒时钟。, t' t& R  ~( Z) s. ?; ]

2 ^; ^+ X% p3 E$ A$ A8 U代码参考$ u6 p% I- a- `# ]0 [
//参数time 秒
9 M9 m) _% o3 A& ^( y; |" m7 ?3 ^9 }" f' ^9 e9 F! E) C; O6 I
  1. void APP_EnterLP(uint32_t time )3 D0 `5 D! L; D& T+ C2 u
  2. $ I# d4 h. o, |0 p' H
  3. {7 J0 Q1 G/ T# R) [7 o" u
  4. 8 w% j/ v" z3 U/ ~2 ^6 H
  5.          MX_GPIO_Init_stop();
    9 c( j' b! {' e. ?1 A. Z5 x4 |9 b

  6. 7 k$ a$ h$ D0 {  S- z7 A6 {- [
  7. /* Enable Ultra low power mode */
    ' o* Z0 e2 W0 p/ w, G. a& s  I: u

  8. ) b) [0 @8 ^1 E  E7 j
  9.           HAL_PWREx_EnableUltraLowPower(); //使能超低功耗
    5 `" }; o" m1 |7 P3 g

  10. , R& w! B. {# e/ p
  11.           /* Enable Fast WakeUP */
      m6 }* {; _6 J. _
  12. 4 Q  e. U; B3 |7 t0 g: L" ~
  13.           HAL_PWREx_EnableFastWakeUp();            //使能快速唤醒7 w0 f8 o$ x" y$ M; s: h
  14. " [* J$ g6 }" A! z1 v* Y1 c/ ?/ }
  15.            /* Disable Wakeup Counter */
    ! O: b# m2 }% j3 X& Q# r! e

  16. 8 f( K' w; B, Z
  17.          HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);
    % I  h4 U7 `: P3 ~

  18. ' {# j: Y% l) ]- \$ j3 ^4 H/ ]0 V, E
  19. 5 `2 T& v; I: l- r8 k. U

  20. - J: t' N; n1 X/ L5 j. V0 g

  21. 0 x; }! N: ^8 V& Y! b: g1 y# d. B2 {
  22. * X/ a/ j9 H; I, f1 d: N+ ~  Q
  23.       /* Clear Wake Up Flag */
    % D2 E2 s6 g: `; h2 @

  24. ) n6 H9 t% V  K/ f* h' s
  25.         __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
    ; R4 b  u- s% y5 f1 }
  26. * B* K9 X! |' P5 Y, i

  27. * E0 |! `$ K3 j' X: X
  28. 9 }3 k; C6 i  r
  29.     //    HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, (uint32_t)(time * 2048), RTC_WAKEUPCLOCK_RTCCLK_DIV16);//rtc LSE=32.768k   2048Hz   488us-- 32秒
    * m& X0 Y1 I' J5 R: X* f, y  O! B

  30.   D% ~: |  O( S; y3 m7 Z

  31. 5 N3 @2 S9 I- S8 K

  32. 5 D5 i' P( `3 i: Y$ Z1 [
  33.         HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, time-1, RTC_WAKEUPCLOCK_CK_SPRE_16BITS); //wangxl@20190814  时钟选择1Hz  65535/60/60 ~18  可得到的唤醒时间为 1s 到 18h 左右
    % L' q8 I0 C( m& G2 G* `8 F
  34. 4 ]0 S7 R1 E9 x
  35. ) P( |5 K: M) k: @* _% H" O

  36. 1 \% A( g/ ~$ n
  37.         printf("进入停止模式\r\n");
    " T! b. Z) S  S$ c* |
  38. / M2 S2 i' R0 R( u3 `  ^- C
  39. " G5 `) u! [, y1 x9 D! H
  40. % w, U7 g9 j6 N8 ~1 K
  41.         /* Select MSI as system clock source after Wake Up from Stop mode */: x$ a, R1 p% o4 f, Y0 \4 w

  42. 6 d' m) |4 e) v5 N( c, M' }5 o
  43.         __HAL_RCC_WAKEUPSTOP_CLK_CONFIG (RCC_STOP_WAKEUPCLOCK_HSI);2 [% _6 r- }0 S( v, q2 t
  44. ) y1 z% W$ C" p; e

  45. 1 e2 w! {' [. J6 v, s
  46. , L8 R+ m( X5 N% m" g7 o" Y0 z
  47.         HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON , PWR_STOPENTRY_WFI);( y) `2 [- L) z+ }6 U8 }! a0 i2 `
  48. : j5 M' u: V& z2 t
  49.   E9 O* u+ t& q1 S: X
  50. " u6 B3 b8 G% Y. i! _+ m4 x3 S/ J1 ^
  51.         MX_GPIO_Init();. t. V3 B& o1 v: A8 |
  52. + ?- N$ K! n0 I- j

  53. ( W: I; f; u6 Z; {5 k- e

  54. 2 [0 U' }. y( {7 b
  55.         HAL_Delay(5);  //wangxl@20190814  稳定时钟 必免串口打印乱码; U' [$ d+ u: t3 P# D7 c1 J# a

  56. - H7 g  I- E% Z7 T" i+ E  Z: v
  57.         printf("wake up\r\n");
      d) o) f3 y6 q+ t) O9 v
  58. 3 e% M) H+ X0 q
  59. }
复制代码
" l2 W8 ^' c/ \/ @

& e2 m# P4 Q! C; [% X8 K( z& b1 n" Q5 W2 d5 S( A) U
收藏 评论0 发布时间:2021-11-16 00:27

举报

0个回答

所属标签

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