1、5.6 实时时钟实验5.6.1 实验目的1. 了解实时时钟在嵌入式系统中的作用;2. 掌握实时时钟的使用。5.6.2 实验内容1. 编程实现实时时钟功能,每秒显示实时时钟;2. 编程实现实时时钟告警功能。5.6.3 预备知识1. 了解ADT集成开发环境的基本功能;2. 学习S3C24X0的实时时钟模块的使用。5.6.4 实验设备1. 硬件:JXARM9-2440教学实验箱、PC机;2. 软件:PC机操作系统 Windows 98(2000、XP) ADT IDE开发环境。5.6.5 基础知识1. 实时时钟在嵌入式系统中的作用在一个嵌入式系统中,实时时钟单元可以提供可靠的时钟,包括时、分、秒和年
2、、月、日;即使在系统处于关机状态下它也能够正常工作(通常采用后备电池供电),它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的晶振。2. S3C24X0 的实时时钟单元下图为S3C24X0的实时时钟框图。它具有以下特点:图 5-12 S3C24X0 的实时时钟框图1)时钟数据采用BCD编码;2)能够对闰年的年月日进行自动处理;3)具有告警功能,当系统处于关机状态时,能产生告警中断;4)具有独立的电源输入;5)提供毫秒级时钟中断,该中断可以用于作为嵌入式操作系统的内核时钟。3. S3C24X0 的实时时钟寄存器1) 控制寄存器表 5-16 控制寄存器寄 存 器 地 址 读/写状态 描
3、述 复位值RTCCON 0x57000040 R/W 实时时钟控制寄存器 0x0RTCCON 位 描 述 复 位 值CLKRST 3 实时时钟计数器复位0不复位 1复位0CNTSEL 2 BCD计数选择,将计数器设置为BCD模式0选择BCD模式 1保留0CLKSEL 1 BCD时钟选择0将输入时钟进行1/2 15分频 1保留0RTCEN 0 RTC读写使能0禁止 1使能02) 告警控制寄存器表 5-17 告警控制寄存器寄 存 器 地 址 读/写状态 描 述 复 位值RTCALM 0x57000050 R/W 告警控制寄存器 0x00RTCALM 位 描 述 复 位 值Reserved 7 保留
4、 0ALMEN 6 时钟告警总使能/禁止0禁止 1使能0YEAREN 5 年时钟告警使能/禁止0禁止 1使能0MONREN 4 月时钟告警使能/禁止0禁止 1使能0DAYEN 3 日时钟告警使能/禁止0禁止 1使能0HOUREN 2 时时钟告警使能/禁止0禁止 1使能0MINEN 1 分时钟告警使能/禁止0禁止 1使能0SECEN 0 秒时钟告警使能/禁止0禁止 1使能03) 实时时钟计数器表 5-18 实时时钟计数器寄存器 地址 读写 描述 复位值TICNT 0x57000044 R/W 实时时钟计数器 0x00000000TICNT 位 描述 复位值TICK INT ENABLE 7 中断
5、使能/禁止0禁止 1使能0TICK TIME COUNT 6:0 实时时钟计数器 00000004) 告警时间寄存器包括年、月、日、时、分、秒。它们都以BCD的格式表示,地址见下表:表 5-19 告警时间寄存器寄存器 地址 读/写状态 描述 复位值ALMSEC 0x57000054 R/W 秒时钟告警值 0x00ALMMIN 0x57000058 R/W 分时钟告警值 0x00ALMHOUR 0x5700005C R/W 时时钟告警值 0x00ALMDAY 0x57000060 R/W 日时钟告警值 0x00ALMMON 0x57000064 R/W 月时钟告警值 0x00ALMYEAR 0x
6、57000068 R/W 年时钟告警值 0x005) 实时时钟寄存器包括年、月、日、时、分、秒。它们都以BCD的格式表示,地址见下表:表 5-20 实时时钟寄存器寄存器 地址 读/写状态 描述 复位值BCDSEC 0x57000070 R/W 秒时钟当前值 不定BCDMIN 0x57000074 R/W 分时钟当前值 不定BCDHOUR 0x57000078 R/W 时时钟当前值 不定BCDDAY 0x5700007C R/W 日时钟当前值 不定BCDDATE 0x57000080 R/W 星期值当前值 不定BCDMON 0x57000084 R/W 月时钟当前值 不定BCDYEAR 0x57
7、000088 R/W 年时钟当前值 不定注意事项:1. 以上各寄存器都只能以字节模式进行读写操作;2. 当系统使用BIG-ENDIAN模式时,各寄存器对应的地址为会有所改变,具体值请参考S3C44B0X的数据手册。4. 实验参考代码及说明:/* 包含文件 */#include “2410addr.h“#include “2410lib.h“#include “2410RTC.h“#include “interrupt.h“/* 表示日期、时间的数据结构 */typedef struct ST_DATEshort year; / 年char mon; / 月char day; / 日char w
8、eek_day; / 星期char hour; / 时char min; / 分char sec; / 秒 st_date;/* 全局变量 */int led_index = 0;int ext0_count = 0;/* functions */void rtc_tick_isr(void);void rtc_int_isr(void);/*/ Function name : rtc_set_date/ Description : 修改实时时钟当前时间、日期/ Return type : void/ Argument : p_date, 待设置的日期*/void rtc_set_date(s
9、t_date* p_date)rRTCCON = 0x01;rBCDYEAR = p_date-year;rBCDMON = p_date-mon;rBCDDAY = p_date-day;rBCDDATE = p_date-week_day;rBCDHOUR = p_date-hour;rBCDMIN = p_date-min;rBCDSEC = p_date-sec;rRTCCON = 0x00;/*/ Function name : rtc_get_date/ Description : 获取实时时钟当前时间、日期/ Return type : void/ Argument : p_da
10、te, 返回日期的指针*/void rtc_get_date(st_date* p_date)rRTCCON = 0x01;p_date-year = rBCDYEAR ;p_date-mon = rBCDMON ;p_date-day = rBCDDAY ;p_date-week_day= rBCDDATE ;p_date-hour = rBCDHOUR ;p_date-min = rBCDMIN ;p_date-sec = rBCDSEC ;rRTCCON = 0x00;/*/ Function name : rtc_tick_init/ Description : 初始化 S3C2410
11、 的 TICK 定时器/ Return type : void/ Argument : tick, 设置的 TICK 频率(时钟滴答的周期为 (1+tick)/128 秒)*/void rtc_tick_init( char tick )Irq_Request(IRQ_TICK, rtc_tick_isr);rRTCCON = 0x0; /No reset3, Merge BCD counters2, BCD clock select XTAL1, RTC Control disable0rTICNT = (tick /*TICK 中断使能,周期为(1+tick)/128 秒*/ Irq_En
12、able(IRQ_TICK); /*/ Function name : rtc_alarm_set/ Description : 设置 S3C2410 的告警时间以及方式/ Return type : void/ Argument : p_date, 告警的时间/ mode, 告警模式*/void rtc_alarm_set(st_date* p_date, unsigned char mode)Irq_Request(IRQ_RTC, rtc_int_isr);rRTCCON = 0x01;rALMYEAR = p_date-year;rALMMON = p_date-mon;rALMDAT
13、E = p_date-day;rALMHOUR = p_date-hour;rALMMIN = p_date-min;rALMSEC = p_date-sec;rRTCALM = mode;rRTCCON = 0x00;Irq_Enable(IRQ_RTC); /*/ Function name : Main/ Description : JXARM9-2440 实时时钟实验主程序/ 完成功能:/ 时钟滴答:每秒钟刷新数码管显示/ 设置当前日期、时间/ 动态刷新当前日期、时间,通过串口打印出来/ 时间告警功能:每分钟的第 5 秒告警,并进行跑马灯显示/ Return type : void/
14、Argument : void*/void Main(void)int old_index ;st_date m_date;/* 配置系统时钟 */ChangeClockDivider(2,1);U32 mpll_val = 0 ;mpll_val = (9212)/* 中断初始化 */Isr_Init();/* 初始化串口 */Uart_Init(0,115200);Uart_Select(0);/* 打印提示信息 */Uart_Printf(“n-实时时钟测试程序-n“);Uart_Printf(“n 请将 UART0 与 PC 串口进行连接,然后启动超级终端程序(115200, 8, N
15、, 1)n“);Uart_Printf(“n 实时时钟测试开始n“);/* 采用 BCD 编码,如 2004 年需要设置的值为 0x2004 */m_date.year = 0x2000+0x04 ;m_date.mon = 0x03 ;m_date.day = 0x02 ;m_date.week_day = 0x02 ;m_date.hour = 0x15 ;m_date.min = 0x40 ;m_date.sec = 0x00 ;/* 修改当前日期和时间 */rtc_set_date(m_date.sec = 0x05 ;/* 设置告警的时间及方式,0x41 表示使能 RTC 告警,以及
16、使能秒时钟告警 */rtc_alarm_set(rtc_tick_init(127);old_index = led_index;Uart_Printf(“rnrn“);while(1)if(old_index != led_index) /* 每隔一秒更新一次数据 */rtc_get_date(old_index = led_index;Uart_Printf( /* 时钟数据为 BCD 码格式,以 16 进制显示 */“bbbbbbbb%02x:%02x:%02x“, m_date.hour, m_date.min, m_date.sec);/*/ Function name : rtc_
17、tick_isr/ Description : TICK 中断处理程序,程序中设置每秒钟引发一次中断/ Return type : int/ Argument : void*/void rtc_tick_isr(void)Irq_Clear(IRQ_TICK); /* 清除 TICK 中断 */led_index+;/*/ Function name : rtc_int_isr/ Description : rtc 中断处理程序,程序中设置每分钟的第 5 秒引发该中断/ Return type : int/ Argument : void*/void rtc_int_isr(void)Irq_Clear(IRQ_RTC); /*清除 RTC 中断 */ext0_count+;Uart_Printf(“rnAlarmrn “);本实验测试S3C24X0的实时时钟功能,包括:1) 时钟滴答功能测试,通过LED显示TIME TICK;2) 时间告警功能测试。