实验时钟.docx
- 文档编号:734159
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:19
- 大小:86.91KB
实验时钟.docx
《实验时钟.docx》由会员分享,可在线阅读,更多相关《实验时钟.docx(19页珍藏版)》请在冰点文库上搜索。
实验时钟
实时时钟实验
一实验目的
1.了解实时时钟在嵌入式系统中的作用。
2.掌握实时时钟的使用。
二实验内容
设计实时时钟运行程序,要求:
①实现实时时钟功能,在LED显示器上每秒显示实时时钟。
②实现时钟告警功能,按照设定时间告警喇叭发出“嘀嘀”声。
三预备知识
1.了解ADTIDE集成开发环境的基本功能。
2.学习S3C44B0X的实时时钟模块的使用。
四实验设备
1.硬件:
JX44B0教学实验箱和PC机。
2.软件:
PC机操作系统Windows98(2000、XP)和ADTIDE集成开发环境。
五实验原理
1.实时时钟在嵌入式系统中的作用
在一个嵌入式系统中,实时时钟单元可以提供可靠的时钟,包括时、分、秒和年、月、日。
即使在系统处于关机状态下它也能够正常工作(通常采用后备电池供电),它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的晶振。
2.S3C44B0X的实时时钟单元
如图1为S3C44B0X的实时时钟框图。
它具有以下特点:
图1S3C44B0X的实时时钟框图
1)时钟数据采用BCD编码;
2)能够对闰年的年月日进行自动处理;
3)具有告警功能,当系统处于关机状态时,能产生告警中断;
4)具有独立的电源输入;
5)提供毫秒级时钟中断,该中断可以用于作为嵌入式操作系统的内核时钟。
3.S3C44B0X的实时时钟寄存器
1)控制寄存器
表1控制寄存器
寄存器
地址
读/写状态
描述
复位值
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)告警控制寄存器
表2告警控制寄存器
寄存器
地址
读/写状态
描述
复位值
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)实时时钟计数器
表3实时时钟计数器
寄存器
地址
读写
描述
复位值
TICNT
0x01D7008C
R/W
实时时钟计数器
0x00000000
TICNT
位
描述
复位值
TICKINTENABLE
[7]
中断使能/禁止
0-禁止1-使能
0
TICKTIMECOUNT
[6:
0]
实时时钟计数器
0000000
4)告警时间寄存器
包括年、月、日、时、分、秒。
它们都以BCD的格式表示,地址见下表:
表4告警时间寄存器
寄存器
地址
读/写状态
描述
复位值
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实时时钟寄存器
寄存器
地址
读/写状态
描述
复位值
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的数据手册。
六实验过程
1.实验硬件组成框图如图3所示。
图3
2.程序设计流程图如图4所示。
图4
3.原程序。
/***************************************************************/
/*FILENAMEVERSION*/
/*RTC.C1.0*/
/*DESCRIPTION*/
/*JX44B0(S3C44B0X)实时时钟实验*/
/*DATASTRUCTURES*/
/*FUNCTIONS:
*/
/*在JX44B0教学实验箱进行PWM方式驱动蜂蜜器的实验*/
/*DEPENDENCIES*/
/*JX44B0-1*/
/*JX44B0-2*/
/*JX44B0-3*/
/*NAME:
*/
/*REMARKS:
*/
/*Copyright(C)2003WuhanCVTECHCO.,LTD*/
/***************************************************************/
/***************************************************************/
/*学习S3C44B0X处理器中的实时时钟处理方法:
*/
/***************************************************************/
/*包含文件*/
#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=1;
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")));
voidtest_pwm();
/***************************************************************/
//Functionname:
IsrIRQ
//Description:
非矢量方式下中断的查表处理
//中断地址表位于0x0c7fff00开始的256字节
//Returntype:
void
//Argument:
void
****************************************************************/
voidIsrIRQ()
{intcount=0;
unsignedintisr_pending;
unsignedintisr_mask=0x00000001;
unsignedintisr_mask_set=rINTMSK;
ISR_ROUTINE_ENTRYisr_routine_entry=(ISR_ROUTINE_ENTRY)0x0;
__asm__(
"STMFDSP!
{r1,r4-r8}@SAVEr1,r4-r10\n"
"nop\n");
isr_pending=(rINTPND&~isr_mask_set);
while(isr_mask)
{if(isr_pending&isr_mask)
{isr_routine_entry=(ISR_ROUTINE_ENTRY)(*(int*)(HandleADC+count));
break;
}
count+=4;
isr_mask<<=1;
}
if(isr_routine_entry)(*isr_routine_entry)();
__asm__(
"LDMFDSP!
{r1,r4-r8}@RESTOREr1,r4-r10\n"
"nop\n");
}
/***************************************************************/
//Functionname:
init_interrupt_handler
//Description:
非矢量方式下中断向量表初始化处理
//Returntype:
void
//Argument:
irq_handler
//中断处理函数入口
****************************************************************/
voidinit_interrupt_handler(unsignedintirq_handler)
{inti;
rINTPND=0x00000000;/*清除所有未决的中断*/
rI_ISPC=0x03FFFFFF;
for(i=0;i<256;i+=4)/*清除中断表*/
*(unsignedint*)(_ISR_STARTADDRESS+i)=0;
*(unsignedint*)(HandleIRQ)=irq_handler;/*设置IRQ模式处理函数*/
}
/***************************************************************/
//Functionname:
install_isr_handler
//Description:
非矢量方式下中断向量的安装
//Returntype:
void
//Argument:
irq_no,中断号
//irq_routine,中断处理函数地址
****************************************************************/
voidinstall_isr_handler(intirq_no,void*irq_routine)
{*(unsignedint*)(irq_no)=(unsignedint)irq_routine;
}
/***************************************************************/
//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&~/*使能TICK中断*/
(BIT_GLOBAL|BIT_TICK|BIT_RTC);
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=0xff;test_pwm();}
else
{*(unsignedchar*)0x2000000=0x0f;test_pwm();}
ext0_count++;
}
voidtest_pwm()
{intindex,rate;
unsignedshortdiv;
intfreq;
/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 时钟