|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
实时时钟的缩写是RTC(Real_time clock)。RTC 是集成电路,通常称为时钟芯片。RTC通常情况下需要外接32.768kHz晶体,匹配电容、备份电源等元件。RTC除了I/O口的定位不同,还有功能上的区别,比如与mcu的接口,现在常用的是I2C接口(距离短,可以与其他器件共用)还有RAM的数量、静态功耗大小、中断的数量,特别是精度的区别。 RTC的精度可以说与温度有很大的关系,而温度会影响晶体的频率。本章介绍的是集成在芯片内部的时钟功能模块。3 P: `# P- ~( T
1 RTC介绍
* h, n8 `$ C1 T- {4 P! {在一个嵌入式系统中,通常采用RTC 来提供可靠的系统时间,包括时分秒和年月日等,而且要求在系统处于关机状态下它也能够正常工作(通常采用后备电池供电)。它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的32.768kHz晶体和电阻电容等,如图1所示。
7 k# v# t1 o3 i0 t' ^! E9 n- D![]()
" y- i6 ] Z# v r* T2 RTC控制器/ Q8 O8 ]# O8 ?; N" Y: n3 R
* W0 K8 q. O( F% l. O
实时时钟(RTC)单元可以通过备用电池供电,因此,即使系统电源关闭,它也可以继续工作。RTC 可以通过STRB/LDRB 指令将8 位BCD 码数据送至CPU。这些BCD 数据包括秒、分、时、日期、星期、月和年。RTC 单元通过一个外部的32.768kHz晶振提供时钟。
5 r. R& x7 c. x4 x- |0 O
3 J$ I: E5 n3 l. }! e* q. ~& u4 `" Y ● 时钟数据采用BCD 编码。
2 |8 y% |6 [) T ● 能够对闰年的年月日进行自动处理。( k2 m" z3 {! E' w. d
● 具有告警功能,当系统处于关机状态时,能产生告警中断。9 x* C( _7 |' K/ f$ J
● 具有独立的电源输入。2 |% O* T. q, H
● 提供毫秒级时钟中断,该中断可用于作为嵌入式操作系统的内核时钟。
7 z5 ^2 Z5 ^' ~. f9 R
& e' C2 T/ ?& h. `8 g3 RTC控制器寄存器详解
! }- L3 L0 H* W/ Q& v& Q7 T% a
: x3 W* }5 ]- _. b9 W6 I3 c如表3所示为相关寄存器描述。9 T$ O' e( m9 h! y
![]()
# j; f2 H: N/ k) M+ n# v% s如表4所示为BCD秒寄存器描述。( m2 _4 M" W+ |. E; z! c6 p
![]()
3 O7 R" Q+ x: T! W, e% N7 ~0 j如表5所示为BCD分钟寄存器描述。6 ]- M& o8 h2 b" g/ s
![]() 4 V% B; s2 _8 P# B
如表6所示为BCD小时寄存器描述。) Q6 I$ N# t- {
![]()
" u6 r4 u( U: N9 t如表7所示为BCD日期寄存器描述。
( k' ~/ J* ~5 d6 r& h' [7 H/ p% C![]() " v5 a. R2 W% x$ z5 s. M* U
如表8所示为BCD星期寄存器描述。
2 O9 S) c0 Y! ?3 J, \. F. T![]()
: z6 D8 G7 U; e+ a+ i u如表9所示为BCD月寄存器描述。
( N2 B- S: ~+ {0 Z0 w% B/ s![]()
( R/ j3 \$ ~$ a如表10所示为BCD年寄存器描述。4 J$ M3 F( I) O- z
! ~+ P, j* ^8 s
! s4 p4 ]6 `* E% z. ?" Z! ^, B4 RTC应用示例
- Z6 E( f7 t/ |( Z0 E$ d3 d
8 Q8 B' [' f# U8 R/ F- V0 k1).相关寄存器定义% W1 V9 M6 [3 l! T
1 @/ C6 o# x. r
1 \7 X9 Z# S6 d. J, z4 V
7 J t2 n: L* ]/ p8 z- i# }+ }
6 E# f: n& D8 ~, X. \& M- 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)
8 b0 g( {" `" M! l0 { ) q' Q# L; u5 S
0 R0 M3 h' t9 S; a, d( E复制代码
, N( d- W9 f B- Z9 c5 S) Z/ ]
- n9 P6 U9 p, `" I3 F; v
+ L% F" ?6 q7 L1 Y0 w0 D2).主程序( I5 W2 S8 H" c
3 _% V, D, O; R" r- l
下面的代码实现了一个将RTC的年月日、时分秒读出的功能,可以将注释掉的代码打开来复位值。, W. F2 S# I% ~( m2 P
" m9 n& [# v4 V/ t4 d* ~# u* T
( i1 n; X+ A! W' [4 {
+ W* S6 R' b5 n. k, D9 ~8 C3 ^6 c: {& g$ d" ?
- 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;
- }
* L6 H0 a# t9 {0 w- F* `7 x1 w* w9 K : M$ y( p3 M) k1 D
3 g! [, {+ g, Q% C$ j
复制代码3 C' [) L9 o& E, Z Y. `
' m, ]: V$ L7 l2 x! D
# I9 D5 x* B* i+ z
3).实验过程及现象:0 b7 D* s+ L. F0 k, f- T
% r5 D& f2 l* T. o编译生成的.elf文件,硬件接线。并连接好FS_JTAG仿真器套件。将程序编译后获得.elf文件,将该文件通过仿真器下载并运行在目标版上,终端打印信息如下所示。: M: a0 w5 s/ w* n1 @: }; d- B
6 E! j9 e' f$ p# i+ b& T, @* j2 M: E1 V' q0 G8 w# p
3 q7 x4 s M$ \1 o
; q, \% S* _+ c$ \6 H- hour 12 : min 59 : sec 17
- hour 12 : min 59 : sec 18
- hour 12 : min 59 : sec 19
- hour 12 : min 59 : sec 206 F# T# F! z+ ?1 E' p( i; C1 M3 q I
$ } d- s2 T% |
2 R2 D4 ?$ ~- x! p& \0 ?8 `! g复制代码
9 w) G6 b0 }0 _6 g0 ~2 K
5 i/ k9 }! ]3 @
" t$ c3 ]/ A' J- [2 s4 d! | ( U( r7 j$ D2 {
- \1 n/ N. h- ] ( X& T4 Z2 }6 Y) Q: O
, A( V( ?4 q2 ?/ |2 \2 q' o 4 }" p& `0 t; B! Y, [
8 s" P9 Z) W6 t: ^: z& S' Y4 d5 \
) D* j* h) s% q+ _ . J4 z" |" ^7 @. X) |8 J) ]7 v9 }; p
9 i/ Z% y2 l. _( T/ F |
|