找回密码
 注册
关于网站域名变更的通知
查看: 392|回复: 2
打印 上一主题 下一主题

RTC介绍、寄存器详解以及应用示例

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-10-19 14:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
实时时钟的缩写是RTC(Real_time clock)。RTC 是集成电路,通常称为时钟芯片。RTC通常情况下需要外接32.768kHz晶体,匹配电容、备份电源元件。RTC除了I/O口的定位不同,还有功能上的区别,比如与mcu接口,现在常用的是I2C接口(距离短,可以与其他器件共用)还有RAM的数量、静态功耗大小、中断的数量,特别是精度的区别。 RTC的精度可以说与温度有很大的关系,而温度会影响晶体的频率。本章介绍的是集成在芯片内部的时钟功能模块。
% T$ t6 i& t  t1 RTC介绍
7 o, |- h: r1 f+ z4 ^* j在一个嵌入式系统中,通常采用RTC 来提供可靠的系统时间,包括时分秒和年月日等,而且要求在系统处于关机状态下它也能够正常工作(通常采用后备电池供电)。它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的32.768kHz晶体和电阻电容等,如图1所示。: P1 p. E" q- W( \" h: c0 J

2 y, \% h" Y# R" O2 RTC控制器& m" T4 B4 ^$ H% |& b% m
4 V  {; R4 p; s1 q
实时时钟(RTC)单元可以通过备用电池供电,因此,即使系统电源关闭,它也可以继续工作。RTC 可以通过STRB/LDRB 指令将8 位BCD 码数据送至CPU。这些BCD 数据包括秒、分、时、日期、星期、月和年。RTC 单元通过一个外部的32.768kHz晶振提供时钟。
: ]6 Z! A2 r* ?5 [
+ t% ^, K& I# C: n0 n" Y3 O) _        ● 时钟数据采用BCD 编码。+ g- `6 R. l# G0 _) v  W+ N5 ]# Z
        ● 能够对闰年的年月日进行自动处理。0 o% N: O4 @* X/ R  g1 r0 X
        ● 具有告警功能,当系统处于关机状态时,能产生告警中断。
" g6 c) ^2 ]" t/ n8 [        ● 具有独立的电源输入。
. O, F& T! e1 I; _# }        ● 提供毫秒级时钟中断,该中断可用于作为嵌入操作系统的内核时钟。' d" b( W, O" @; |2 F
/ \% u7 H. i  b4 t2 I, [0 N+ H* a3 [- u$ v
3 RTC控制器寄存器详解
1 L6 s5 R9 U. l8 \( e7 Q
3 y+ u' _( ~2 ^+ p/ Y5 b8 |; P0 J1 ^如表3所示为相关寄存器描述。0 p$ E- {6 B3 I& o2 C
! [! C, U' r% K- W; ^& I8 C) |
如表4所示为BCD秒寄存器描述。: l. H* r( O) U4 n

' b7 R; k- r1 m" b0 X如表5所示为BCD分钟寄存器描述。, p8 g* k/ G  b8 j+ t6 F

8 c! q: i3 H3 I3 c0 U8 U* \  b! @如表6所示为BCD小时寄存器描述。  u8 K4 ^, @. I' h  J' i0 J0 W
+ I: b: r. I) i( z
如表7所示为BCD日期寄存器描述。' ^# ^% f) \% ]1 x2 ]! j
$ N9 `# Q$ r) {( A
如表8所示为BCD星期寄存器描述。5 K- [; a6 P- |" h2 f7 s) }
+ S+ J9 P0 F7 I
如表9所示为BCD月寄存器描述。
7 D" S8 m8 V  ~* j
: [6 x8 f- c, T3 B  T0 G$ r
如表10所示为BCD年寄存器描述。
) q! R* ~# k+ B$ R- ?
  _7 r% l$ U+ s, z# Y- w0 x& h+ l# _" q8 C3 K2 h$ q' E0 ?/ H  `
4 RTC应用示例. f+ P6 g2 o% [+ P" ?) K3 t

- g% z2 I) J! i0 b) s- z! T1).相关寄存器定义8 V8 p, ^, h7 N- l4 q9 [9 y' h
* E, \9 u: G1 d$ U; c2 S  g
: K4 o8 d. P( T) g
5 n, P% {& b' S. w8 Y: t0 G

    2 N4 w  n3 m- Y& B+ `& ]' ?2 g
  • typedef struct {
  •                         unsigned int BCDSEC;
  •                         unsigned int BCDMIN;
  •                         unsigned int BCDHOUR;
  •                         unsigned int BCDDATE;
  •                         unsigned int BCDDAY;
  •                         unsigned int BCDMON;
  •                         unsigned int BCDYEAR;
  •         }rtcbcd;
  •         #define RTCBCD (* (volatile rtcbcd *)0xEA300070)
    2 T1 t* \6 H9 U( R0 }
1 t- Y" z. E8 U( q7 {* g+ H

4 e* X  e3 `7 r% A. O4 X+ N. H4 J复制代码
5 M" ^& E3 n5 j, J, |

; B4 ?* q6 N9 a
- |2 @- m6 u1 L# Q: E2).主程序
, c# A, |! v0 `6 H/ r! r; r/ x( c2 S3 j
下面的代码实现了一个将RTC的年月日、时分秒读出的功能,可以将注释掉的代码打开来复位值。
" Z( R. X& p  f+ P8 h6 [8 r
/ S/ {6 c; f1 t
& q: e) y: m! j6 c' |) J
( h' Z- W% Q* b( t' ~# Z- {. x
    1 l+ V# Q) P3 {
  • void rtc_init(void)
  •         {
  •                 RTCCON = 0X01; //使能RTC控制些功能
  •                 RTCBCD.BCDSEC = 0x0; // 2012 03 15, 12:59:00.以BCD码格式写入
  •                 RTCBCD.BCDMIN = 0x59;
  •                 RTCBCD.BCDHOUR =0x12;
  •    &nbsnbsp;            RTCBCD.BCDDATE = 0x15;
  •                 RTCBCD.BCDMON = 0x03;
  •                 RTCBCD.BCDYEAR = 0x12;
  •                 RTCCON = 0; //关闭RTC控制些功能
  •         }
  •         int main()
  •         {
  •                 unsigned int i = 0;
  •                 uart0_init();
  •                 rtc_init(); //初始化时间
  •                 while(1) //循环打印时间
  •                 {
  •                         printf("hour %x : min %x : sec %x\r",RTCBCD.BCDHOUR,RTCBCD.BCDMIN,RTCBCD.BCDSEC);
  •                         for(i=0;i<10000000;i++);
  •                 }
  •                 return 0;
  •         }
    - `3 k0 r% O4 c
, h2 ~3 E7 F) g$ H. z  S# n

2 f' ^: k( X: K1 R复制代码
/ o: i- H! {# j$ L, y

/ n6 [1 d5 r3 C1 s6 G1 h# V7 k7 `& G/ P; Y+ t
3).实验过程及现象:& X. J. _& I! w# \( Q1 ]
0 z% g: [. V$ s# v" N
编译生成的.elf文件,硬件接线。并连接好FS_JTAG仿真器套件。将程序编译后获得.elf文件,将该文件通过仿真器下载并运行在目标版上,终端打印信息如下所示。
8 H% [) d% S7 u- K1 \' ^
& |: _. r! g7 _. F9 O! r% ?. }" I! U9 ~3 K

5 `& C7 p4 o5 ^& c

    0 X* P0 @  N1 t; }' S: ?
  • hour 12 : min 59 : sec 17
  •         hour 12 : min 59 : sec 18
  •         hour 12 : min 59 : sec 19
  •         hour 12 : min 59 : sec 20
    % G7 F) t* `0 {6 L1 a# c  J
* k! _1 ?! g/ C' @
5 W- x1 Y2 U0 u. }4 e
复制代码

0 ~) j8 |1 g' i! \/ S* h9 }
$ ]+ s6 @. |# b; N! I
6 L3 {9 O3 K# [+ v4 O  h

% l2 U" \9 V( ?  F* ?& \
1 c. ]0 b3 K- b- n4 @
' [/ C7 Z1 q. l" q

6 J, K4 D, w& B  y3 W1 Y- O# }

: T+ d* l8 V9 w9 @7 T

9 H7 e* R  I! ]+ C# l: q4 t7 e# @

9 D- F; j" v! A9 t; h
; a9 |' l, u% a( a0 O* U: R
+ P7 l, w: |( P" D) D3 h2 H

该用户从未签到

2#
发表于 2021-10-19 14:43 | 只看该作者
RTC 可以通过STRB/LDRB 指令将8 位BCD 码数据送至CPU

该用户从未签到

3#
发表于 2021-10-19 16:25 | 只看该作者
实时时钟(RTC)单元可以通过备用电池供电
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 00:28 , Processed in 0.171875 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表