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

[STM32 ] RTC 实时时钟的系统时间维护

[复制链接]
STMCU-管管 发布时间:2020-12-4 14:27
[STM32 ] RTC 实时时钟的系统时间维护

' G6 m, I( n$ _/ W) H
' @/ W0 b5 C' N6 X) I! @# V  o$ Z
STM32内部带有RTC时钟,可以使用内部LSI和外部晶振LSE提供时钟源。
; }; k* e9 f6 Z5 Q4 c& X
5 l. N& ^/ A! O. ~; g& c5 z: n
+ p% M& b7 N+ |' n+ {3 Q  P) q
LSI:单片机内部的晶振,受外部环境影响比较大,比如温度等因素;大概40Khz左右;. c' C' g. A* w% e

3 @  _3 a3 |. H% E

$ C, G- f! N% _LSE:外接32.768KHz的晶振,比较稳定;
  a9 A$ [- G' u8 |, L+ g# U* z8 X8 G, B9 z* t: V% x7 d) c
: A& G. D9 C7 d- w: B/ Y  ^
软件可配置选择时钟源,可判断识别是否起振。4 y" i, c* p! M6 n
6 Z3 N2 J3 ?% J7 L* D$ o
驱动:
% n, B+ O9 c9 Q* {, D
- o% Y# _( {8 H4 |. p/ F2 I

2 G% _7 L9 W; n! B1、首先要启动对应的时钟. c- q9 ?; N) Z1 n7 `

; A7 C* b2 h0 q" S+ P! r/ X  c

5 v! o- j$ o/ n; B& gRCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
$ k- o6 [9 U' f8 s0 G+ U2 z+ u( M7 U, T5 L  D9 x
1 w# k. `! c) ?; G
2、使能RTC功能
& _, p2 b5 j- b; _+ t- k3 L8 Q4 C6 K
  B3 X4 f& [  T' W5 Z
PWR_BackupAccessCmd(ENABLE);% h* `- I  ?, V( k- u

; Y7 `, }9 A7 D3 y

4 h3 i- W* |( l( R0 D3、配置时钟
; Q0 O2 ], j! w& Y9 {, l
, L. [2 D& ]) C, \% ]9 V
; I% n7 o6 S7 d7 r0 J3 `
RCC_LSICmd(ENABLE);    //内部晶振
7 q. X# h+ ?8 W: A$ e+ @0 A' @5 z- ]! O6 K/ e

2 W! O; @  w3 M, z; ?1 kRCC_LSECmd(ENABLE);    //外部晶振
+ }/ n( z2 N! V# X2 d" u% v  u9 O  T& E: R0 |" Z2 v/ t

" }" E, [% d) `3 d读取LSE状态" I: J( m/ D" O* m
' B; k. i$ A1 q6 H; U
5 ^7 Y5 l+ ?$ P+ T5 b: g3 X
RCC_GetFlagStatus(RCC_FLAG_LSERDY)
8 q7 m/ r! G* Q
  M& Y% Z( e6 D5 F: |4 r' d
; Q% `2 z0 T9 t. [
读取LSI状态* r* ~/ H0 j+ h- N! X, p
- ~+ O7 p" `6 G( W7 p
# y& P* g; u9 L5 j
RCC_GetFlagStatus(RCC_FLAG_LSIRDY)( W. y; B, K! X8 p6 w0 Y

* A& a4 V, N, ]

5 F+ h. H/ p: S9 S4、操作RTC所有寄存器之前需要先确定总线为空闲才能操作成功;
% w/ ~4 U6 G, L7 u* ?9 y
' N% n; v% H) e4 W

/ [* R. r( I* |2 o2 W9 h1 T& ~2 \RTC_WaitForSynchro();//等待上一个指令执行完成;
9 H7 a' O4 B+ Y) Q% w5 j. T8 O) Q8 W1 N

& ^3 \  G% K3 H3 ^; Q5、初始化配置属性0 k: y1 i! Q6 X6 K% o

2 g- y, z+ ^) [# A+ t6 U

4 q/ J+ n& J5 b. d& ~/ k+ J        //软件对时钟进行校准,HSE 按照32.768KHZ接入,公式如下:
. c9 m" Q/ ^2 ^# c
  K( W( s) r. A: E

8 x% j4 S: T0 M- k! G       uwAsynchPrediv = 0xFF* M- g( G' D( i4 `

* {; `  \& B- o: j
2 Y0 ^' D* ], _/ X! y
       uwSynchPrediv = 0x7F
* T% q" n/ {, U4 q
8 p! M  r2 o; E' g, B/ C0 P' B0 O4 {

& V7 K  u  W+ p, O  Kck_spre(1Hz)=RTCCLK(LSE)/(uwAsynchPrediv + 1)*(uwSynchPrediv+1)
/ x1 f: I4 g! I/ X& I, q
4 x7 e1 c! ?" f# h  A! l8 U

9 e4 z0 J, R) `& Z. k4 sRTC_InitStructure.RTC_AsynchPrediv=uwAsynchPrediv;
& q- b9 @& U  d: M6 Z3 b& r! o6 r) T' l7 H9 K+ `# I

8 `8 Y* _3 P: ]: e( [% s- u9 ^RTC_InitStructure.RTC_SynchPrediv=uwSynchPrediv;7 Y0 e$ N( h7 ~6 e& ^
0 n! m" x4 G* b1 K, h; @5 U, V
        //24/12小时制   
$ q2 G& s, C/ v* P; C2 V" m# l, Z% v& M4 [9 ]3 m% D, A9 P. J

5 {6 X& _' U6 I: C- f; NRTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
3 I; l' I2 v% S" U# f  m8 {! s4 `! ?/ I5 s7 \2 Z: Q8 X# z4 V

% X  L2 d: W, p+ E) YRTC_Init(&RTC_InitStructure);0 Z$ J4 e1 V5 h/ E7 Q. I
7 j8 r* H( c& ^3 b; t1 v
# `/ J! Z- \) ~4 F
6、时钟在不掉电的情况下只需要初始化一次即可,程序复位防止多次初始化,在BAK区域写初始化标志,可解决;% W. ?0 ~* b7 F+ @! N
5 O9 v. Y+ B2 s

9 ^: S; ]7 v- j* P+ b+ w    RTC_WriteBackupRegister(RTC_BKP_DR0, 0x32F2);
7 `# Y: m+ q- S. q9 Z0 f2 R! h! P- b8 ~  q9 P) G
    初始化前,读取RTC_BKP_DR0,查看是否为0x32F2,如果是,表示已经初始化成功。2 X6 l2 c8 v3 R
: V+ U) c- q' x, y% |0 r

8 K0 X4 f4 o5 Y6 A2 t- c) U' Rif (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x32F2)
6 {" d5 F* N  E7 p5 F+ w* l2 ^5 m; A# P: p" B2 e3 i, V
7、读取日期时间
& L% F+ B5 _" C
. |6 V2 D: |: y! I) G/ C* D# Q

% i; d0 X0 l0 Z3 u    RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure);6 _% F7 C# K0 Z3 F  _0 _3 P' p

# L& I1 W+ a2 z5 _* Y, a
+ c9 {; Y: ?; P4 u( u) @
8、写入日期时间; z. ?" ~' j! R1 G9 U

6 {2 y4 j8 P: }; c& [; X2 M! p0 w
; T. G* d. S  r( x/ S
    RTC_SetTime(RTC_Format_BCD, &RTC_TimeStructure);   ; t/ o5 n* e1 Z" Q: P* a+ ?5 C& m& f
7 t) l; n, Q+ n/ o- V: p" [* g
9 k6 i- @, y- A  p
3 Q. R/ s& v4 n4 p/ Y1 a

5 i. q/ S; h5 o8 f
+ z0 ~( f. d* }7 M0 `9 f! f; W& k

7 k9 ?3 G' v$ S1 w* V! |; V4 Q下面为此篇文章的重点
/ ], ^) W# ~7 q9 J2 m, H1 s( L# c) u2 f; N

3 U8 u/ e8 f) t系统里面保存事件或者打印信息,都带有时标,不可能每次都去操作MCU的总线去读取RTC寄存器获取;或者是外部RTC芯片8025,IIC接口;
* c  G4 w1 K. F$ G; b% J9 b" z* n7 a7 z. X) Q( q3 q( u% k6 B) B" m
9 d' |+ A  [4 M
直接操作硬件缺点如下:
* b- A- r9 A8 d. K
2 @6 M: W5 W; d* |
1 ?. J: W/ l* i. A
1、直接从硬件中获取事件,精度很难取到ms级别,芯片最小刻度为秒;4 b6 U" ~% E; `0 O2 z* |7 i+ y/ v* v
2、操作总线占用系统资源,降低MCU性能;
8 |2 p9 w) f. J6 J/ w$ r+ M6 H6 d3 R. S( f; \8 _

3 r. }6 B" p* l) L9 F  O为解决这个事情,需要系统中有个维护软时钟功能,接替RTC的走时;4 {. C- i3 a( o4 r8 Y
& f: t  c  \4 n
( Z  R8 V& X6 ], O9 U
具体做法为:
) T& o2 |! `5 W
3 b, u1 C- l" X; n$ v

1 A* @2 [; S4 L) E# C' d1、开启定时器,具体根据需求定义周期,可开启一个1ms定时器;0 }3 m$ g  d9 c
2、软时钟1ms累加计数,1S=1000ms;累加到1000,秒数加1;
4 d# ]% H. y3 ?9 Z* g3、防止走时误差大,一小时建议同步一次时钟,从硬件RTC中,把时间读取一次到软时钟同步;
6 X5 Q9 N9 w0 b( j  ^4 y8 _/ D9 @" A2 h6 w2 T( g$ i
1 收藏 2 评论0 发布时间:2020-12-4 14:27

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版