1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,机电工程学院自控系 侯叶,第七章,S3C2440A,的实时时钟,主要内容,7.1,实时时钟在嵌入式系统中的作用,7.2,实时时钟操作,7.3,实时时钟相关寄存器,7.1,实时时钟在嵌入式系统中的作用,在一个嵌入式系统中,实时时钟单元可以提供可靠的时钟,包括时、分、秒和年、月、日。即使系统处于关机状态下,它也能够正常工作(通常采用后备电池供电)。,在嵌入式系统中,实时时钟主要用来显示时间。实时时钟(,RTC,)可以通过使用,STRB/LDRB ARM,操作发送,8,位二,-,十进制,BCD,值数据给,CPU
2、这些数据包括年、月、日、星期、时、分和秒的时间信息。,RTC,单元工作在外部,32.768kHz,晶振并且可以执行闹钟功能。,特性:,BCD,数:年、月、日、星期、时、分和秒,闰年发生器,闹钟功能:闹钟中断或从掉电模式唤醒,已解决的,2000,年问题,独立电源引脚(,RTCVDD,),支持,RTOS,内核时钟节拍(,tick,)的毫秒节拍时间中断,7.2,实时时钟操作,闰年发生器:,闰年发生器能够基于,BCDDATE,、,BCDMON,和,BCDYEAR,的数据,从,28,、,29,、,30,或,31,中决定哪个是每月的最后日。此模块决定最后日时会考虑闰年因素。,8,位计数器只能够表示为,
3、2,个,BCD,数字,因此其不能判决“,00”,年(最后两位数为,0,的年份)是否为闰年。例如,其不能判别,1900,和,2000,年。请注意:,1900,年不是闰年,而,2000,年是闰年。,7.2,实时时钟操作,读,/,写寄存器:,为了写,RTC,模块中的,BCD,寄存器,,RTCCON,寄存器的位,0,必须设置为高。为了显示年、月、日、时、分和秒,,CPU,应该分别读取,RTC,模块中的各寄存器中的数据。然而因为读取了多个寄存器,可能存在,1,秒的偏差。例如,当用户从,BCDYEAR,到,BCDMIN,寄存器读取,其结果假定为,2059,(年)、,12,(月)、,31,(日)、,23,(
4、时)和,59,(分)。当用户读取,BCDSEC,寄存器并且值的范围是从,1,到,59,(秒),这没有问题,但是如果该值为,0,秒,则年、月、日、时和分可能要变为,2060,(年)、,1,(月)、,1,(日)、,0,(时)和,0,(分),因为存在着,1,秒的偏差。在这种情况中,如果,BCDSEC,为,0,则应该重新从,BCDYEAR,到,BCDSEC,读取。,7.2,实时时钟操作,备用电池操作:,RTC,逻辑可以由备用电池驱动,如果系统电源关闭,由,RTCVDD,引脚供电给,RTC,模块。当关闭了电源,则应该阻塞掉,CPU,和,RTC,逻辑的接口,而备用电池只驱动振荡电路和,BCD,计数器以最小
5、化功耗。,闹钟功能:,RTC,在掉电模式中或正常工作模式中通过指定时间产生一个闹钟信号。在正常工作模式中,只激活闹钟中断(,INT_RTC,)信号。在掉电模式中,除了,INT_RTC,被激活之外还激活电源管理唤醒(,PMWKUP,)信号。,实时时钟控制(,RTCCON,)寄存器,节拍时间计数(,TICNT,)寄存器,RTC,闹钟控制(,RTCALM,)寄存器,闹钟秒数据(,ALMSEC,)寄存器,闹钟分数据(,ALMMIN,)寄存器,闹钟时数据(,ALMHOUR,)寄存器,闹钟日数据(,ALMDATE),寄存器,闹钟月数据(,ALMMON,)寄存器,闹钟年数据(,ALMYEAR,)寄存器,BC
6、D,秒(,BCDSEC,)寄存器,BCD,分(,BCDMIN,)寄存器,BCD,时(,BCDHOUR,)寄存器,BCD,日(,BCDDATE,)寄存器,BCD,星期(,BCDDAY,)寄存器,BCD,月(,BCDMON,)寄存器,BCD,年(,BCDYEAR,)寄存器,7.3,实时时钟相关寄存器,7.3,实时时钟相关寄存器,实时时钟控制(,RTCCON,)寄存器,7.3,实时时钟相关寄存器,节拍时间计数(,TICNT,)寄存器,7.3,实时时钟相关寄存器,RTC,闹钟控制(,RTCALM,)寄存器,7.3,实时时钟相关寄存器,闹钟秒数据(,ALMSEC,)寄存器,7.3,实时时钟相关寄存器,闹
7、钟分数据(,ALMMIN,)寄存器,7.3,实时时钟相关寄存器,闹钟时数据(,ALMHOUR,)寄存器,7.3,实时时钟相关寄存器,闹钟日数据(,ALMDATE,)寄存器,7.3,实时时钟相关寄存器,闹钟月数据(,ALMMON,)寄存器,7.3,实时时钟相关寄存器,闹钟年数据(,ALMYEAR,)寄存器,7.3,实时时钟相关寄存器,BCD,秒(,BCDSEC,)寄存器,7.3,实时时钟相关寄存器,BCD,分(,BCDMIN,)寄存器,7.3,实时时钟相关寄存器,BCD,时(,BCDHOUR,)寄存器,7.3,实时时钟相关寄存器,BCD,日(,BCDDATE,)寄存器,7.3,实时时钟相关寄存器
8、BCD,星期(,BCDDAY,)寄存器,7.3,实时时钟相关寄存器,BCD,月(,BCDMON,)寄存器,7.3,实时时钟相关寄存器,BCD,年(,BCDYEAR,)寄存器,实验五、系统时钟实验,一、实验目的,了解实时时钟在嵌入式系统中的作用;,掌握实时时钟的使用。,二、实验仪器,JXARM9-2440,教学实验箱、,ADT1000,仿真器和,ADT IDE,集成开发环境、串口连接线、,PC,机。,三、实验原理,在一个嵌入式系统中,实时时钟单元可以提供可靠的时钟,包括时分秒和年月日;即使在系统处于关机状态下它也能够正常工作(通常采用后备电池供电)。,/*,包含文件*,/,#include d
9、ef.h,#include 2410lib.h,#include option.h,#include 2410addr.h,#include interrupt.h,/*,表示日期、时间的数据结构*,/,typedef struct ST_DATE,short year;/,年,charmon;/,月,charday;/,日,charweek_day;/,星期,charhour;/,时,charmin;/,分,charsec;/,秒,st_date;,/*,全局变量*,/,int led_index=0;,int ext0_count=0;,/*functions*/,void rtc_tic
10、k_isr(void)_attribute_(interrupt(IRQ);,void rtc_int_isr(void)_attribute_(interrupt(IRQ);,/*,/Function name:rtc_set_date,/Description:,修改实时时钟当前时间、日期,/Return type:void,/Argument:p_date,待设置的日期,*,/,void rtc_set_date(st_date*p_date),rRTCCON =0 x01;,rBCDYEAR=p_date-year;,rBCDMON =p_date-mon;,rBCDDAY =p_da
11、te-day;,rBCDDATE=p_date-week_day;,rBCDHOUR=p_date-hour;,rBCDMIN =p_date-min;,四、参考程序,rBCDSEC =p_date-sec;,rRTCCON =0 x00;,/*,/Function name:rtc_get_date,/Description:,获取实时时钟当前时间、日期,/Return type:void,/Argument:p_date,返回日期的指针,*,/,void rtc_get_date(st_date*p_date),rRTCCON =0 x01;,p_date-year=rBCDYEAR;,p
12、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 =0 x00;,/*,/Function name:rtc_tick_init,/Description:,初始化,S3C2440,的,TICK,定时器,/Return type:void,/Argument:tick,设置的,TICK,频率,(,时钟滴答的周期为,(1+tick)/128,秒,),*/,void rtc
13、tick_init(char tick),Irq_Request(IRQ_TICK,rtc_tick_isr);,rRTCCON =0 x0;/No reset3,Merge BCD counters2,BCD clock select XTAL1,RTC Control disable0,rTICNT =(tick/*TICK,中断使能,周期为,(1+tick)/128,秒*,/,Irq_Enable(IRQ_TICK);,/*,/Function name:rtc_alarm_set,/Description:,设置,S3C2440,的告警时间以及方式,/Return type:void
14、/Argument:p_date,告警的时间,/mode,告警模式,*,/,void rtc_alarm_set(st_date*p_date,unsigned char mode),Irq_Request(IRQ_RTC,rtc_int_isr);,rRTCCON =0 x01;,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 =0 x00
15、Irq_Enable(IRQ_RTC);,/*,/Function name:Main,/Description:JXARM9-2440,实时时钟实验主程序,/,完成功能,:,时钟滴答,:,每秒钟刷新数码管显示,/,设置当前日期、时间,/,动态刷新当前日期、时间,通过串口打印出来,/,时间告警功能,:,每分钟的第,5,秒告警,并进行跑马灯显示,/Return type:void,/Argument :void,*/,void Main(void),int old_index;,st_date m_date;,/*,配置系统时钟*,/,ChangeClockDivider(2,1);,U32
16、 mpll_val=0;,mpll_val=(9212)|(112),/*,中断初始化*,/,Isr_Init();,/*,初始化端口*,/,Port_Init();,/*,初始化串口*,/,Uart_Init(0,115200);,Uart_Select(0);,/*,打印提示信息*,/,PRINTF(n-,实时时钟测试程序,-n);,PRINTF(n,请将,UART0,与,PC,串口进行连接,然后启动超级终端程序,(115200,8,N,1)n);,PRINTF(n,实时时钟测试开始,n);,/*,采用,BCD,编码,如,2004,年需要设置的值为,0 x2004*/,/TODO,/*,修
17、改当前日期和时间*,/,rtc_set_date(,m_date.sec=0 x05;,/TODO,/*,设置告警的时间及方式,,0 x41,表示使能,RTC,告警,以及使能秒时钟告警*,/,rtc_tick_init(127);,old_index=led_index;,PRINTF(rnrn);,while(1),if(old_index!=led_index)/*,每隔一秒更新一次数据*,/,rtc_get_date(,old_index=led_index;,PRINTF(/*,时钟数据为,BCD,码格式,以,16,进制显示*,/,bbbbbbbb%02x:%02x:%02x,m_da
18、te.hour,m_date.min,m_date.sec);,;,/*,/Function name:rtc_tick_isr,/Description:TICK,中断处理程序,程序中设置每秒钟引发一次中断,/Return type:int,/Argument:void,*/,void rtc_tick_isr(void),Irq_Clear(IRQ_TICK);/*,清除,TICK,中断*,/,/*(unsigned char*)0 x02000006)=0 x00;,/*(unsigned char*)0 x02000004=seg7tableled_index%10;,led_inde
19、x+;,/*,/Function name:rtc_int_isr,/Description:rtc,中断处理程序,程序中设置每分钟的第,5,秒引发该中断,/Return type:int,/Argument:void,*/,void rtc_int_isr(void),Irq_Clear(IRQ_RTC);/*,清除,RTC,中断*,/,/if(ext0_count&1),/*(unsigned char*)0 x2000000=0 x0f;,/else,/*(unsigned char*)0 x2000000=0 xff;,ext0_count+;,PRINTF(rnAlarmrn );,
20、五、实验内容及步骤,(一)学习与分析实验例程,学习时钟寄存器的设置;,(二),1,、补充程序,设置与修改当前的日期和时间;实现闹钟告警功能(设,05S,时报警),使能秒时钟告警;,2,、将时分秒在数码管上显示出来。,3,、自行开发。,步骤:,参照模板工程,rtc(modulesrtcrtc.apj),,新建一个工程,rtc,,添加相应的文件,并修改,rtc,的工程设置;,创建,main.c,并加入到工程,rtc,中;,根据内容编程。编译,rtc,,下载程序并运行,通过超级终端和数码管看输出结果。,六、按要求写出实验报告,1,、实验目的,2,、实验原理,3,、实验内容,4,、实验步骤,5,、实验程序,6,、结果及分析,7,、实验总结,






