实验时钟Word文档下载推荐.docx
《实验时钟Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《实验时钟Word文档下载推荐.docx(19页珍藏版)》请在冰点文库上搜索。
R/W
实时时钟控制寄存器
0x0
位
CLKRST
[3]
实时时钟计数器复位
0-不复位1-复位
CNTSEL
[2]
BCD计数选择,将计数器设置为BCD模式
0-选择BCD模式1-保留
CLKSEL
[1]
BCD时钟选择
0-将输入时钟进行1/215分频1-保留
RTCEN
[0]
RTC读写使能
0-禁止1-使能
2)告警控制寄存器
表2告警控制寄存器
复位值
RTCALM
0x01D70050
告警控制寄存器
0x00
复位值
Reserved
[7]
保留
ALMEN
[6]
时钟告警总使能/禁止
YEAREN
[5]
年时钟告警使能/禁止
MONREN
[4]
月时钟告警使能/禁止
DAYEN
日时钟告警使能/禁止
HOUREN
时时钟告警使能/禁止
MINEN
分时钟告警使能/禁止
SECEN
秒时钟告警使能/禁止
3)实时时钟计数器
表3实时时钟计数器
寄存器
地址
读写
描述
TICNT
0x01D7008C
实时时钟计数器
0x00000000
TICKINTENABLE
中断使能/禁止
TICKTIMECOUNT
[6:
0]
0000000
4)告警时间寄存器
包括年、月、日、时、分、秒。
它们都以BCD的格式表示,地址见下表:
表4告警时间寄存器
ALMSEC
0x01D70054
秒时钟告警值
ALMMIN
0x01D70058
分时钟告警值
ALMHOUR
0x01D7005C
时时钟告警值
ALMDAY
0x01D70060
日时钟告警值
ALMMON
0x01D70064
月时钟告警值
ALMYEAR
0x01D70068
年时钟告警值
5)实时时钟寄存器
表5实时时钟寄存器
BCDSEC
0x01D70070
秒时钟当前值
不定
BCDMIN
0x01D70074
分时钟当前值
BCDHOUR
0x01D70078
时时钟当前值
BCDDAY
0x01D7007C
日时钟当前值
BCDDATE
0x01D70080
星期值当前值
BCDMON
0x01D70084
月时钟当前值
BCDYEAR
0x01D70088
年时钟当前值
注意事项:
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"
44blib.h"
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:
****************************************************************/
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)();
LDMFDSP!
{r1,r4-r8}@RESTOREr1,r4-r10\n"
}
init_interrupt_handler
非矢量方式下中断向量表初始化处理
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模式处理函数*/
install_isr_handler
非矢量方式下中断向量的安装
irq_no,中断号
//irq_routine,中断处理函数地址
voidinstall_isr_handler(intirq_no,void*irq_routine)
{*(unsignedint*)(irq_no)=(unsignedint)irq_routine;
rtc_set_date
修改实时时钟当前时间、日期
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;
rtc_get_date
获取实时时钟当前时间、日期
p_date,返回日期的指针
voidrtc_get_date(st_date*p_date)
p_date->
year=rBCDYEAR;
mon=rBCDMON;
day=rBCDDAY;
week_day=rBCDDATE;
hour=rBCDHOUR;
min=rBCDMIN;
sec=rBCDSEC;
rtc_tick_init
初始化S3C44B0的TICK定时器
tick,设置的TICK频率(时钟滴答的周期为(1+tick)/128秒)
voidrtc_tick_init(chartick)
rTICINT=(tick&
0x7f)|0x80;
/*TICK中断使能,周期为(1+tick)/128秒*/
rtc_alarm_set
设置S3C44B0的告警时间以及方式
p_date,告警的时间
//mode,告警模式
voidrtc_alarm_set(st_date*p_date,unsignedcharmode)
{rRTCCON=0x01;
rALMYEAR=p_date->
rALMMON=p_date->
rALMDAY=p_date->
rALMHOUR=p_date->
rALMMIN=p_date->
rALMSEC=p_date->
rRTCALM=mode;
Main
测试程序主函数
//完成功能:
//时钟滴答:
每秒钟刷新数码管显示
//设置当前日期、时间
//动态刷新当前日期、时间,通过串口打印出来
//时间告警功能:
每分钟的第5秒告警,并进行跑马灯显示
int
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(&
old_index=led_index;
Uart_Printf(/*时钟数据为BCD码格式,以16进制显示*/
"
\r%02x:
%02x:
%02x"
m_date.hour,m_date.min,m_date.sec);
};
rtc_tick_isr
TICK中断处理程序,程序中设置每秒钟引发一次中断
voidrtc_tick_isr(void)
{
rI_ISPC=BIT_TICK;
/*清除时钟滴答中断标志*/
*((unsignedchar*)0x02000006)=0x00;
*(unsignedchar*)0x02000004=seg7table[(led_index)%10];
led_index++;
rtc_int_isr
//Description:
rtc中断处理程序,程序中设置每分钟的第5秒引发该中断
voidrtc_int_isr(void)
{rI_ISPC=BIT_RTC;
/*清除RTC中断*/
if(ext0_count&
1)
{*(unsignedchar*)0x2000000=0xff;
test_pwm();
else
{*(unsignedchar*)0x2000000=0x0f;
ext0_count++;
voidtest_pwm()
{intindex,rate;
unsignedshortdiv;
intfreq;
/