|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
实时时钟的缩写是RTC(Real_time clock)。RTC 是集成电路,通常称为时钟芯片。RTC通常情况下需要外接32.768kHz晶体,匹配电容、备份电源等元件。RTC除了I/O口的定位不同,还有功能上的区别,比如与mcu的接口,现在常用的是I2C接口(距离短,可以与其他器件共用)还有RAM的数量、静态功耗大小、中断的数量,特别是精度的区别。 RTC的精度可以说与温度有很大的关系,而温度会影响晶体的频率。本章介绍的是集成在芯片内部的时钟功能模块。) h& v N9 e: f, `7 h" v" P
1 RTC介绍
9 i% a: c0 N9 J+ A9 `7 }在一个嵌入式系统中,通常采用RTC 来提供可靠的系统时间,包括时分秒和年月日等,而且要求在系统处于关机状态下它也能够正常工作(通常采用后备电池供电)。它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的32.768kHz晶体和电阻电容等,如图1所示。8 t2 _, S% {. j y" Z
![]()
9 h) o/ @ Q* Z2 RTC控制器
5 x g ^9 f: X7 w6 t
* G( }0 j7 k: w/ I% T2 m实时时钟(RTC)单元可以通过备用电池供电,因此,即使系统电源关闭,它也可以继续工作。RTC 可以通过STRB/LDRB 指令将8 位BCD 码数据送至CPU。这些BCD 数据包括秒、分、时、日期、星期、月和年。RTC 单元通过一个外部的32.768kHz晶振提供时钟。6 L7 r; R! {& D2 Z
5 {# H& d& K7 r% A) p ● 时钟数据采用BCD 编码。7 c: x3 x, Q1 U' m2 D/ w
● 能够对闰年的年月日进行自动处理。1 a. M; N: G/ ?' R# r& R' c: |
● 具有告警功能,当系统处于关机状态时,能产生告警中断。6 l$ y' q' J+ | d
● 具有独立的电源输入。
& o/ \2 F) l; q ● 提供毫秒级时钟中断,该中断可用于作为嵌入式操作系统的内核时钟。
/ F% H. N( ^7 E* u; T
1 o' X. W* z# v3 T, I8 B: {! r3 RTC控制器寄存器详解( q4 m1 T/ W) y5 J$ ^
" I* r) K4 _5 V8 K2 L7 R
如表3所示为相关寄存器描述。3 E$ i) T" E! ^0 V6 R
![]() . ^4 O$ w i4 r0 n' l, E
如表4所示为BCD秒寄存器描述。6 E# n% L' O5 b( c
![]()
7 j7 Y$ D6 \( C( b" w. x3 R% N如表5所示为BCD分钟寄存器描述。
: o; M* o! J5 t![]()
) @2 h0 Y+ }, z* o: R7 ~如表6所示为BCD小时寄存器描述。, V6 l& A: d: t
![]() % B7 l, G% {" x3 ~+ c; s% S
如表7所示为BCD日期寄存器描述。% O; N" H3 [0 L( w# [2 R' U
![]()
- F( D6 N! \0 R! E# G如表8所示为BCD星期寄存器描述。
! b1 R% ~$ m, L$ `![]()
( l" N, t% J# C3 |9 J+ e如表9所示为BCD月寄存器描述。 a, w* s k) d6 B5 e6 R; [
![]() + | h, {2 V) ]9 N& Q
如表10所示为BCD年寄存器描述。( S: e* A/ H% g* s* |2 g, J
p* n, l' ^$ } h
, L/ w7 f5 o5 R5 B3 p4 RTC应用示例
% V8 W' a% T* Y" Y& v0 X# f! ]
m* c4 q x4 {& h1).相关寄存器定义
; }3 R- A; F4 E. g$ T/ g, L. r+ N2 J, n$ D/ J9 x6 y7 f% N. W
7 J/ G% t5 X+ S, l7 p! @, p2 k0 K
/ d2 z% }6 U" d+ f
. \; J- a4 _ Y- d5 ^; T9 E- 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)- b0 ~/ |1 ~4 u, n8 J9 u
& s' T% q! g- k/ p2 D) y9 m1 l
2 A9 r0 R2 G) q' y* J复制代码
5 `) N( i7 c* ^ N9 t# l. G' T9 M2 U( ~0 g& f
7 B# F3 B+ N/ k' l
2).主程序
! B5 _2 f. @8 P: I# {& ` G1 A, @ ]$ S! ]5 Z
下面的代码实现了一个将RTC的年月日、时分秒读出的功能,可以将注释掉的代码打开来复位值。
- S) q" v7 p( h0 z( M! @# T' I9 G) F3 M/ I5 _
x6 D3 V, L0 V, T- \# f+ ]$ p# |. [* h0 Q. \+ t6 M; I( h
2 y4 j( ?9 m' n8 b8 Y W
- 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;
- }
0 p. e8 j/ X1 N! U; X. _. A
& Z$ f$ J4 J3 w$ l/ f. J h% M3 o$ O5 Z7 ]( S6 L# g8 d
复制代码
& n0 o& Y6 N2 N$ \0 x$ Q( b
( i6 A) k) B; D0 d* l3 \' b6 F; w4 n% A& P' B
3).实验过程及现象:
" d) [* M/ j; h# X- R9 P; S" ^4 ]
$ ~! A4 K$ d' z& j编译生成的.elf文件,硬件接线。并连接好FS_JTAG仿真器套件。将程序编译后获得.elf文件,将该文件通过仿真器下载并运行在目标版上,终端打印信息如下所示。
; M+ k9 ]' q- R( _0 P1 ^
+ D5 C( l* I5 n" `' }
, X9 O# K9 I8 U' }2 [$ z7 v; r0 d8 F( O% o& z; O4 a. P. q
$ O6 ~( Y$ A9 Y- hour 12 : min 59 : sec 17
- hour 12 : min 59 : sec 18
- hour 12 : min 59 : sec 19
- hour 12 : min 59 : sec 20
7 O2 w0 K) b; l* D
/ d, T% Q. }/ g7 I! x: _3 k
# ] y6 Y; x) U) w0 A复制代码: m9 i: O/ F3 y
+ @1 x5 ]% B: P' r* V
* w: Q4 }7 N, o& i) v
4 _/ F/ W, P/ Z& i9 d/ B+ ^% | 4 z( O, ~, E( P8 `& A9 f
+ g/ V e' c: e" Y ?
* {: @/ e/ `8 }
+ S1 C: P' I$ T4 h , `; M, `3 {* L; Z }: X
6 j) c+ I3 B, Q9 k. T5 j 6 _4 N# [ S8 Z+ m- s
?- q, e: U( N O3 C, S/ t+ K7 c
|
|