|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
实时时钟的缩写是RTC(Real_time clock)。RTC 是集成电路,通常称为时钟芯片。RTC通常情况下需要外接32.768kHz晶体,匹配电容、备份电源等元件。RTC除了I/O口的定位不同,还有功能上的区别,比如与mcu的接口,现在常用的是I2C接口(距离短,可以与其他器件共用)还有RAM的数量、静态功耗大小、中断的数量,特别是精度的区别。 RTC的精度可以说与温度有很大的关系,而温度会影响晶体的频率。本章介绍的是集成在芯片内部的时钟功能模块。$ Q8 m5 O y2 s( Q1 @
1 RTC介绍
* o$ E/ i: V+ K) j% c# K- i在一个嵌入式系统中,通常采用RTC 来提供可靠的系统时间,包括时分秒和年月日等,而且要求在系统处于关机状态下它也能够正常工作(通常采用后备电池供电)。它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的32.768kHz晶体和电阻电容等,如图1所示。8 }9 p" a' L, U8 J; @2 ~- M& H
![]()
5 [2 P' p1 D7 n1 V2 RTC控制器
! f; P5 i" V: T, j' d/ D0 R
5 h( E4 M: d$ L) b# m! H实时时钟(RTC)单元可以通过备用电池供电,因此,即使系统电源关闭,它也可以继续工作。RTC 可以通过STRB/LDRB 指令将8 位BCD 码数据送至CPU。这些BCD 数据包括秒、分、时、日期、星期、月和年。RTC 单元通过一个外部的32.768kHz晶振提供时钟。
* p& n% u5 B- n* @9 m: s7 I* D' _
3 q4 _5 U0 M$ d- k# a( Q ● 时钟数据采用BCD 编码。
& h$ m# _' a p/ d9 q# J ● 能够对闰年的年月日进行自动处理。0 V8 u+ M" L5 S" ]2 f
● 具有告警功能,当系统处于关机状态时,能产生告警中断。
+ K$ D. g- V$ q7 ~3 [+ ~+ [ ● 具有独立的电源输入。
5 i! D1 G- @' z ● 提供毫秒级时钟中断,该中断可用于作为嵌入式操作系统的内核时钟。
+ m' A& j2 z, q9 r' k
( \2 ]6 O: t" {; t3 RTC控制器寄存器详解3 B; S7 A- G- }
* p/ u b1 v* U9 E$ F; M
如表3所示为相关寄存器描述。: k; b) R! m3 @2 @" e) L3 b, O
![]()
( s m" i9 R7 m( y* z0 ~7 p如表4所示为BCD秒寄存器描述。
6 E- c! E( Q( @: ^0 A g( _9 F![]()
5 f) V8 f1 v4 J: } T如表5所示为BCD分钟寄存器描述。+ T; k9 \0 e) V
![]()
6 z( h+ Y7 R8 }6 Q0 N2 M) i* X如表6所示为BCD小时寄存器描述。
6 [7 n/ h5 q% B, N% Q( k/ t$ J![]() 4 ]- I m9 ]$ r" v
如表7所示为BCD日期寄存器描述。
% n1 `( n' T/ A1 X# p& h- C+ b![]()
5 z1 X D S( A& j+ ]' ~$ t如表8所示为BCD星期寄存器描述。- ~! N+ L% S! k' j1 Y0 a; _. B
![]() / [& o0 S9 M+ I! D+ L* u( L; Q
如表9所示为BCD月寄存器描述。
, v( R7 U8 l# f5 q v4 Y* {![]() - @% I2 q2 O+ [4 r0 _$ H
如表10所示为BCD年寄存器描述。% N+ `/ A! ~8 P; _6 h3 L
![]()
: E$ _2 T% o# h+ Y& d7 D$ x0 F/ o' K# [. _
4 RTC应用示例. L" Y; h$ o! h! Q4 N5 V8 N6 ?! L
/ e; J$ F5 J( z. N+ T1).相关寄存器定义
j8 x% r! P5 K+ f% }+ Y0 m4 x
d% p2 c/ {' p
) ~4 q/ k: W% @+ R* o/ Z/ k! J4 w6 o( R
8 m) F" w7 a2 B- 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) U9 S, V+ w0 O9 y
8 l! F) n* f0 g+ r1 p4 U3 Y
B C4 [: Q4 R
复制代码
3 S) S; r U2 y+ s" ~2 G# U/ P) y; G3 d! K& w
: |9 u7 V% S0 E4 ?
2).主程序
6 I# @4 H. i T! ~) M Y& ?6 c _! e; H1 y0 J
下面的代码实现了一个将RTC的年月日、时分秒读出的功能,可以将注释掉的代码打开来复位值。
! C* _/ G. |5 U, S" e5 }% `! g, |1 {( W0 @% R
9 _6 j5 K1 w0 f) I: G. w/ j! e: L: @9 M& B# H% ^$ h
/ n. v( ^3 k$ K
- 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;
- }8 @3 A( D5 A: q% x" p
1 C7 V& _3 G' t3 C8 _0 l, o
0 N, S1 {7 L0 P7 ]) T7 D" L+ I$ o复制代码1 Q2 a `* C6 Q+ R/ d$ I( U
; R' d0 B8 `! k
6 m }& V8 f% O d/ l2 n G3).实验过程及现象:
; l9 N9 e$ c% a1 p+ o/ Q
* O4 V0 W) c) n) ~9 h1 ~3 f H编译生成的.elf文件,硬件接线。并连接好FS_JTAG仿真器套件。将程序编译后获得.elf文件,将该文件通过仿真器下载并运行在目标版上,终端打印信息如下所示。
! D4 h7 ^6 i0 }( r& s4 Y5 V: x5 a
: E: C! n2 A( G& @! q1 q
u6 U; }" s6 T: c& d" v3 H7 N
6 r6 @+ P, K {6 b( r- hour 12 : min 59 : sec 17
- hour 12 : min 59 : sec 18
- hour 12 : min 59 : sec 19
- hour 12 : min 59 : sec 20* E; ^$ m5 v v0 s
9 Q4 }( Y5 z- l
0 i& _# k; J& y. `' \复制代码
6 Q, f4 @3 U7 W. u$ o% D& B: P. o, J3 B1 J! {. F% ?
& l) a3 Y2 z9 p2 O
0 E* o( H! H4 A! H9 I4 k
3 z- g" L( j2 S( L0 l( W
- D5 [" K. E/ H' T* ] 7 g& m( G! ]9 F6 b% m; _3 s6 u
% d4 [6 k$ Z6 W. K
8 Y& }* E( i( \+ m3 t+ P0 R: ^ ' w& `- f/ d. Q i
7 c" b* L7 E9 ?8 E8 [0 P% b2 x* j# w- \6 ~ i3 }
|
|