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

STM32学习笔记 | RTC日历基础应用问题分析

[复制链接]
STMCU小助手 发布时间:2021-3-9 13:11
STM32学习笔记 | RTC日历基础应用问题分析
  `' ^5 @4 W4 G# D8 |6 {( Q, }% _7 |
RTC,Real_Time Clock,即实时时钟,在许多电子系统中都能看到实时时钟的存在。

" y  @6 ]0 H4 V
每块STM32内部都集成了一个RTC模块,是一个独立的定时器/计数器,具有计数、时钟和闹钟等功能。
( w9 w& m5 b: [9 ]' p+ z
STM32 RTC 基础内容

/ m% i: Y- X# I! x" Z( u
STM32内部集成的RTC相当于一个TIM,具有计数的功能,但和TIM有一些区别,比如供电来自备份区域,可作为低功耗模式自动唤醒单元等。
STM32的RTC除F1系列不具有BCD寄存器(日历功能)之外,其他系列的RTC大同小异,本文以F4系列RTC为例进行讲述。

* z+ a* _8 J1 r( G5 F0 `: Y' z
1. RTC时钟源
/ x3 L! t$ ~9 r. h+ }
RTC不具备自己输出时钟信号的功能,和TIM一样由内部,或外部晶振提供时钟源。
: Z& I2 S$ |5 E# [/ G
通常是由低速外部晶振(LSE)32.768kHz,或者低速内部晶振(LSI)提供。内部晶振误差大,如果要求高精度需使用外部晶振。

4 ^. O+ q% Z! ]. u9 S
当然,还可以使用高速外部晶振(HSE)的分频信号作为时钟源,但该时钟源有最高频率限制。
7 g* X9 }! D5 F0 {
2.1.png
" B% R; ^+ |( C2 U* z
2. RTC日历

- H+ }1 B: O" @$ @  A) E) n
RTC的日历功能算是一个比较重要的功能,但是在早期的F1系列中不具备该功能,需要结合软件计算才能实现日期和时间的功能。
除F1系列的RTC自生具备日历功能,即具有日期、时间、亚秒等于日历相关的寄存器,只需要直接读取寄存器即可获取日历信息。
同时,系统可以自动将月份的天数补偿为 28、 29(闰年)、 30 和 31 天。并且还可以进行夏令时补偿。

) X8 O% s5 ?3 d4 W: V# u0 G" G) c
3. RTC闹钟

, y" c' L  f  b1 u) t8 m  @/ b
RTC闹钟功能也是一个比较实用的功能,大部分RTC都具有两个可编程的闹钟:闹钟A和闹钟B。
RTC闹钟可产生中断信号,也可以产生闹钟输出信号。

2 H6 V/ K& m+ O" Q4 G3 `0 S5 o$ h
4. RTC自动唤醒

% ~' l9 D8 w8 R3 x% ?5 U7 b
有的产品需要周期性唤醒,比如间隔5秒唤醒一次休眠的芯片。
RTC自动唤醒由 16 位可编程自动重载递减计数器生成,通过 WUTE 位可扩展至17位。如果频率为1Hz,则自动唤醒时间可以 1s 到 36h 左右。
以上是重点知识点,更多细节请查阅芯片对应的参考手册。
( l3 Z% O2 K3 Y9 Q! H
STM32 RTC 参数配置

1 s/ n0 e! |  ?1 J4 u# N. l
STM32 的RTC使用比较方便,不像TIM各种复杂的关系,可以通过STM32CubeMX很简单就能使用RTC的各项功能。
下面以F4、Cube配置日历为例。

$ V5 Q! T" I9 J4 s
1. 配置时钟源
  y% B; o2 i& d( A: R" S
2.2.png

9 t, V& n. Q: d/ k( G9 [& b
2. 配置分频值
5 w8 I$ h6 _& l
通过32.768kHz信号得到1Hz分辨率,可参考例程默认分频配置:
32768/128/256 = 1.
备注:从0开始分频,所以配置的分频值需要减一:127 = 128 - 1, 255 = 256 - 1.

7 C2 @8 R  f& G4 T3 m
3. 初始化时间和日期

4 V. c1 }9 V( v7 H+ R2 X/ @: F
通过Cube工具初始化时间、日期以及格式:
2.3.png
: X$ x3 P5 X& v5 ]4 K, n
以上就是通过Cbue工具配置的参数,生成的代码:
  1. <font face="微软雅黑">static void MX_RTC_Init(void)6 P+ l0 b- p. T' a0 A8 c: v
  2. {
    : U  `6 J( x8 N* H6 \4 F- }
  3.   /* USER CODE BEGIN RTC_Init 0 */
    ) l* b9 @7 I# _- g0 d
  4.   /* USER CODE END RTC_Init 0 */+ d6 R% ]& D- d" j

  5. 8 O  W% w' }* E. y& o
  6.   RTC_TimeTypeDef sTime = {0};
    : g) j: Z+ _3 v* Q' n2 h6 V
  7.   RTC_DateTypeDef sDate = {0};- F. k& Z- A1 y) I0 S

  8. 7 |* {' Z: z; f2 Y9 e  h4 |
  9.   /* USER CODE BEGIN RTC_Init 1 */
    & R# S0 P  m4 C& d9 F. [
  10.   /* USER CODE END RTC_Init 1 */
    2 j" {& g% t9 c

  11. 5 ^9 M% Q! j- l/ c$ D  V
  12.   /** Initialize RTC Only 3 m* W# [! }. ]0 x( T- `  D8 u
  13.   */
    2 a1 H% ^' L+ y8 i% N
  14.   hrtc.Instance = RTC;
    + V6 t5 }$ L" O) L
  15.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;1 K' E* V) p, A. [! z- k9 D
  16.   hrtc.Init.AsynchPrediv = 127;
    3 B' w. F& i+ H$ O9 ]6 n6 b
  17.   hrtc.Init.SynchPrediv = 255;
    3 y1 J! a1 a( f$ s% R7 `
  18.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;& A) h$ b+ B( P( a4 s% T8 ^3 U" Q
  19.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
    5 h' m1 J' t3 E# |, S4 g7 w
  20.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;' W6 a1 O' K/ |  j5 I5 j+ c+ \
  21.   if (HAL_RTC_Init(&hrtc) != HAL_OK)
    4 o& b0 Q3 g9 N
  22.   {
    5 O- h+ b1 B! T4 m
  23.     Error_Handler();
    5 B! @+ M( u4 w3 n% M$ S
  24.   }
    ; f( V( L: ^  D. _

  25. 8 z7 P. @2 A4 k$ J7 ^; F
  26.   /* USER CODE BEGIN Check_RTC_BKUP */
    7 W6 _9 i0 s/ P& M4 s% g2 a
  27.   /* USER CODE END Check_RTC_BKUP */
    6 i- a( r$ _8 \

  28. $ q' g) C$ j3 o7 R
  29.   /** Initialize RTC and set the Time and Date
    6 G- H- H: I5 M9 T# ]! p5 o' h
  30.   */1 p7 {' B9 W4 ~% P7 J+ S
  31.   sTime.Hours = 0x0;% k8 J& V; f* ~/ r3 }! O
  32.   sTime.Minutes = 0x0;3 y. E3 r4 T2 @, k
  33.   sTime.Seconds = 0x0;# b7 w3 T  q# ]* Y
  34.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;2 K8 Z( }- @# E! \2 J
  35.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;) Y& m' h. q2 F7 p1 v# g, _
  36.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
    ) r# Z# U) c* J2 z4 \' P, M
  37.   {
    + s5 J1 e2 U# V. `
  38.     Error_Handler();
    8 h" l: ~% U4 [6 ^( U
  39.   }3 s' \6 F+ e) A% F; U' k; }* t
  40.   sDate.WeekDay = RTC_WEEKDAY_MONDAY;
    ' |( s  U) b' b4 b+ d. \
  41.   sDate.Month = RTC_MONTH_JANUARY;6 r/ q& e  J$ P4 z! `% i+ W" x
  42.   sDate.Date = 0x1;
    2 O3 f- b( E$ [
  43.   sDate.Year = 0x0;
    - p" X0 d' c: P8 Y/ A

  44. " _& U, f/ Q* y2 s3 l2 h; l2 M0 ?
  45.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)4 ~$ A0 ^* E% [: ]6 x
  46.   {
    & _  ]! h. r; o* G
  47.     Error_Handler();
    & j# c( \. ]7 \0 x! f* R
  48.   }- `5 ^3 u- i* e2 |) v) v* O
  49.   /** Enable the WakeUp
    * F, I% o' a+ ~
  50.   */
      h. G2 d6 `2 y9 N& k0 d9 p
  51.   if (HAL_RTCEx_SetWakeUpTimer(&hrtc, 0, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK); {) H" N- F! w) n3 v* k2 f
  52.   {
    9 j2 T- C/ K; f6 ~
  53.     Error_Handler();  H9 }2 j/ |4 Z4 C
  54.   }
    # M0 @& X9 Q% g! X
  55.   /* USER CODE BEGIN RTC_Init 2 */! F  ?. |7 b( e! b
  56.   /* USER CODE END RTC_Init 2 */
    , t6 J( Z, L0 l' w. s* y( o: U! d
  57. }</font>
复制代码
" a1 I4 |+ m- X' K* h+ H
RTC通过Cube工具配置比较省心,如果使用标准外设库进行配置,就需要注意很多细节,简单参考官方提供例程。
+ _0 l. L8 `/ q: ?1 {. [
STM32 RTC 常见问题
- ]2 j. L$ w1 \" ?: W
STM32内部RTC模块应用场景相对简单,不像TIM有复杂的配置以及关联性。但使用RTC仍需要注意一些细节问题。

8 O3 [' |! \+ t
问题一:RTC时间不准
有不少工程师都遇到过RTC计数一天,相差几秒甚至几十秒的情况。导致时间不准最根本的原因是时钟源,还有时钟分频值。
低速内部晶振(LSI)的误差相对较大,特别是温差变化较大的环境。
还有关于时钟分频值,上面已经提到了分频128,实际配置参数应该为127.
解决办法:使用更高精度低速外部晶振、校正、软件配置正确分频值。

3 p- \! s1 T* M! G
问题二:RTC时钟配置失败
RTC的供电来源备份区域电源,操作RTC之前,需要使能后备区域操作。如果没有这一步操作,你会发现操作低速时钟、RTC可能会失败。
当然,出现这种情况,一般是使用标准外设库配置导致的失败。
解决办法:使用Cube工具,或参考官方例程初始化代码。
+ y! b+ g! M* T6 B
问题三:RTC日历不更新的问题
在我们的RTC应用中,经常有人反映在做日历数据读取操作时发现日历不更新的情形。其实,STM32  RTC的日历寄存器由两个组成,为了保证读取时间点的一致性,先读时分秒然后读日期做为一个完整的日历读取操作。在读取TIME【时分秒】后,硬件会将当前日历数据锁住,直到DATE【年月日】寄存器被读取后释放。否则会遇到读取日历时发生数据不更新的情况。
解决办法:对于RTC日历的读取要注意读取动作的完整性,读了TIME还要读取DATE才算一个完整操作,以保持读取时间的一致性。
8 {8 C$ C& ]  W4 p  a% K1 D. t
复盘一下
▼RTC 基础内容:时钟源、日历、闹钟、自动唤醒;
▼RTC 参数配置:时钟源、分频值、初始化;
▼RTC 常见问题:RTC时间不准、RTC时钟配置失败、重启会复位RTC时钟;
4 x; G0 U1 O0 B8 n
文章出处: STM32
* h  `% H" x% @! B4 P* Q
" `1 V+ x/ ^6 D7 s% B" v
收藏 评论0 发布时间:2021-3-9 13:11

举报

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