当前位置:文档之家› 嵌入式实时时钟实验

嵌入式实时时钟实验

实时时钟实验1 实验目的1. 了解实时时钟在嵌入式系统中的作用;2. 掌握实时时钟的使用。

2 实验内容1. 编程实现实时时钟功能,每秒显示实时时钟;2. 编程实现实时时钟告警功能。

3 预备知识1. 了解ADT IDE集成开发环境的基本功能;2. 学习S3C44B0X的实时时钟模块的使用。

4 实验设备1. 硬件:JX44B0教学实验箱、PC机;2. 软件:PC机操作系统 Windows 98(2000、XP) + ADT IDE集成开发环境。

5 基础知识1. 实时时钟在嵌入式系统中的作用在一个嵌入式系统中,实时时钟单元可以提供可靠的时钟,包括时、分、秒和年、月、日。

即使在系统处于关机状态下它也能够正常工作(通常采用后备电池供电),它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的晶振。

2. S3C44B0X的实时时钟单元如图5-12为S3C44B0X的实时时钟框图。

它具有以下特点:图5-12 S3C44B0X的实时时钟框图1)时钟数据采用BCD编码;2)能够对闰年的年月日进行自动处理;3)具有告警功能,当系统处于关机状态时,能产生告警中断;4)具有独立的电源输入;5)提供毫秒级时钟中断,该中断可以用于作为嵌入式操作系统的内核时钟。

3. S3C44B0X的实时时钟寄存器1) 控制寄存器表5-16 控制寄存器2) 告警控制寄存器表5-17 告警控制寄存器3) 实时时钟计数器表5-18 实时时钟计数器4) 告警时间寄存器包括年、月、日、时、分、秒。

它们都以BCD的格式表示,地址见下表:表5-19 告警时间寄存器5) 实时时钟寄存器包括年、月、日、时、分、秒。

它们都以BCD的格式表示,地址见下表:表5-20 实时时钟寄存器注意事项:1. 以上各寄存器都只能以字节模式进行读写操作;2. 当系统使用BIG-ENDIAN模式时,各寄存器对应的地址为会有所改变,具体值请参考S3C44B0X的数据手册。

4. 实验参考代码及说明本实验测试S3C44B0X的实时时钟功能,包括:1) 时钟滴答功能测试,通过LED显示TIME TICK;2) 时间告警功能测试。

/* 包含文件 */#include "44b.h"#include "44blib.h"#include "rtc.h"/* 表示日期、时间的数据结构 */typedef struct ST_DATE{short year; // 年char mon; // 月char day; // 日char week_day; // 星期char hour; // 时char min; // 分char sec; // 秒} st_date;typedef (*ISR_ROUTINE_ENTRY)(void);/* 全局变量 */int led_index = 0;int ext0_count = 0;/* 数码管显示码表,请参考led实验 */unsigned char seg7table[16] ={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,};/* functions */void rtc_tick_isr(void);void rtc_int_isr(void);void IsrIRQ() __attribute__ ((interrupt("IRQ")));/************************************************** ***************************// Function name : rtc_set_date// Description : 修改实时时钟当前时间、日期// Return type : void// Argument : p_date, 待设置的日期*************************************************** **************************/void rtc_set_date(st_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_date, 返回日期的指针*************************************************** **************************/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 : 初始化S3C44B0的TICK定时器// Return type : void// Argument : tick, 设置的TICK频率(时钟滴答的周期为 (1+tick)/128秒)*************************************************** **************************/void rtc_tick_init( char tick ){rRTCCON = 0x01;rTICINT = (tick&0x7f)|0x80; /*TICK 中断使能,周期为(1+tick)/128秒*/rRTCCON = 0x00;}/************************************************** ***************************// Function name : rtc_alarm_set// Description : 设置S3C44B0的告警时间以及方式// Return type : void// Argument : p_date, 告警的时间// mode, 告警模式*************************************************** **************************/void rtc_alarm_set(st_date* p_date, unsigned char mode){rRTCCON = 0x01;rALMYEAR = p_date->year;rALMMON = p_date->mon;rALMDAY = p_date->day;rALMHOUR = p_date->hour;rALMMIN = p_date->min;rALMSEC = p_date->sec;rRTCALM = mode;rRTCCON = 0x00;}/************************************************** ***************************// Function name : Main// Description : 测试程序主函数// 完成功能:// 时钟滴答:每秒钟刷新数码管显示// 设置当前日期、时间// 动态刷新当前日期、时间,通过串口打印出来// 时间告警功能:每分钟的第5秒告警,并进行跑马灯显示// Return type : int// Argument : void*****************************************************************************/int Main(void){int old_index ;st_date m_date;/* 采用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);m_date.sec = 0x05 ;/* 设置告警的时间及方式,0x41表示使能RTC告警,以及使能秒时钟告警 */rtc_alarm_set(&m_date, 0x41);rtc_tick_init(127);rINTCON=0x7; /* Non-vect,IRQ disable,FIQ disable */init_interrupt_handler((unsigned int)IsrIRQ); install_isr_handler(HandleTICK,(void*)rtc_tick_isr);install_isr_handler(HandleRTC,(void*)rtc_int_isr);rINTMOD=0x0; /*设置所有中断为IRQ 模式*/rINTMSK=0x07ffffff &~(BIT_GLOBAL|BIT_TICK|BIT_RTC); /*使能TICK中断*/ rINTCON=0x5; /*打开IRQ模式的中断*/old_index = led_index;Uart_Printf("\r\n");while(1){if(old_index != led_index) /* 每隔一秒更新一次数据*/{rtc_get_date(&m_date);old_index = led_index;Uart_Printf( /* 时钟数据为BCD码格式,以16进制显示 */"\r%02x:%02x:%02x", m_date.hour,m_date.min, m_date.sec);}};}/************************************************** ***************************// Function name : rtc_tick_isr// Description : TICK中断处理程序,程序中设置每秒钟引发一次中断// Return type : int// Argument : void*************************************************** **************************/void rtc_tick_isr(void){rI_ISPC=BIT_TICK; /*清除时钟滴答中断标志*/*((unsigned char*) 0x02000006) = 0x00;*(unsigned char*)0x02000004 =seg7table[led_index%10];led_index++;}/************************************************** ***************************// Function name : rtc_int_isr// Description : rtc中断处理程序,程序中设置每分钟的第5秒引发该中断// Return type : int// Argument : void*****************************************************************************/void rtc_int_isr(void){rI_ISPC=BIT_RTC; /*清除RTC中断*/if(ext0_count&1)*(unsigned char*)0x2000000 = 0x0f;else*(unsigned char*)0x2000000 = 0xff;ext0_count++;}实验A 时钟滴答功能测试1) 首先需设置TICK的周期,在例程中设置的是1秒,并打开TIME TICK中断rTICINT = 0x7f|0x80;计算公式:T = ( 1 + 0x7f ) / 128 秒2) 注册中断服务例程使用install_isr_handler(HandleRTC,(void*)rtc_int_isr)将中断服务例程的地址填写到中断地址表中;rtc_int_isr函数为RTC TIMETICK的处理例程,在该例程中我们首先要清除中断标志,接着可以刷新LED的显示,在例程中我们使用了一个全局变量来实现LED显示的更新。

相关主题