首页 > 代码库 > RTC实时时钟

RTC实时时钟

作者:宋老师,华清远见嵌入式学院讲师。

1.1 RTC介绍

在 一个嵌入式系统中,通常采用RTC 来提供可靠的系统时间,包括时分秒和年月日等,而且要求在系统处于关机状态下它也能够正常工作(通常采用后备电池供电)。它的外围也不需要太多的辅助电 路,典型的就是只需要一个高精度的32.768kHz晶体和电阻电容等,如图10-8所示。


图10-8 RTC外接电路

1.2 RTC控制器

实时时钟(RTC)单元可以通过备用电池供电,因此,即使系统电源关闭,它也可以继续工作。RTC 可以通过STRB/LDRB 指令将8 位BCD 码数据送至CPU。这些BCD 数据包括秒、分、时、日期、星期、月和年。RTC 单元通过一个外部的32.768kHz晶振提供时钟。RTC具有定时报警的功能,如图10-9所示。RTC 控制器功能说明:


图10-9 RTC控制器

时钟数据采用BCD 编码。
        能够对闰年的年月日进行自动处理。
        具有告警功能,当系统处于关机状态时,能产生告警中断。
        具有独立的电源输入。
        提供毫秒级时钟中断,该中断可用于作为嵌入式操作系统的内核时钟。

1.3 RTC控制器寄存器详解

如表10-9所示为相关寄存器描述。

表10-9 RTC控制寄存器

RTCCON描述 复位值
保留 [31:9]保留 0
TICEN[8]嘀嗒计时器
0 = 禁止
1 = 使能
0
TICCKSEL[7:4]嘀嗒计时器子时钟源选择
4’b0000 = 32768 Hz  4’b0001 = 16384 Hz
4’b0010 = 8192 Hz   4’b0011 = 4096 Hz
4’b0100 = 2048 Hz   4’b0101 =1024 Hz
4’b0110 =512 Hz     4’b0111 =256 Hz
4’b1000 =128 Hz     4’b1001 =64 Hz
4’b1010 =32 Hz      4’b1011 =16 Hz
4’b1100 =8 Hz       4’b1101 =4 Hz
4’b1110 =2 Hz       4’b1111 =1 Hz
4’b0000
CLKRST[3]RTC时钟计数复位
0 = 不复位
1 = 复位
0
CNTSEL[2]BCD计数选择
0 = 分配 BCD 计数
1 = 保留
0
CLKSEL[1]BCD 时钟选择
0 = XTAL 1/ divided clock
1 = 保留(XTAL 供频)
0
RTCEN[0]RTC控制使能
0 = 禁止
1 = 使能
0

如表10-10所示为BCD值寄存器描述。

表10-10  BCD值寄存器

BCDSEC描述 复位值
保留 [31:7]保留 -
SECDATA[6:4]BCD 值
0~5
-
[3:0]0~9-

1.4 实验11 实时时钟RTC实验

1.4.1 实验目的

了解 RTC的硬件控制原理及设计方法;
        掌握 S5PV210 处理器的RTC模块程序设计方法(计时功能、闹钟功能、时间片功能);

1.4.2 实验原理

实时时钟(RTC)单元可以在当系统电源关闭后通过备用电池工作。RTC可以通过使用STRB/LDRB ARM操作发送 8 位二-十进制交换码(BCD)值数据给CPU。这些数据包括年、月、日、星期、时、分和秒的时间信息。根据上面阐述RTC的工作原理和RTC的寄存器的介绍。对相应的寄存器读写就可以实现修改时间和现实时间。

1.4.3 实验内容

1、 RTC设计步骤
        1) 系统复位后在 RTC 控制程序中必须设置为1来使能数据的读/写。
        2) 设置RTC当前时钟时间。
        3) 同样的在掉电前,RTCEN位应该清除为0 来预防误写入RTC寄存器中。
        4) 读取年、月、日等相关寄存器的数据显示到屏幕上。

2、 看门软件程序设计

下面的代码实现了一个设置RTC的年月日、时分秒,并将其读出的功能。

#include "s5pv210.h"

        void rtc_init(void)
        {
                RTC.RTCCON = 0X01; //时钟控制器 使能RTC控制
                RTC.BCDSEC = 0x59; //秒控制器
                RTC.BCDMIN = 0x56; //分控制器
                RTC.BCDHOUR = 0x16; //时控制器
                RTC.BCDDAY = 0x12; //日控制器
                RTC.BCDDAYWEEK = 0X05; //星期控制器
                RTC.BCDMON = 0x10; //月控制器
                RTC.BCDYEAR = 0x14; //年控制器

                RTC.RTCCON = 0; //时钟控制器 使能RTC控制
        }

        /********************main function*************************************/
        int main()
        {
                unsigned int i = 0;

                uart0_init(); //串口初始化
                rtc_init(); //RTC 初始化

                while(1) //循环打印时钟
                {
                        printf("year 20%x : mon %x : date %x :day %d ", RTC.BCDYEAR, RTC.BCDMON, RTC.BCDDAY, RTC.BCDDAYWEEK);
                        printf("hour %x : min %x : sec %x\n", RTC.BCDHOUR, RTC.BCDMIN, RTC.BCDSEC);
                        for(i = 0; i < 1500000; i++);
                }
                return 0;
        }

1.4.4 实验步骤

实验操作步骤请参考第5.4.4或7.3.4章节,

光盘实验源码路径:华清远见-CORTEXA8资料2\实验资料\1. ARM体系结构与接口技术部分\14-rtc

1.4.5 实验现象

Debug 调试点击运行按钮 ,在调试助手接收区你可以看到终端打印信息如图所示。RTC时钟的秒数据是在一秒一秒的增加。


图 打印实时时钟信息

文章来源:华清远见嵌入式学院,原文地址:http://www.embedu.org/Column/Column867.htm

更多相关嵌入式免费资料查看华清远见讲师博文>>