实时时钟参考程序概要.docx
《实时时钟参考程序概要.docx》由会员分享,可在线阅读,更多相关《实时时钟参考程序概要.docx(13页珍藏版)》请在冰豆网上搜索。
实时时钟参考程序概要
5.6实时时钟实验
5.6.1实验目的
1.了解实时时钟在嵌入式系统中的作用;
2.掌握实时时钟的使用。
5.6.2实验内容
1.编程实现实时时钟功能,每秒显示实时时钟;
2.编程实现实时时钟告警功能。
5.6.3预备知识
1.了解AD■集成开发环境的基本功能;
2.学习S3C24X啲实时时钟模块的使用。
5.6.4实验设备
1.硬件:
JXARM9-244嗽学实验箱、PC机;
2.软件:
PC机操作系统Windows98(2000、XP)+ADTIDE开发环境。
5.6.5基础知识
1.实时时钟在嵌入式系统中的作用
在一个嵌入式系统中,实时时钟单元可以提供可靠的时钟,包括时、分、秒和年、月、日;即使在系统处于关机状态下它也能够正常工作(通常采用后备电池供电),它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的晶振。
2.S3C24X0的实时时钟单元
F图为S3C24X0勺实时时钟框图。
它具有以下特点:
1)时钟数据采用BCD编码;
2)能够对闰年的年月日进行自动处理;
3)具有告警功能,当系统处于关机状态时,能产生告警中断;
4)具有独立的电源输入;
5)提供毫秒级时钟中断,该中断可以用于作为嵌入式操作系统的内核时钟。
3.S3C24X0的实时时钟寄存器
1)控制寄存器
表5-16控制寄存器
寄存器
地址
读/写状态
描述
复位值
RTCCON
0x57000040
R/W
实时时钟控制寄存器
0x0
RTCCON
位
描述
复位值
CLKRST
[3]
实时时钟计数器复位
0—不复位1—复位
0
CNTSEL
[2]
BC[计数选择,将计数器设置为BC模式
0—选择BC[模式1—保留
0
CLKSEL
[1]
BCD寸钟选择
0—将输入时钟进行1/215分频1—保留
0
RTCEN
[0]
RT(读写使能
0—禁止1—使能
0
2)告警控制寄存器
表5-17告警控制寄存器
寄存器
地址
读/写状态
描述
复位值
RTCALM
0x57000050
R/W
告警控制寄存器
0x00
RTCALM
位
描
述
复位值
Reserved
[7]
保留
0
ALMEN
⑹
时钟告警总使能/禁止
0—禁止1—使能
0
YEAREN
[5]
年时钟告警使能/禁止
0—禁止1—使能
0
MONREN
⑷
月时钟告警使能/禁止
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
0x57000044
R/W
实时时钟计数器
0x00000000
TICNT
位
描述
复位值
TICKINTENABLE
[7]
中断使能/禁止
0—禁止1—使能
0
TICKTIMECOUNT
[6:
0]
实时时钟计数器
0000000
4)告警时间寄存器
包括年、月、日、时、分、秒。
它们都以BCD勺格式表示,地址见下表:
表5-19告警时间寄存器
寄存器
地址
读/写状态
描述
复位值
ALMSEC
0x57000054
R/W
秒时钟告警值
0x00
ALMMIN
0x57000058
R/W
分时钟告警值
0x00
ALMHOUR
0x5700005C
R/W
时时钟告警值
0x00
ALMDAY
0x57000060
R/W
日时钟告警值
0x00
ALMMON
0x57000064
R/W
月时钟告警值
0x00
ALMYEAR
0x57000068
R/W
年时钟告警值
0x00
5)实时时钟寄存器
包括年、月、日、时、分、秒。
它们都以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
0x57000088
R/W
年时钟当前值
不定
注意事项:
1.以上各寄存器都只能以字节模式进行读写操作;
2.当系统使用BIG-ENDIAN模式时,各寄存器对应的地址为会有所改变,具体值请参考S3C44B0X的数据手册。
4.实验参考代码及说明:
/*包含文件*/
#include"2410addr.h"
#include"2410lib.h"
#include"2410RTC.h"
#include"interrupt""
/*表示日期、时间的数据结构*/
typedefstructST_DATE
{
shortyear;//
年
charmon;//
月
charday;//
日
charweek_day;//
星期
charhour;//
时
charmin;//
分
charsec;//
秒
}st_date;
/*全局变量*/
intled_index=0;
intext0_count=0;
/*functions*/
voidrtc_tick_isr(void);
voidrtc_int_isr(void);
/*****************************************************************************
//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
//Description
//Returntype
:
rtc_get_date
获取实时时钟当前时间、日期
:
void
//Argument:
p_date,
返回日期的指针
**/
p_date->yearp_date->monp_date->day
***************************************************************************
voidrtc_get_date(st_date*p_date)
{
rRTCCON=0x01;
rBCDYEAR;
=rBCDMON
=rBCDDAY;
p_date->week_day=p_date->hourp_date->minp_date->sec
rBCDDATE;rBCDHOUR;=rBCDMIN=rBCDSEC
rRTCCON=0x00;
}
/*****************************************************************************
//Functionname:
rtc_tick_init
//Description:
初始化S3C2410的TICK定时器
//Returntype:
void
//Argument:
tick,设置的TICK频率(时钟滴答的周期为(1+tick)/128秒)
*****************************************************************************/
voidrtc_tick_init(chartick)
{
lrq_Request(IRQ_TICK,rtc_tick_isr);
rRTCCON=0x0;
//Noreset[3],MergeBCDcounters[2],BCDclockselect
XTAL[1],RTCControldisable[0]
rTICNT=(tick&0x7f)|0x80;
/*TICK中断使能,周期为(1+tick)/128秒*/
Irq_Enable(IRQ_TICK);
}
/*****************************************************************************
//Functionname:
rtc_alarm_set
//Description:
设置S3C2410的告警时间以及方式
//Returntype:
void
//Argument:
p_date,告警的时间
//mode,告警模式
*****************************************************************************/
voidrtc_alarm_set(st_date*p_date,unsignedcharmode)
{
Irq_Request(IRQ_RTC,rtc_int_isr);
rRTCCON=0x01;
rALMYEAR=p_date->year;rALMMON=p_date->mon;rALMDATE=p_date->day;rALMHOUR=p_date->hour;rALMMIN=p_date->min;rALMSEC=p_date->sec;
rRTCALM=mode;
rRTCCON=0x00;
lrq_Enable(IRQ_RTC);
}
•'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k
//Functionname
:
Main
//Description
:
JXARM9-2440实时时钟实验主程序
//
完成功能:
//
时钟滴答:
每秒钟刷新数码管显示
//
设置当前日期、时间
//
动态刷新当前日期、时间,通过串口打印岀来
//
时间告警功能:
每分钟的第5秒告警,并进行跑马灯显示
//Returntype
:
void
//Argument
:
void
***************************************************************************
voidMain(void)
{
intold_index;
st_datem_date;
/*配置系统时钟*/
ChangeClockDivider(2,1);
U32mpll_val=0;
mpll_val=(92<<12)|(1vv4)|
(1);
ChangeMPllValue((mpll_val>>12)&0xff,(mpll_val>>4)&0x3f,mpll_val&3);
/*中断初始化*/
/*初始化串口*/
Uart_lnit(0,115200);
Uart_Select(O);
/*打印提示信息*/
Uart_Printf("\n---实时时钟测试程序---\n");
N,1)\n");
Uart_Printf("\n请将UART与PC串口进行连接,然后启动超级终端程序(115200,8,
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);
m_date.sec=0x05;
/*设置告警的时间及方式,0x41表示使能RTC告警,以及使能秒时钟告警*/
rtc_alarm_set(&m_date,0x41);
rtc_tick_init(127);old_index=led_index;
Uart_Printf("\r\n\r\n");
while
(1)
{
if(old」ndex!
=Ied_index)/*每隔一秒更新一次数据*/
{
rtc_get_date(&m_date);
old_index=led_index;
Uart_Printf(/*时钟数据为BCD码格式,以16进制显示*/
"\b\b\b\b\b\b\b\b%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)
{
lrq_Clear(IRQ_TICK);/*清除TICK中断*/
led_index++;
}
/*****************************************************************************
//Functionname:
rtc_int_isr
//Description:
rtc中断处理程序,程序中设置每分钟的第5秒引发该中断
//Returntype:
int
//Argument:
void
*****************************************************************************/
voidrtc_int_isr(void)
{
Irq_Clear(IRQ_RTC);/*清除RTC中断*/
ext0_count++;
Uart_Printf("\r\nAlarm\r\n");
}
本实验测试S3C24X啲实时时钟功能,包括:
1)时钟滴答功能测试,通过LED显示TIMETICK;
2)时间告警功能测试。