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

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

[复制链接]
STMCU-管管 发布时间:2020-12-4 14:27
[STM32 ] RTC 实时时钟的系统时间维护
0 j5 m  s- _- ^& ]9 r& b3 ]

$ B6 k- [6 Z; ]1 E5 mSTM32内部带有RTC时钟,可以使用内部LSI和外部晶振LSE提供时钟源。2 g- L, r/ J1 T
1 E& v: v2 \% e6 {5 X4 [6 w
9 N# ]7 A( _" g( Y% ^  Z2 a
LSI:单片机内部的晶振,受外部环境影响比较大,比如温度等因素;大概40Khz左右;: e+ E7 y3 t# k' ~
- t/ s) p; i( {& @1 W& T' x

" H4 H: i, B/ u) ]LSE:外接32.768KHz的晶振,比较稳定;2 w: E, q$ P% d# y- q

- K7 m8 V7 g) n

% M6 D# J4 s, h* F% z软件可配置选择时钟源,可判断识别是否起振。
+ S2 J! `! x& j' I( }# K- ^* q, _! O6 p" L! R9 L
驱动:! u, G- T9 A* Z8 r6 Q
, ]% F9 @/ `0 T. g8 S9 r2 F

8 C/ [9 M! U  `; W1、首先要启动对应的时钟, r3 f3 _, ^2 T7 n( A  W: C  E: E7 m

% x) L4 k1 b( `: d3 X. h) S

: E$ K0 O9 O8 z' I+ I& A/ ERCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);6 z! x, Y& [( k% \8 @0 R  X+ V3 M
9 K9 M) t' y2 v2 |3 I. ~
8 x0 w8 |# |  e8 ~' H
2、使能RTC功能
# n. e5 ^. M  U4 i2 h/ o
2 ~% f" c* o9 [6 r$ L

' }& @, L0 {8 `$ T. RPWR_BackupAccessCmd(ENABLE);- p. N" i6 X% ^, f- y* t# c# H' _
' j7 @% M5 }0 p2 O) S2 ?0 t

2 Q6 [0 O/ r4 |9 B0 l3、配置时钟
" D7 m" I  V2 ^% m7 V& B, Q, ~, [$ ~! O. ?+ n& k& o
/ m, g6 f* b8 [" }1 n
RCC_LSICmd(ENABLE);    //内部晶振
4 V, T, n  @/ P- U) x
' t6 O! {% `/ j3 W9 V- _$ h

7 Z; Z  E% q1 ?2 \RCC_LSECmd(ENABLE);    //外部晶振' n0 \* w( j# ?: `$ D

" S, {( c7 ~: c- g4 ?

7 {/ H- f: k2 X/ [. V读取LSE状态# M. G. f& z2 F' P" M! ^: p7 i
* w! O( T7 p0 S

1 E3 G! ?5 z# ^  V  ?# b4 PRCC_GetFlagStatus(RCC_FLAG_LSERDY) % N/ i  Z* [2 u3 I" v/ a

6 g5 M9 B, f* H

& U" c5 t* B  a+ _读取LSI状态8 `5 ?3 x2 C1 G1 w
9 X: ~0 v( ?( t# ^  J  d  G$ y
7 b  w3 I& Z3 S+ N5 ]$ e4 y9 r
RCC_GetFlagStatus(RCC_FLAG_LSIRDY)" u6 t4 }2 y+ b1 Z% Q4 C$ S1 f

5 P( B" D, C( K8 F0 g: k$ {

( s/ _/ Q: v2 a& S  y, O/ ^4、操作RTC所有寄存器之前需要先确定总线为空闲才能操作成功;$ j7 h5 B. q/ u! m
; I! @8 p- u% ~( \: D# j; }

" t! ~' c( F; V1 Q0 S# bRTC_WaitForSynchro();//等待上一个指令执行完成;8 q, W5 n+ \& |6 }4 v
+ @; h9 \" q5 i
( _# N; B( `# a9 M$ G
5、初始化配置属性% Q* P- V6 D6 X3 A% L7 w  W
" a0 r% f* a0 k, }0 |
; n: l' |$ f6 i& Y& Y1 T
        //软件对时钟进行校准,HSE 按照32.768KHZ接入,公式如下:
5 p1 ^! b( s$ V- w: @3 H' T- ?  E
4 _7 b5 G, @& ]* |7 u4 d" P+ n

, m0 m5 p# o# Y9 i6 A, t; }       uwAsynchPrediv = 0xFF& C7 k2 i0 _$ s; L- T, @

" J5 @7 Q8 E3 i; ^9 d

- `! R, X3 X: B/ u       uwSynchPrediv = 0x7F
: t$ J# W$ s3 [$ @% t1 \& b, x6 i# g2 p, ^
: z6 L2 P, h$ I: a
ck_spre(1Hz)=RTCCLK(LSE)/(uwAsynchPrediv + 1)*(uwSynchPrediv+1)5 X# ?: z5 _6 S% F$ C& k& ~
& H: r  ~4 i: N% }+ Y
/ H1 K2 B5 k) [
RTC_InitStructure.RTC_AsynchPrediv=uwAsynchPrediv;
% |! P+ S; `( X! P9 s, h" Z% v' _+ ]1 e, m/ u% v3 w  Q/ b6 Y
. t- o1 g- i: O4 \9 t, V
RTC_InitStructure.RTC_SynchPrediv=uwSynchPrediv;( F8 p! t, h8 I9 [, {# p

! L! I3 m" J# ?0 p6 d; j+ W        //24/12小时制   * T! ]  y" Q+ j7 q& \# c

) }' ~9 F1 f, [; ~1 t9 B

+ N& h- E, R( z7 GRTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
7 o$ {4 k+ i% W# E) {. M& I
" T5 J' T7 c0 M- w) k& i( J5 U
) E& |' L" P+ L
RTC_Init(&RTC_InitStructure);
" k: }) l2 k3 o$ \5 {4 y- H  a4 [7 V0 W  N0 D

: S0 l# f" |6 g/ v- S0 p6、时钟在不掉电的情况下只需要初始化一次即可,程序复位防止多次初始化,在BAK区域写初始化标志,可解决;1 B9 {+ E* u% E; }. r- J* V* s
* F+ L4 R4 D' i$ r$ }

' S) }/ [0 v+ g& y! y! S    RTC_WriteBackupRegister(RTC_BKP_DR0, 0x32F2);# j0 m6 C8 ]7 ~. ^1 S9 W2 K

% Y* n! y, @  R7 ^    初始化前,读取RTC_BKP_DR0,查看是否为0x32F2,如果是,表示已经初始化成功。
" F" H$ q; p3 u5 H9 K0 q: r. d# Y  d) x# |9 f- ^+ a% j0 m5 |
" L7 X6 x& X9 H; [! C' k; }
if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x32F2)
9 I6 X6 z& j# D' T2 m4 B, r8 b& |' {) @$ L9 M$ n" e
7、读取日期时间9 W, ]# l" u& R5 R8 Z* A. B: N
# x  K" b4 ?+ R+ a$ G

" V! I0 X) F0 Z* ~: G    RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure);
6 f8 p+ d" o0 x" ~8 g2 r6 I, N/ n6 [3 h( Z
! p$ I. p; g. E2 I1 o
8、写入日期时间" V/ }5 [: n4 H3 x8 ]

4 p, W2 I% @6 |

$ R& f) b& v6 e4 z( q, w5 v    RTC_SetTime(RTC_Format_BCD, &RTC_TimeStructure);   
: \/ Y5 v* V( Y1 V# m/ d* T/ F  _1 r6 ~" F) |

, G. H7 d8 M8 D5 f4 t& z& T/ E0 m9 _1 |6 V" A; T" q% t9 h+ H

3 B+ _! V3 v9 V* [
+ U8 y- F; O0 g% i2 T

: }( {1 F( b0 N0 F+ }$ `( T: F下面为此篇文章的重点
" z+ H1 n; c& ~5 g
3 S  o# ~7 D3 b3 ]: ^$ p

" L8 l; a8 Y' L$ v系统里面保存事件或者打印信息,都带有时标,不可能每次都去操作MCU的总线去读取RTC寄存器获取;或者是外部RTC芯片8025,IIC接口;& |2 z8 Z# v; ^  w+ w/ U, M

; z3 [: b0 x* \* R/ b
- `0 w+ w! T' T! G, d. ^
直接操作硬件缺点如下:- \6 V7 F, F, d3 e
2 L' @* {  V4 R  {1 r
. @2 R& \; i  i
1、直接从硬件中获取事件,精度很难取到ms级别,芯片最小刻度为秒;$ d1 h' V% L& B% I  f( T' j
2、操作总线占用系统资源,降低MCU性能;
: Y8 C6 r3 y. ], |5 i" j6 z. i/ n; n) L$ r: p( d' e4 {) H5 l
' J: v0 B; B* C, a$ K5 |
为解决这个事情,需要系统中有个维护软时钟功能,接替RTC的走时;
. G) w9 Z1 K2 r; f( Z( T; r' d4 n1 }& X
: q& p6 S( j3 Y1 X
具体做法为:
- _. a( F2 @% M
) {" e- X3 L2 R- o

2 ^0 ]' q) W1 e$ ?: J1、开启定时器,具体根据需求定义周期,可开启一个1ms定时器;
: h! U. m* w5 ?& E* p2、软时钟1ms累加计数,1S=1000ms;累加到1000,秒数加1;: `% b9 V0 H& I* {8 R1 R, x
3、防止走时误差大,一小时建议同步一次时钟,从硬件RTC中,把时间读取一次到软时钟同步;2 ~( Q: g8 u8 h& w. I: Q
  e2 n4 k* Q. Q( L. o
赞 1 收藏 2 评论0 发布时间:2020-12-4 14:27

举报

0个回答

所属标签

相似技术帖

官网相关资源

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