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

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

[复制链接]
STMCU小助手 发布时间:2021-3-9 13:11
STM32学习笔记 | RTC日历基础应用问题分析
& d1 n$ L7 ^7 S! P/ ^; s, L
RTC,Real_Time Clock,即实时时钟,在许多电子系统中都能看到实时时钟的存在。

9 d, ], i; p1 a% A
每块STM32内部都集成了一个RTC模块,是一个独立的定时器/计数器,具有计数、时钟和闹钟等功能。

7 a# p/ I* J3 I, [8 u2 O; ?
STM32 RTC 基础内容
' ^& x7 C" X* V& v# Q% l8 u) C
STM32内部集成的RTC相当于一个TIM,具有计数的功能,但和TIM有一些区别,比如供电来自备份区域,可作为低功耗模式自动唤醒单元等。
STM32的RTC除F1系列不具有BCD寄存器(日历功能)之外,其他系列的RTC大同小异,本文以F4系列RTC为例进行讲述。

. P6 z0 j( p/ b; }
1. RTC时钟源
  w8 P7 C: u( j* n( v& A
RTC不具备自己输出时钟信号的功能,和TIM一样由内部,或外部晶振提供时钟源。

* S+ Q5 i  P* o; w1 Z# l
通常是由低速外部晶振(LSE)32.768kHz,或者低速内部晶振(LSI)提供。内部晶振误差大,如果要求高精度需使用外部晶振。

5 f; o9 J& L/ A' m
当然,还可以使用高速外部晶振(HSE)的分频信号作为时钟源,但该时钟源有最高频率限制。
* B( J7 A1 a5 V+ Q0 G- S
2.1.png
$ c9 [; [$ a& a! v1 [6 |) ]/ U
2. RTC日历

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

* i3 F: w) P! `! `! D
3. RTC闹钟

7 Q) W9 c* ?  a1 q8 Z) H
RTC闹钟功能也是一个比较实用的功能,大部分RTC都具有两个可编程的闹钟:闹钟A和闹钟B。
RTC闹钟可产生中断信号,也可以产生闹钟输出信号。
: T/ l* A/ R% Z- a
4. RTC自动唤醒

6 J; U! Q2 }/ x8 {( m
有的产品需要周期性唤醒,比如间隔5秒唤醒一次休眠的芯片。
RTC自动唤醒由 16 位可编程自动重载递减计数器生成,通过 WUTE 位可扩展至17位。如果频率为1Hz,则自动唤醒时间可以 1s 到 36h 左右。
以上是重点知识点,更多细节请查阅芯片对应的参考手册。

( ~' d" ^( ], k$ P5 B
STM32 RTC 参数配置

) a$ Z5 D6 f- a: t' `. h
STM32 的RTC使用比较方便,不像TIM各种复杂的关系,可以通过STM32CubeMX很简单就能使用RTC的各项功能。
下面以F4、Cube配置日历为例。
/ x- k2 _" R7 v
1. 配置时钟源

' g6 }7 c/ O- {
2.2.png
1 j) F) O: j" X8 k2 X
2. 配置分频值
8 n7 z; f* Z! T- f7 {, h: h, }2 c
通过32.768kHz信号得到1Hz分辨率,可参考例程默认分频配置:
32768/128/256 = 1.
备注:从0开始分频,所以配置的分频值需要减一:127 = 128 - 1, 255 = 256 - 1.
" b! E+ S" w. I" e+ a+ E
3. 初始化时间和日期

1 R, }# l/ ]) o* A% |8 {- M, [: G
通过Cube工具初始化时间、日期以及格式:
2.3.png

: O/ o2 _7 O5 L5 u$ O4 @
以上就是通过Cbue工具配置的参数,生成的代码:
  1. <font face="微软雅黑">static void MX_RTC_Init(void)0 }4 f; ]) x9 C
  2. {
    ' N8 N5 \% }$ `- f8 F- D' d
  3.   /* USER CODE BEGIN RTC_Init 0 */' Y0 H* L' ~, z6 ?
  4.   /* USER CODE END RTC_Init 0 */
    1 c% C  U5 H% P9 q4 O6 C* q

  5. 1 ]1 K6 V9 C4 Q' Z0 j
  6.   RTC_TimeTypeDef sTime = {0};  X3 b) l! G2 _; u- }
  7.   RTC_DateTypeDef sDate = {0};
    2 O4 K0 H1 ?) M: g

  8. ) r& L( v: J! i6 }! S! V1 e7 x
  9.   /* USER CODE BEGIN RTC_Init 1 */1 A4 v. b4 f% H
  10.   /* USER CODE END RTC_Init 1 */7 N: z3 q9 p( Y* Y! K, a( Y
  11. 2 o& J1 Y8 q) \( j3 b8 h) G
  12.   /** Initialize RTC Only   x, R- ]) `2 t0 A' _4 g) J
  13.   */
    ! z7 m$ {" F" z8 u7 f( ]" `
  14.   hrtc.Instance = RTC;
    # B* X$ m- J: u7 }. V9 }, z- F
  15.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;8 B7 N( n' g* c& P8 F
  16.   hrtc.Init.AsynchPrediv = 127;
    ( Y4 o: u) O% X; d( r  Q% k( \, N- f
  17.   hrtc.Init.SynchPrediv = 255;+ [8 D# n, H3 y' \) J; ~
  18.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;3 t. N' U9 @1 P" r: r& @8 {) o; k
  19.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;, Y+ j5 I2 ^' U3 @' O
  20.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;) Y7 ^* U' E- @! f+ Z# n0 h
  21.   if (HAL_RTC_Init(&hrtc) != HAL_OK)
    ; C0 C' F0 D2 n( h/ |
  22.   {
    + a2 L! E4 X7 }9 d3 J* _
  23.     Error_Handler();
    0 g; y0 U, l' L9 e7 e
  24.   }
    9 Q; B# x9 _) i% z& h: f- L

  25. 9 D- }8 p% o& d- p+ Z/ w
  26.   /* USER CODE BEGIN Check_RTC_BKUP */
    ( V+ h3 Y3 h! j8 K  x
  27.   /* USER CODE END Check_RTC_BKUP */7 P# ^1 u6 l( _: t

  28. ( ]% v' O' e( m1 w. C" }( ^
  29.   /** Initialize RTC and set the Time and Date 6 d* U) n9 c+ `* t: a
  30.   */
    1 ?1 n: x/ C3 h; X% z9 H) w
  31.   sTime.Hours = 0x0;
    ! `' p5 D  Y1 T8 o  d4 j; Q$ n
  32.   sTime.Minutes = 0x0;
    , O' g9 P' q* \9 E# Y5 e% h, j/ [
  33.   sTime.Seconds = 0x0;1 Z1 E7 a7 N- l) _3 ]
  34.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
      D9 o0 D2 D: s& _6 ?- w" s
  35.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;( K% R# o" i' @! R5 {1 l
  36.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
    . R4 Y5 e4 L9 ]# b5 b6 _- k) @$ t, @8 ~
  37.   {/ k- W' F* N4 |
  38.     Error_Handler();
    1 a" k- ~5 V6 w' l7 q  s
  39.   }( b$ G+ K  S" F6 P5 o2 b
  40.   sDate.WeekDay = RTC_WEEKDAY_MONDAY;
    1 E( `5 ^& S9 c/ r( |2 }
  41.   sDate.Month = RTC_MONTH_JANUARY;
    . o5 L4 i2 a1 y! u( L
  42.   sDate.Date = 0x1;
    1 _6 @, P# d7 E2 T* B$ v$ u( O
  43.   sDate.Year = 0x0;  a2 H. R. V" Y; n, o3 `# R5 E
  44. * G( a2 l* f2 u  V: c
  45.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)8 S3 E6 o+ h$ P4 W! |
  46.   {" r3 v$ X/ t! P' z
  47.     Error_Handler();& Y3 x: O7 W% C' D( ]* g- I' U
  48.   }3 h8 e0 o+ K* g
  49.   /** Enable the WakeUp ! x1 C+ h* V+ ~! n
  50.   */1 h, b7 q, _; ~, _
  51.   if (HAL_RTCEx_SetWakeUpTimer(&hrtc, 0, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK)
    ( T- p! P! X4 c' ], F1 b! v) N
  52.   {' o2 ~7 L  Y) f6 S; `
  53.     Error_Handler();
    % E! A  e5 y& S; e% M3 E# b
  54.   }
    3 b6 n. ]- c5 j+ P  Y3 {1 R
  55.   /* USER CODE BEGIN RTC_Init 2 */
    * x2 u' d6 m6 z; n4 d6 X4 ?7 E
  56.   /* USER CODE END RTC_Init 2 */
    ) m5 I# F  }( |( e7 @  z3 S/ J2 _0 h8 }1 z
  57. }</font>
复制代码

# ~' Y% e% Z! U6 x' A: J
RTC通过Cube工具配置比较省心,如果使用标准外设库进行配置,就需要注意很多细节,简单参考官方提供例程。
  W6 |1 G" `* y
STM32 RTC 常见问题
0 g2 ^+ N% W8 Z8 @0 u
STM32内部RTC模块应用场景相对简单,不像TIM有复杂的配置以及关联性。但使用RTC仍需要注意一些细节问题。
/ m( b, U0 y* R, e/ J
问题一:RTC时间不准
有不少工程师都遇到过RTC计数一天,相差几秒甚至几十秒的情况。导致时间不准最根本的原因是时钟源,还有时钟分频值。
低速内部晶振(LSI)的误差相对较大,特别是温差变化较大的环境。
还有关于时钟分频值,上面已经提到了分频128,实际配置参数应该为127.
解决办法:使用更高精度低速外部晶振、校正、软件配置正确分频值。
0 M" i5 v# |# C& `* a! ]9 |) \+ h
问题二:RTC时钟配置失败
RTC的供电来源备份区域电源,操作RTC之前,需要使能后备区域操作。如果没有这一步操作,你会发现操作低速时钟、RTC可能会失败。
当然,出现这种情况,一般是使用标准外设库配置导致的失败。
解决办法:使用Cube工具,或参考官方例程初始化代码。

+ |. L9 `; {4 c, q7 b" a
问题三:RTC日历不更新的问题
在我们的RTC应用中,经常有人反映在做日历数据读取操作时发现日历不更新的情形。其实,STM32  RTC的日历寄存器由两个组成,为了保证读取时间点的一致性,先读时分秒然后读日期做为一个完整的日历读取操作。在读取TIME【时分秒】后,硬件会将当前日历数据锁住,直到DATE【年月日】寄存器被读取后释放。否则会遇到读取日历时发生数据不更新的情况。
解决办法:对于RTC日历的读取要注意读取动作的完整性,读了TIME还要读取DATE才算一个完整操作,以保持读取时间的一致性。
# @# n9 a: ]- w$ s
复盘一下
▼RTC 基础内容:时钟源、日历、闹钟、自动唤醒;
▼RTC 参数配置:时钟源、分频值、初始化;
▼RTC 常见问题:RTC时间不准、RTC时钟配置失败、重启会复位RTC时钟;
, `5 m' n7 r5 Z5 c$ {
文章出处: STM32
& r$ {: P; E! C  E$ n4 ]

) m% c% M/ e, `1 O/ {; a  E8 U
收藏 评论0 发布时间:2021-3-9 13:11

举报

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