嵌入式实时时钟实验.docx
- 文档编号:15568662
- 上传时间:2023-07-05
- 格式:DOCX
- 页数:17
- 大小:44.10KB
嵌入式实时时钟实验.docx
《嵌入式实时时钟实验.docx》由会员分享,可在线阅读,更多相关《嵌入式实时时钟实验.docx(17页珍藏版)》请在冰点文库上搜索。
嵌入式实时时钟实验
实时时钟实验
1实验目的
1.了解实时时钟在嵌入式系统中的作用;
2.掌握实时时钟的使用。
2实验内容
1.编程实现实时时钟功能,每秒显示实时时钟;
2.编程实现实时时钟告警功能。
3预备知识
1.了解ADTIDE集成开发环境的基本功能;
2.学习S3C44B0X的实时时钟模块的使用。
4实验设备
1.硬件:
JX44B0教学实验箱、PC机;
2.软件:
PC机操作系统Windows98(2000、XP)+ADTIDE集成开发环境。
5基础知识
1.实时时钟在嵌入式系统中的作用
在一个嵌入式系统中,实时时钟单元可以提供可靠的时钟,包括时、分、秒和年、月、日。
即使在系统处于关机状态下它也能够正常工作(通常采用后备电池供电),它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的晶振。
2.S3C44B0X的实时时钟单元
如图5-12为S3C44B0X的实时时钟框图。
它具有以下特点:
图5-12S3C44B0X的实时时钟框图
1)时钟数据采用BCD编码;
2)能够对闰年的年月日进行自动处理;
3)具有告警功能,当系统处于关机状态时,能产生告警中断;
4)具有独立的电源输入;
5)提供毫秒级时钟中断,该中断可以用于作为嵌入式操作系统的内核时钟。
3.S3C44B0X的实时时钟寄存器
1)控制寄存器
表5-16控制寄存器
寄存器
地址
读/写状态
描述
复位值
RTCCON
0x01D70040
R/W
实时时钟控制寄存器
0x0
RTCCON
位
描述
复位值
CLKRST
[3]
实时时钟计数器复位
0-不复位1-复位
0
CNTSEL
[2]
BCD计数选择,将计数器设置为BCD模式
0-选择BCD模式1-保留
0
CLKSEL
[1]
BCD时钟选择
0-将输入时钟进行1/215分频1-保留
0
RTCEN
[0]
RTC读写使能
0-禁止1-使能
0
2)告警控制寄存器
表5-17告警控制寄存器
寄存器
地址
读/写状态
描述
复位值
RTCALM
0x01D70050
R/W
告警控制寄存器
0x00
RTCALM
位
描述
复位值
Reserved
[7]
保留
0
ALMEN
[6]
时钟告警总使能/禁止
0-禁止1-使能
0
YEAREN
[5]
年时钟告警使能/禁止
0-禁止1-使能
0
MONREN
[4]
月时钟告警使能/禁止
0-禁止1-使能
0
DAYEN
[3]
日时钟告警使能/禁止
0-禁止1-使能
0
HOUREN
[2]
时时钟告警使能/禁止
0-禁止1-使能
0
MINEN
[1]
分时钟告警使能/禁止
0-禁止1-使能
0
SECEN
[0]
秒时钟告警使能/禁止
0-禁止1-使能
0
3)实时时钟计数器
表5-18实时时钟计数器
寄存器
地址
读写
描述
复位值
TICNT
0x01D7008C
R/W
实时时钟计数器
0x00000000
TICNT
位
描述
复位值
TICKINTENABLE
[7]
中断使能/禁止
0-禁止1-使能
0
TICKTIMECOUNT
[6:
0]
实时时钟计数器
0000000
4)告警时间寄存器
包括年、月、日、时、分、秒。
它们都以BCD的格式表示,地址见下表:
表5-19告警时间寄存器
寄存器
地址
读/写状态
描述
复位值
ALMSEC
0x01D70054
R/W
秒时钟告警值
0x00
ALMMIN
0x01D70058
R/W
分时钟告警值
0x00
ALMHOUR
0x01D7005C
R/W
时时钟告警值
0x00
ALMDAY
0x01D70060
R/W
日时钟告警值
0x00
ALMMON
0x01D70064
R/W
月时钟告警值
0x00
ALMYEAR
0x01D70068
R/W
年时钟告警值
0x00
5)实时时钟寄存器
包括年、月、日、时、分、秒。
它们都以BCD的格式表示,地址见下表:
表5-20实时时钟寄存器
寄存器
地址
读/写状态
描述
复位值
BCDSEC
0x01D70070
R/W
秒时钟当前值
不定
BCDMIN
0x01D70074
R/W
分时钟当前值
不定
BCDHOUR
0x01D70078
R/W
时时钟当前值
不定
BCDDAY
0x01D7007C
R/W
日时钟当前值
不定
BCDDATE
0x01D70080
R/W
星期值当前值
不定
BCDMON
0x01D70084
R/W
月时钟当前值
不定
BCDYEAR
0x01D70088
R/W
年时钟当前值
不定
注意事项:
1.以上各寄存器都只能以字节模式进行读写操作;
2.当系统使用BIG-ENDIAN模式时,各寄存器对应的地址为会有所改变,具体值请参考S3C44B0X的数据手册。
4.实验参考代码及说明
本实验测试S3C44B0X的实时时钟功能,包括:
1)时钟滴答功能测试,通过LED显示TIMETICK;
2)时间告警功能测试。
/*包含文件*/
#include"44b.h"
#include"44blib.h"
#include"rtc.h"
/*表示日期、时间的数据结构*/
typedefstructST_DATE
{
shortyear;//年
charmon;//月
charday;//日
charweek_day;//星期
charhour;//时
charmin;//分
charsec;//秒
}st_date;
typedef(*ISR_ROUTINE_ENTRY)(void);
/*全局变量*/
intled_index=0;
intext0_count=0;
/*数码管显示码表,请参考led实验*/
unsignedcharseg7table[16]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,
};
/*functions*/
voidrtc_tick_isr(void);
voidrtc_int_isr(void);
voidIsrIRQ()__attribute__((interrupt("IRQ")));
/*****************************************************************************
//Functionname:
rtc_set_date
//Description:
修改实时时钟当前时间、日期
//Returntype:
void
//Argument:
p_date,待设置的日期
*****************************************************************************/
voidrtc_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;
}
/*****************************************************************************
//Functionname:
rtc_get_date
//Description:
获取实时时钟当前时间、日期
//Returntype:
void
//Argument:
p_date,返回日期的指针
*****************************************************************************/
voidrtc_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;
}
/*****************************************************************************
//Functionname:
rtc_tick_init
//Description:
初始化S3C44B0的TICK定时器
//Returntype:
void
//Argument:
tick,设置的TICK频率(时钟滴答的周期为(1+tick)/128秒)
*****************************************************************************/
voidrtc_tick_init(chartick)
{
rRTCCON=0x01;
rTICINT=(tick&0x7f)|0x80;/*TICK中断使能,周期为(1+tick)/128秒*/
rRTCCON=0x00;
}
/*****************************************************************************
//Functionname:
rtc_alarm_set
//Description:
设置S3C44B0的告警时间以及方式
//Returntype:
void
//Argument:
p_date,告警的时间
//mode,告警模式
*****************************************************************************/
voidrtc_alarm_set(st_date*p_date,unsignedcharmode)
{
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;
}
/*****************************************************************************
//Functionname:
Main
//Description:
测试程序主函数
//完成功能:
//时钟滴答:
每秒钟刷新数码管显示
//设置当前日期、时间
//动态刷新当前日期、时间,通过串口打印出来
//时间告警功能:
每分钟的第5秒告警,并进行跑马灯显示
//Returntype:
int
//Argument:
void
*****************************************************************************/
intMain(void)
{
intold_index;
st_datem_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,IRQdisable,FIQdisable*/
init_interrupt_handler((unsignedint)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);
}
};
}
/*****************************************************************************
//Functionname:
rtc_tick_isr
//Description:
TICK中断处理程序,程序中设置每秒钟引发一次中断
//Returntype:
int
//Argument:
void
*****************************************************************************/
voidrtc_tick_isr(void)
{
rI_ISPC=BIT_TICK;/*清除时钟滴答中断标志*/
*((unsignedchar*)0x02000006)=0x00;
*(unsignedchar*)0x02000004=seg7table[led_index%10];
led_index++;
}
/*****************************************************************************
//Functionname:
rtc_int_isr
//Description:
rtc中断处理程序,程序中设置每分钟的第5秒引发该中断
//Returntype:
int
//Argument:
void
*****************************************************************************/
voidrtc_int_isr(void)
{
rI_ISPC=BIT_RTC;/*清除RTC中断*/
if(ext0_count&1)
*(unsignedchar*)0x2000000=0x0f;
else
*(unsignedchar*)0x2000000=0xff;
ext0_count++;
}
实验A时钟滴答功能测试
1)首先需设置TICK的周期,在例程中设置的是1秒,并打开TIMETICK中断
rTICINT=0x7f|0x80;
计算公式:
T=(1+0x7f)/128秒
2)注册中断服务例程
使用install_isr_handler(HandleRTC,(void*)rtc_int_isr)将中断服务例程的地址填写到中断地址表中;
rtc_int_isr函数为RTCTIMETICK的处理例程,在该例程中我们首先要清除中断标志,接着可以刷新LED的显示,在例程中我们使用了一个全局变量来实现LED显示的更新。
代码如下:
rI_ISPC=BIT_TICK;/*清除时钟滴答中断标志*/
*((U8*)0x02000006)=0x3E;/*使能第一个数码管*/
*((U8*)0x02000004)=seg7table[led_index&0xF];
led_index++;
3)输入当前时间,并通过串口显示时间的运行情况
设置当前时间,即向各个寄存器赋初值;
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;
4)每隔1秒读取一下时钟数据,并通过串口显示该数据
old_index=led_index;/*保存当前的TICK计数*/
Uart_Printf("\r\n");/*串口显示换行*/
while
(1)
{
/*每隔一秒更新一次数据*/
if(old_index!
=led_index)
{
rtc_get_date(&m_date);
old_index=led_index;
/*实时时钟数据为BCD码格式,以16进制显示*/
Uart_Printf("\r%02x:
%02x:
%02x",m_date.hour,m_date.min,m_date.sec);
}
};
实验B时间告警功能测试
1)首先设置告警时间,如下例程设置每分钟的第5秒告警
m_date.sec=0x05;
rtc_alarm_set(&m_date,0x41);
模式0x41表示使能RTC告警,以及使能秒时钟告警;
2)注册中断例程,打开中断
install_isr_handler(HandleRTC,(void*)rtc_int_isr);
rINTMSK=(rINTMSK&~(BIT_GLOBAL|BIT_RTC));
3)中断服务例程中清除中断事件;
rI_ISPC=BIT_RTC;/*清除时钟告警中断*/
if(alarm_count&1)
*(unsignedchar*)0x2000000=0x0f;
else
*(unsignedchar*)0x2000000=0xff;
alarm_count++;
注意事项:
1.程序最好使用中断方式处理TIMETICK及告警;同时需要正确设置中断的工作方式,并使能相应中断;
2.读取的时钟数据格式是BCD码;在输入初始时间时也应该以BCD码的格式输入;
3.在使用RTC的告警功能时,我们可以通过设置告警屏蔽位来实现不同周期的告警功能,比如:
只使能秒时钟告警,那么将在隔1分钟告警一次;如果同时使能分时钟,则每小时告警一次等;如果要实现周期小于1分钟的告警,则需要每次告警后同时重置秒告警时间;
6实验步骤
1.参照模板工程rtc(modules\rtc\rtc.apj),新建一个工程rtc,添加相应的文件,并修改rtc的工程设置;
2.创建rtc.c并加入到工程rtc中;
3.编写程序每秒钟读取时钟滴答;
4.编写程序实现时间告警功能;
5.编译rtc,下载程序并运行,通过超级终端看输出结果。
7实验报告要求
1.简述RTC的作用;
2.画出在串口显示时钟的流程图。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 实时 时钟 实验