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

RTC实时时钟,步骤超细详解,一文看懂RTC

[复制链接]
STMCU-管管 发布时间:2020-9-29 10:09
什么是RTC

RTC (Real Time Clock):实时时钟

RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期 RTC还包含用于管理低功耗模式的自动唤醒单元。

3 {' M4 ~+ v0 K9 }0 H- T

1_meitu_1.jpg


  J9 O& v8 R  U4 K* s+ h( i/ Z

在断电情况下 RTC仍可以独立运行 只要芯片的备用电源一直供电,RTC上的时间会一直走。

; {2 f* V/ ]9 e7 L" G

RTC实质是一个掉电后还继续运行的定时器,从定时器的角度来看,相对于通用定时器TIM外设,它的功能十分简单,只有计时功能(也可以触发中断)。但其高级指出也就在于掉电之后还可以正常运行。

6 \- p0 i8 E6 K2 P3 }

两个 32 位寄存器包含二进码十进数格式 (BCD) 的秒、分钟、小时( 12 或 24 小时制)、星期几、日期、月份和年份。此外,还可提供二进制格式的亚秒值。系统可以自动将月份的天数补偿为 28、29(闰年)、30 和 31 天。

上电复位后,所有RTC寄存器都会受到保护,以防止可能的非正常写访问。

无论器件状态如何(运行模式、低功耗模式或处于复位状态),只要电源电压保持在工作范围内,RTC使不会停止工作。

4 g% |  h8 z/ N5 O


. K$ `0 V  Q- N& U, u

RCT特征:

● 可编程的预分频系数:分频系数高为220。2 i! I. a+ n: W4 s
● 32位的可编程计数器,可用于较长时间段的测量。
0 a! f1 j: L2 k; n: E5 o  H% g* Z● 2个分离的时钟:用于APB1接口的PCLK1和RTC时钟(RTC时钟的频率必须小于PCLK1时钟 频率的四分之一以上)。7 E: T7 X( [: h  c5 Z  i" y% J$ Z# d; x
● 可以选择以下三种RTC的时钟源:+ N, `8 l/ U- j
     ● HSE时钟除以128;+ G8 f/ }" v3 C5 e% ?9 Y$ y3 `' Y
     ● LSE振荡器时钟;0 H2 e7 Y& ?1 _$ k: K5 N
     ● LSI振荡器时钟

● 2个独立的复位类型:# e  D2 u6 \% [. Y  h
     ● APB1接口由系统复位;
2 k* V- @6 r) \7 D8 g( x     ● RTC核心(预分频器、闹钟、计数器和分频器)只能由后备域复位

● 3个专门的可屏蔽中断:* `% p9 e/ i6 K: y9 R) J! `( j
     ● 1.闹钟中断,用来产生一个软件可编程的闹钟中断。

     ● 2.秒中断,用来产生一个可编程的周期性中断信号(长可达1秒)。

     ● 3.溢出中断,指示内部可编程计数器溢出并回转为0的状态。

! \$ K% }5 C8 z: s

RTC时钟源:
0 W+ i. h, h& O三种不同的时钟源可被用来驱动系统时钟(SYSCLK):

● HSI振荡器时钟
) R2 o7 ~& v$ a; F& j● HSE振荡器时钟
1 B) P& o) x' A: g# @8 u6 A/ t● PLL时钟

这些设备有以下2种二级时钟源:

● 40kHz低速内部RC,可以用于驱动独立看门狗和通过程序选择驱动RTC。 RTC用于从停机/待机模式下自动唤醒系统。8 g) i5 B9 w, C
● 32.768kHz低速外部晶体也可用来通过程序选择驱动RTC(RTCCLK)。


& j  H+ E% j0 r' i: B. l


( ~4 \  M) `) {& v

RTC原理框图
' ]3 m- z  m% s7 `
2_meitu_2.jpg
  m9 t& S& v7 q, @. b/ E6 h
- H+ E) \6 \1 O* d6 m

; d- A; E! p' ~* m/ n6 `. RRTC时钟的框图还是比较简单的,这里我们把他分成 两个部分:. q0 t5 `2 Z  B9 q$ L+ g

APB1 接口:用来和 APB1 总线相连。 此单元还包含一组 16 位寄存器,可通过 APB1 总线对其进行读写操作。APB1 接口由 APB1 总 线时钟驱动,用来与 APB1 总线连接。

通过APB1接口可以访问RTC的相关寄存器(预分频值,计数器值,闹钟值)。

RTC 核心接口:由一组可编程计数器组成,分成 两个主要模块 。


" \* ^2 V% A; L( P( ~

' R! ^* k* F; ~) |# H

3_meitu_3.jpg g)
, P/ K$ T" {9 ]9 ^3 ^
& v# n6 P6 M* G. [+ a& ^
+ Q* M: l2 S8 \/ I" R5 |" g; M- j
9 [6 l* s/ b! `& Q4 X: P6 o

  O2 q& o! H: G# o4 @- C第一个模块是 RTC 的 预分频模块,它可编程产生 1 秒的 RTC 时间基准 TR_CLK。RTC 的预分频模块包含了一个 20 位的可编程分频器(RTC 预分频器)。如果在 RTC_CR 寄存器中设置了相应的允许位,则在每个 TR_CLK 周期中 RTC 产生一个中断(秒中断)。1 ~! D' D7 J/ y" e


8 Z' n, ?4 }- w% j! f, \& s


3 A1 t% X% ]; C% G+ C

4_meitu_4.jpg

8 r6 ~4 _) X* P- c) C! L* Z
+ {! H7 `8 C' `. B; ?3 L9 |& h
9 M( |3 \+ ]+ X- O2 j" M' V

4 V9 D$ ~3 Q0 Z  d) M0 q
/ i: _/ u$ W# D8 x2 y5 P
第二个模块是一个 32 位的可编程计数器 (RTC_CNT),可被初始化为当前的系统时间,一个 32 位的时钟计数器,按秒钟计算,可以记 录 4294967296 秒,约合 136 年左右,作为一般应用,这已经是足够了的。6 g2 I1 ^$ N  x' g, r


2 U$ b; [1 x9 M( f

& e, I6 C, Y( ^& z: C

RTC具体流程:

RTCCLK经过RTC_DIV预分频,RTC_PRL设置预分频系数,然后得到TR_CLK时钟信号,我们一般设置其周期为1s,RTC_CNT计数器计数,假如1970设置为时间起点为0s,通过当前时间的秒数计算得到当前的时间。RTC_ALR是设置闹钟时间,RTC_CNT计数到RTC_ALR就会产生计数中断,

  • RTC_Second为秒中断,用于刷新时间,
  • RTC_Overflow是溢出中断。
  • RTC Alarm 控制开关机
    $ v* n1 y, R- m. X( I0 K

    , ^; G* v' ]2 S! b

- L; g7 E4 x7 ]7 t+ T1 n% J

; z/ S7 b0 `# Y) i  [# J) p- x6 N8 K  l7 h. s+ ^. {

- {' j, T; c) |% R2 KRTC时钟选择

使用HSE分频时钟或者LSI的时候,在主电源VDD掉电的情况下,这两个时钟来源都会受到影响,因此没法保证RTC正常工作.所以RTC一般都时钟低速外部时钟LSE,频率为实时时钟模块中常用的32.768KHz,因为32768 = 2^15,分频容易实现,所以被广泛应用到RTC模块.(在主电源VDD有效的情况下(待机),RTC还可以配置闹钟事件使STM32退出待机模式).


7 I3 m) H6 t. T" X


, ?! w" h' ?+ W& K( s; M

RTC复位过程

除了RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器外,所有的系统寄存器都由系统复位或电源复位进行异步复位。9 B/ C: a' I# w1 ?5 K
RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器仅能通过备份域复位信号复位。

系统复位后,禁止访问后备寄存器和RCT,防止对后卫区域(BKP)的意外写操作

* i' q" C% H, C! ?) u/ F% E

7 Y' A- e9 i8 i

读RTC寄存器

RTC内核完全独立于APB1接口,软件通过APB1接口对RTC相关寄存器访问。但是相关寄存器只在RTC APB1时钟进行重新同步的RTC时钟的上升沿被更新。所以软件必须先等待寄存器同步标志位(RTC_CRL的RSF位)被硬件置1才读。


5 _: c" P: S9 Q4 G6 M' b' A  ~


/ h: `4 T, @# M6 a) I  V

配置RTC寄存器

必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、
, k8 u5 I* W/ Z4 vRTC_CNT、RTC_ALR寄存器。

另外,对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询9 g  A" o  @' ~/ _+ }9 m' ]
RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是’1’
# A0 u0 t6 X) S: S; x9 ^时,才可以写入RTC寄存器。


! V  O9 e, o, x; a


' G6 y) z+ V0 h; X# l

RTC时钟源

RTC是一个独立的时钟源
- Q) Y6 C; w& @0 x; p' D0 A

5_meitu_5.jpg
+ ~5 E! x! ]4 _; m, \/ @

/ D4 O  m$ x+ t5 l5 T5 O
. R4 |. c2 T2 a# o

  f, A3 F% d) J9 TRTC寄存器
  • RTC控制寄存器 (RTC_CRH, RTC_CRL)
  • RTC预分频装载寄存器 (RTC_PRLH, RTC_PRLL)
  • RTC预分频余数寄存器 (RTC_DIVH, RTC_DIVL)
  • RTC计数器寄存器 (RTC_CNTH, RTC_CNTL)
  • RTC闹钟寄存器 (RTC_ALRH ,RTC_ALRL)
    7 L6 D: m' s+ e

      a( B3 T) T: Y$ v6 n! i
3 J* V* v. C: R1 L9 K
8 a  v" k& [# V1 k" ~
RTC控制寄存器高位——RTC_CRH 寄存器; s+ V/ ^+ p% d( N8 W
6_meitu_6.jpg
  b. Q# ~4 X0 T* r

7 h* G+ ~" g+ s4 {, }$ R作用:配置3个专门的可屏蔽中断(溢出中断、闹钟中断、秒中断)使能。) {3 ~9 {7 V$ b! D; Y6 K& {

注意:系统复位后所有的中断被屏蔽,因此可通过写RTC寄存器来& I" Q( v# o" L9 b% v+ b4 T& Y
确保在初始化后没有挂起的中断请求。当外设正在完成前一次写操作时(标志位RTOFF=0),不/ f: T% b$ C+ L4 p4 X9 B( b
能对RTC_CRH寄存器进行写操作。

: ^% @9 F0 `/ q( A0 ]9 i$ Q+ g3 |

. K# ]7 P! H/ e8 [9 M0 i

RTC控制寄存器低位——RTC_CRL 寄存器; R* h% @# k) M. `0 O( c6 F" [

4 m# [& L2 s( d" {/ `1 }
7_meitu_7.jpg

% C" [  e- H& z- m# \- t& D
$ }' c% ^# A5 g, Q  A! `7 ~; {; P7 D; v* \
一般用到该寄存器的 3,4,5位
0 z* L( Q: J5 S' f1 [1 [
  • 第 3 位为寄存器同步标志位,我们在修改控制寄存器 RTC_CRH/CRL 之前,必须先判断该位,是否已经同步了,如果没有则等待同步
  • 第 4 位为配置标位,在软件修改 RTC_CNT/RTC_ALR/RTC_PRL 的值的时候,必须先软件置位该位,以允许进入配置模式
  • 第 5 位为 RTC 操作位,该位由硬件操作,软件只读。通过该位可以判断上次对 RTC 寄存器的操作是否完成,如果没有,我们必须等待上一次操作结束才能开始下一次,也就是判断RTOFF位是否置位。' J$ }0 f7 C1 L7 ~" w
    1 e/ G/ P6 }! R' O  }/ f
; P7 c& o! r& Z1 Q
' ]/ p5 O% A  L$ e- L* S; w3 B, w

三个位总结如下:

① 修改CRH/CRL寄存器,必须先判断RSF位,确定已经同步。; f& K" s' q' E5 y1 [# `& S) C8 F
② 修改CNT,ALR,PRL的时候,必须先配置CNF位进入配置模式,修改完之后,设置CNF位为0退出配置模式
/ q. p: `+ Z' q5 w0 Q  P: W

③ **同时在对RTC相关寄存器写操作之前,必须判断上一 8_meitu_8.jpg

7 U5 O3 H. I, N* D
" e, m" u- W/ M
5 n( m; `4 Y* y- K
6 o+ m! ?# Y" S
+ e! l% i/ z; P' H

% K9 K" ^" s1 Y. c- HRTC 预分频装载寄存器——(RTC_PRLH/RTC_PRLL) 寄存器' j) y4 X: y2 `

作用:配置 RTC 时钟的分频数,

比如我们使用外部 32.768K 的晶振作为时钟的输入频率,那么我们要设置这两个寄存器的值为 7FFFh(32767),就可获得周期为1秒钟的信号。6 o4 R: H4 E% O. n% V5 _

9_meitu_9.jpg

9 u) z2 G$ f8 r! \3 z

4 x$ \& A$ Y. i3 y( c' c
- e8 d, @6 r8 q- O
2 M/ `# i) D0 M9 B
RTC预分频器余数寄存器(RTC_DIVH、RTC_DIVL)
0 R' _: ^" |8 V. W- q& l

作用: 和他的名字一样,获得余数,也就是获取更精确的计时,比如:0.1s ,0.01 s等

寄存器是只读寄存器,其值在RTC_PRL或RTC_CNT寄存器中的值发生改变后,由硬件重新装载。

2 P5 z4 q* I7 P( n" D  N/ j5 s/ o

10_meitu_10.jpg
8 w' Q9 n, \3 p! [8 f& F

9 {$ V# W; ]) x+ ^# S
! L* [* N5 Q( g1 H3 `' _

3 I4 X- B8 J3 P( S/ Q1 `  Z5 l
" r: A. I/ M( G- a* O% b0 K

7 e. n, W. d- k1 y  Z3 dRTC 计数器寄存器——RTC_CNTX 寄存器2 Q1 a% B& z3 Q4 W* u2 g/ Z" H

作用:存放计数器内的计数值。也就是用来记录时钟时间

该寄存器由 2 个 16 位的寄存器组成 RTC_CNTH 和 RTC_CNTL,总共 32 位,当进行读操作时,直接返回计数器内的计数值(系统时间)
. L- m( ]  L6 x: c

11_meitu_11.jpg
- c! l: z# M# z! J, e: X7 r$ d

. X" }) }8 u! h& e% o5 d
2 S- m, I3 A% M: S  f5 S' e
9 u( w5 _* f% c6 V

" X9 P1 [( q- }6 d* g' L" m2 Z5 C0 n( v; W! M1 O
RTC 计数器寄存器——RTC 闹钟寄存器(RTC_ALRH、RTC_ALRL)
- e2 a3 T9 _/ I; i: N3 R, Z7 e+ w9 @% j2 D, \

作用: RTC时钟中断控制寄存器

该寄存器也是由 2 个 16 位的寄存器组成 RTC_ALRH 和 RTC_ALRL,也就是32位,当可编程计数器的值与RTC_ALR中的32位值相等时,即触发一个闹钟事件,并且产生RTC闹钟中断。


% A! z( _& p5 B0 q. {

12_meitu_12.jpg

1 P: Y: b+ L/ m8 d

6 {# c+ z# e, v
/ G) S& F; j& e& h; _% |0 |4 ^
, F/ S/ ~* G5 x" v( K7 n
  P) K# M2 V/ L* ]! ?& }
1 B) P; a7 i: H
BKP备份寄存器
) ^; b# E/ ^' u, {# e

备份寄存器是42个16位的寄存器。可用来存储84个字节数据。
" b6 o4 M8 v5 @它们处在备份区域,当VDD电源切断,仍然由VBAT维持供电。

当系统在待机模式下被唤醒,或者系统复位或者电源复位,它们也不会复位。. h  a! H4 C2 A7 j
执行以下操作将使能对后备寄存器和RTC访问:

  • 设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备时钟。
  • 设置寄存器PWR_CR的DBP位,使能对RTC和后备寄存器的访问
    % F8 l" p- Y1 K+ f( U

    8 v) Q5 U0 z# G: g% m: g9 Q

一般用 BKP 来存储 RTC 的校验值或者记录一些重要的数据,


$ w: q# Q7 }) C  z7 s

13_meitu_13.jpg

3 j' y( Y4 d( A( Q

+ v6 w& K% E3 j, P配置RTC寄存器:

1.查询RTOFF位,知道RTOFF的值为1.

2.置CNF值为1,进入配置模式。

3.对一个或者多个RTC寄存器进行写操作。

4.清除CNF标志位,退出配置模式。

5.查询RTOFF,直到RTOFF位变1,已确认写操作已经完成。

仅当CNF标志位被清除时,写操作才能进行,这个操作至少需要3个RTCCLK周期。


; A7 e1 G# Q' c' S0 d" d6 L& H


, H6 w7 n& ]+ k' R! X8 A+ _) n7 T

RTC相关库函数
  • RTC时钟源和时钟操作函数:
    7 u# Q; _2 ?1 J7 G; r, `

    * [8 g$ B+ M- B5 }
  1. void RCC_RTCCLKConfig(uint32_t  CLKSource);//时钟源选择
    + Y. i1 f4 y" t, {4 _7 V
  2. void RCC_RTCCLKCmd(FunctionalState NewState)//时钟使能
复制代码
- o; c* Q7 |; `3 l  |3 `' V& E
" w$ @$ B; A/ A& S2 z
  • RTC配置函数(预分频,计数值):
    1 [5 Z0 \3 R) J5 j6 z
  1. void RTC_SetPrescaler(uint32_t PrescalerValue);//预分频配置:PRLH/PRLL8 z; ~4 ^, R4 {% ~" ]9 s' W8 x
  2. void RTC_SetCounter(uint32_t CounterValue);//设置计数器值:CNTH/CNTL
    - ^; d$ s. Z6 k* G
  3. void RTC_SetAlarm(uint32_t AlarmValue);//闹钟设置:ALRH/ALRL
复制代码
! o7 V. k1 l8 w0 [% W7 y% h1 K3 U6 S

  p/ I5 ?$ `/ l( e& h+ Q) u5 s: Y2 S
  • RTC中断设置函数:
    2 }3 F( d1 |4 v! l' G+ g. z, l
    ! y- G+ K* o4 ~' d
7 U5 {9 x; P7 C3 c( ^( [9 K
  1. void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);//CRH
复制代码

( z3 n8 A5 u. K& ^1 ~7 U/ Q
  • RTC配置函数:6 \6 p, v* y+ W5 r
    . k5 g) [% D. |7 R7 I
  1. void RTC_EnterConfigMode(void);//允许RTC配置 :CRL位 CNF: k5 _' ?9 }/ X1 a: `
  2. void RTC_ExitConfigMode(void);//退出配置模式:CRL位 CNF
复制代码
$ F  p; @; z. ?7 `) s: B
  • RTC同步函数:
    : d# C4 Z/ L" V& o
  1. void RTC_WaitForLastTask(void);//等待上次操作完成:CRL位RTOFF( R0 H+ x( h, `" f3 b% _* T
  2. void RTC_WaitForSynchro(void);//等待时钟同步:CRL位RSF
复制代码

. ^; d  @0 E) e7 z0 ?/ u$ j1 z4 L# k1 C
  • RTC相关状态位获取清除函数:
    ! u7 V0 a( C; A" p0 X3 h  Z5 V" O
  1. FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG);
    . U4 @, o3 H; ?) t8 j( d% X
  2. void RTC_ClearFlag(uint16_t RTC_FLAG);5 z4 l1 }2 R4 m% C
  3. ITStatus RTC_GetITStatus(uint16_t RTC_IT);
    6 V3 u( s2 ~6 E2 p- r
  4. void RTC_ClearITPendingBit(uint16_t RTC_IT);
复制代码
$ Z1 {( b( @$ A+ H: j, z
' x0 B6 W$ m7 Z6 }2 [
  • 其他相关函数(BKP等)
    / s+ W! `% _; d: X" N1 e: P6 ]
  1. PWR_BackupAccessCmd();//BKP后备区域访问使能6 {0 M8 G7 j2 [0 k1 C
  2. RCC_APB1PeriphClockCmd();//使能PWR和BKP时钟
    / E/ F$ y' f- D5 d, a
  3. RCC_LSEConfig();//开启LSE,RTC选择LSE作为时钟源        / l+ j1 n7 u% V' U5 y2 W" F2 Q
  4. PWR_BackupAccessCmd();//BKP后备区域访问使能, y+ Y6 ~# x$ g, O/ z5 J
  5. uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);//读BKP寄存器8 _# ^0 D1 t, U1 W$ R
  6. void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);//写BKP
    ! p8 C+ t) g3 {1 d9 z* K
复制代码

9 J4 F5 @; l. Y! O  M/ M+ X) K/ q2 k. ?$ H9 T. x+ l
配置RTC步骤' Q' H0 G( ?3 O; w' M* ^0 D) e+ j  G; u
  • ①使能PWR和BKP时钟:/ p2 i& ~, T. f& c: L& R* y
  1. RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
复制代码

( A/ I4 q, C* P: @4 r" ^
1 ]- L2 B5 \% K. K  E
  • ② 使能后备寄存器访问:9 }1 D6 `; z# p# b
    + D. s4 W' v2 P" G
  1. PWR_BackupAccessCmd(ENABLE); //使能 RTC 和后备寄存器访问
复制代码
  r  j( e7 q+ Z8 G' _2 p  `/ }& e
  • ③复位备份区域,开启外部低速振荡器。
    # O- Z9 G% ^- |% e: V: [6 k; M* k  A
    & Q3 F. a  O; e* ]$ O# _, u! k* L6 W
  1. BKP_DeInit();//复位备份区域
复制代码
  `- y' R( {" u$ [( w

5 G# @) k/ P0 N9 Y! J3 ~/ y. D- R6 K
  • ④ 配置RTC时钟源,使能RTC时钟:
    1 _- v+ ]3 Y% d" v8 S$ U* F
    / {8 I$ Z) P# U& @! ~9 W% l2 y
  1. RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //选择 LSE 作为 RTC 时钟(RCC_RTCCLKSource_LSI 和 RCC_RTCCLKSource_HSE_Div128)
    ' w0 W' F7 d( H. d4 x+ H) @8 a
  2. RCC_RTCCLKCmd(ENABLE); //使能 RTC 时钟
复制代码

) K  g: E( e9 B1 m* |1 \2 u3 Z
  • ⑤ 设置RTC预分频系数:RTC_SetPrescaler();
    * C7 f- d/ p" M( r* _
  1. RTC_EnterConfigMode();/// 允许配置       
    9 n2 A- e2 i1 U/ C
  2. RTC_SetPrescaler(32767); //设置RTC预分频的值
    - J0 e! V; W. L5 D! B6 g2 i/ [
  3. RTC_WaitForLastTask();        //等待最近一次对RTC寄存器的写操作完成
复制代码

9 \( u  r$ ?5 s  w9 X
( z$ s( e! z* f1 z- k& G
  • ⑥ 设置时间:RTC_SetCounter();1 O9 @. N" f: y( x, J4 H

    4 n" S! o$ K0 T/ t
  1. RTC_EnterConfigMode();/// 允许配置
    : S9 Y0 @, @1 A5 a6 ]+ Q7 D; G
  2. void RTC_SetCounter(uint32_t CounterValue);# b& W& w5 ^. P6 g8 T  }3 c# e& \7 v9 x
  3. RTC_WaitForLastTask();        //等待最近一次对RTC寄存器的写操作完成
复制代码

1 G4 }8 I$ r- ]9 {! ]1 k5 n
9 Y5 D9 x1 _% u, `3 A
, Q( z1 M9 U; G; s  `8 n+ s4 p
  • ⑦开启相关中断(可选):. {7 k* R/ F. J; q

    # e2 j* l5 x( v" D! l
  1. void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);//RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能 RTC 秒中断
复制代码
/ L% y5 Q5 g4 \! Y
  • ⑧编写中断服务函数:
    % r" f3 `" E( g9 e- K: L: @

    * f5 L0 n' e9 N+ J! c7 N1 Q

4 o: U. h. D# S& \
  1. RTC_IRQHandler();
复制代码

2 i+ |: ]* x, u
  • ⑨部分操作要等待写操作完成和同步。# R; o, b& i8 i" H/ f. W% _! i! A& \6 F
    # S# Y. @* C- |  [) U( }; I
  1. RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成4 \# w9 `" m" k) d
  2.    RTC_WaitForSynchro();        //等待RTC寄存器同步
复制代码

" g; Q0 c% j4 |5 {9 `+ r& ]
8 z4 o+ A& ~  l" B( D
, Z: |, G* D" O8 F7 y, ~# F7 r
收藏 评论1 发布时间:2020-9-29 10:09

举报

1个回答
李康1202 回答时间:2020-9-29 17:31:42
还是标准库呢
: j+ p3 i% n: Z$ A" k1 M! @1 _
# ^( y/ Y; R" G4 H: q

所属标签

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