S3C2410处理器RTC程序设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计
题目S3C2410处理器RTC程序设计
学院计算机科学与信息工程学院
专业自动化
班级2007级1班
学生姓名
指导教师
2010 年12 月12 日
课程设计任务书
学生姓名:专业班级:2007级自动化一班
指导教师:工作单位:
题目: S3C2410处理器RTC程序设计
已知技术参数和设计要求:
1、嵌入式处理器选择S3C2410X;
2、RTC模块包括年、月、日、时、分、秒;
3、RTC模块使用晶振为32.768KHz;
4、系统有定时报警功能。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1、设计S3C2410X最小系统;
2、配置RTC模块的特殊功能寄存器;
3、提供RTC功能方框图;
4、提供完成的软件设计;
5、不少于3000字的课程设计报告。

时间安排:
2010~2011学年第1学期13~14周
指导教师签名: 2010年 11月 11日
教研室主任签名: 2010年 11月 12日
课程设计成绩评定表
学院:计信班级:07自动化1班学生姓名:学号:
指导教师评定成绩:
指导教师签名:2010年12月12日
S3C2410处理器RTC程序设计
摘要:实时时钟RTC器件是一种能提供日历/时钟及数据存储等功能的专用集成电路,常用作各种计算机系统的时钟信号源和参数设置存储电路。

特别是在各种嵌入式系统中用于记录事件发生的时间和相关信息,因此在当今的电子设备中应用非常广泛。

本次设计通过理解实时时钟的功能及各种特殊功能寄存器来实现对RTC的测试。

此设计基于S3C2410嵌入式开发平台,并结合PC的超级终端完成RTC模块的初始化、时间显示(显示于超级终端)、时间设置、重置测试、报警测试、时钟滴答测试等功能。

通过程序入口点对S3C2410X处理器及串口进行初始化,在主函数中调用不同功能的子函数以实现不同的测试。

关键词:S3C2410X RTC模块初始化测试函数
前言:
实时时钟的缩写是RTC(Real Time Clock). RTC 是集成电路,通常称为时钟芯片。

RTC通常为8PIN,有SOP8、MSOP8、TSSOP8等多种封装。

其中有6个I/O口的功能是一样的,分为:晶体接口2PIN、MCU接口2PIN、主电源1PIN、地1PIN。

这样就剩下2个I/O的功能定义被区分开了。

所以会有许多的RTC型号。

RTC除了I/O口的定位不同,还有功能上的区别,以及RAM的数量、静态功耗大小、中断的数量,特别是精度的区别。

RTC的精度与温度有很大的关系,而温度会影响晶体的频率。

所以就产生实时时钟的衍生产品:时钟模块(内置晶体、电容、电池等等),其精度可保持在每天误差小于0.50秒。

但时钟模块相比时钟芯片而言会高出许多。

RTC最重要的功能是提供到2099年内的日历功能。

对于时间来说,无论快慢都是误差,而匹配电容在RTC的外围器件上具有非常重要的作用,它可以适当修正晶体与RTC之间匹配问题。

RTC能够在系统电源关闭后依靠后备电池供电工作。

RTC可以将8位数据通过STRB/LDRB ARM 指令以BCD码的形式传给CPU,这些数据包括秒、分、小时、日期、星期几、月、和年。

RTC单元在外部32.768KHz的晶振下工作,并可以执行报警功能。

目录
一、 RTC功能描述 (1)
1.1读/写寄存器 (1)
1.2后备电池 (2)
1.3报警(闹钟)功能 (2)
1.4时间片中断 (2)
1.5重置计数功能 (2)
二、RTC特殊功能寄存器 (2)
2.1实时时钟控制寄存器 (3)
2.2时间片计数器寄存器 (3)
2.3RTC报警控制寄存器 (3)
2.4重置寄存器 (4)
2.5报警数据寄存器 (4)
2.6时钟数据寄存器 (5)
三、RTC程序设计 (6)
3.1硬件初始化 (6)
3.2功能设计 (7)
3.3设计程序代码 (7)
四、设计总结 (14)
参考文献 (14)
一、 RTC功能描述
S3C2410X的RTC方框图如图一所示。

XTIrtc与XTOrtc是连接外部晶振的两个引脚,它们连接32.768KHz的晶振,为RTC内部提供频率输入。

215时钟分频器负责对从晶振外部输入的信号进行分频,分频精度为215。

图一:RTC框图
闰年发生器按照从日期、月、年得来的BCD数据决定一个月的最后一天是28、29、30还是31号,也就是计算是否是闰年。

RTC最重要的功能就是显示时间,是通过读/写寄存器实现的。

要显示秒、分、时、日期、月、年,CPU必须读取存于BCDSEC、BCDMIN、BCDHOUR、BCDDAY、BCDDATE、BCDMON与BCDYEAR寄存器中得值。

时间的设置也是通过以上的寄存器实现的,即以上寄存器是可读写的。

1.1读/写寄存器
访问RTC模块的寄存器,首先要设RTCCON的位0为1。

CPU通过读取RTC模块中寄存器BCDSEC、BCDMIN、BCDHOUR、BCDDAY、BCDDATE、BCDMON和BCDYEAR的值,得到当前的相应时间值。

然而,由于多个寄存器依次读出,所以有可能产生错误。

比如:用户依次读取2059(年)、12(月)、31(日)、23(时)、59(分),当读取BCDSEC寄存器中的值为1-59时,没有任何问题。

但是,当秒数为0时,当前时间和日期就变成了2060年1月1日0时0分。

这种情况下,用户应该重新读取年份到分钟的值。

1.2后备电池
RTC模块可以通过引脚RTCVDD使用后备电池供电。

在掉电模式下,RTC依然能够正常工作,此时,RTC模块通过外部的电池工作。

后备电池只需驱动晶振和BCD 计数器,从而达到最小的功耗。

1.3报警(闹钟)功能
报警发生器可以根据具体的时间决定是否报警。

在正常模式报警中断信号(ALMINT)被激活。

在休眠模式,功耗管理的唤醒信号(PMWKUP)和报警中断信号(ALMINT)同时激活。

RTC报警寄存器(RTCALM)决定报警功能的使能/屏蔽和完成报警时间检测。

1.4时间片中断
RTC时间片中断用于中断请求,寄存器TICNT有一个中断使能位和中断计数。

中断计数值取值n范围1-127。

当中断计数值为0时,产生时间片中断。

中断周期按如下计算:周期=(n+1)/128 秒。

RTC时钟可以用作RTOS(Real Time Operation System, 实时操作系统)的内核时间片,如果时间片是由RTC时钟片生成,则RTOS的时间相关功能与实时时钟同步。

1.5重置计数功能
重置计数功能通过RTC的重置寄存器RTCRST执行,可以实现30、40和50秒步长重新计数。

例如,当前时间是23:37:47,并且步长选择40秒,在重置时,当前时间改为23:38:00。

二、RTC特殊功能寄存器
所有RTC寄存器斗都是字节型的,必须使用字节型访问指令(STRB、LDRB)或者字符型指令访问。

在小端模式和大端模式中所采用的地址不同,这里采用小端模式的地址。

2.1实时时钟控制寄存器
实时时钟控制寄存器RTCCON如表一所列,共有四位。

各位定义如下:
[3]CLKRST:RTC时钟计数器复位。

0=不复位;1=复位。

[2]CNTSEL:BCD计数器选择。

0=合并BCD计数器;1=保留(即分离BCD计数器)。

[1]CLKSEL:BCD时钟选择。

0=采用XTAL的1/215作为时钟;1=保留(XTAL时钟仪用于测试)。

[0]RTCEN:RTC控制使能。

0=禁止;1=使能。

RTCEN控制BCD寄存器的读/写使能,CLKSEL、CNTSEL和CLKRST用于测试。

RTCEN 控制着CPU和RTC的所有接口,为了使能数据可读/写,在系统复位后RTCEN应该置1。

2.2时间片计数器寄存器
时间片计数器寄存器TICNT如表二所列,用来设置时间片的计数器。

各位定义如下:
[7]TICK INT EN:时间片中断使能。

0=禁止;1=使能。

[6:0]TICK TIME COUNT:时间片计数值(1-127)。

计数值在内部递减,工作时不能读取计数器值。

2.3RTC报警控制寄存器
RTC报警控制寄存器RTCALM如表三所列,控制着报警使能和报警时间。

[7]保留
[6]ALMEN:报警信号全局使能。

0=禁止;1=使能。

[5]YEAREN:年报警使能。

0=禁止;1=使能。

[4]MONREN:月报警使能。

0=禁止;1=使能。

[3]DATEEN:日报警使能。

0=禁止;1=使能。

[2]HOUREN:时报警使能。

0=禁止;1=使能。

[1]MINEN:分报警使能。

0=禁止;1=使能。

[0]SECEN:秒报警使能。

0=禁止;1=使能。

在休眠模式下,RTCALM寄存器的报警信号激活ALMINT和唤醒PMWKUP,在正常模式下,报警信号激活ALMINT。

2.4重置寄存器
重置寄存器如表四所列。

各位定义如下:
[3]SRSTEN:重置使能。

0=禁止;1=使能。

[2:0]SECCR:秒进位的重置边界。

011=超过30s;100=超过40s;101=超过50s;Other=不产生进位,但秒数据可以重置。

2.5报警数据寄存器
报警数据寄存器用于保存报警时的数据,包括ALMSEC、ALMMIN、ALMHOUR、ALMDATE、ALMMON和ALMYEAR等共6个寄存器。

如表五所列。

ALMSEC用于保存报警的秒数据,其中的位[6:0]SECDATA保存报警秒数据的BCD 码,位[6:4]取值0-5,位[3:0]取值0-9。

ALMMIN用于保存报警的分数据,其中的位[6:0]MINDATA保存报警分数据的BCD 码,位[6:4]取值0-5,位[3:0]取值0-9。

ALMHOUR用于保存报警的时数据,其中的位[5:0]HOURDATE保存报警时数据的BCD码,位[5:4]取值0-2,位[3:0]取值0-9。

ALMDATE用于保存报警的日数据,其中的位[5:0]DATEDATA保存报警日数据的BCD码,取值0-28、29、30、31,位[5:4]取值0-3,位[3:0]取值0-9。

ALMMON用于保存报警的月数据,其中的位[4:0]MONDATA保存报警月数据的BCD 码,位[4]取值0-1,位[3:0]取值0-9。

ALMYEAR用于保存报警的年数据,其中的位[7:0]YEARDATA保存报警年数据的BCD码,取值00-99。

2.6时钟数据寄存器
时钟BCD数据寄存器用于保存RTC的实时数据,包括BCDSEC、BCDMIN、BCDHOUR、BCDDATE、BCDDAY、BCDMON和BCDYEAR等7个寄存器,如表六所列。

BCDSEC用于保存报警的秒数据,其中的位[6:0]SECDATA保存报警秒数据的BCD 码,位[6:4]取值0-5,位[3:0]取值0-9。

BCDMIN用于保存报警的分数据,其中的位[6:0]MINDATA保存报警分数据的BCD 码,位[6:4]取值0-5,位[3:0]取值0-9。

BCDHOUR用于保存报警的时数据,其中的位[5:0]HOURDATE保存报警时数据的BCD码,位[5:4]取值0-2,位[3:0]取值0-9。

BCDDATE用于保存报警的日数据,其中的位[5:0]DATEDATA保存报警日数据的BCD码,取值0-28、29、30、31,位[5:4]取值0-3,位[3:0]取值0-9。

BCDDAY用于保存报警的星期数据,其中的位[2:0]DAYDATA保存报警星期数据的BCD码,取值1-7。

BCDMON用于保存报警的月数据,其中的位[4:0]MONDATA保存报警月数据的BCD 码,位[4]取值0-1,位[3:0]取值0-9。

BCDYEAR用于保存报警的年数据,其中的位[7:0]YEARDATA保存报警年数据的BCD码,取值00-99。

三、RTC程序设计
此程序设计基于S3C2410嵌入式开发平台,并结合PC的超级终端完成RTC模块的初始化、时间显示(显示于超级终端)、时间设置、重置测试、报警测试、时钟滴答测试等功能。

其程序开发流程如图二所示。

程序入口点
2410初始化
串口初始化
主函数
时间显示
初始化时间设置显示时间
报警测试
按键
测试
按键
测试
按键
测试
时钟片测试重置测试报警中断开时钟片中断
结束图二:RTC应用开发流程图
3.1硬件初始化
RTC模块不是孤立的,它是S3C2410X的一个内部模块,要对其进行编程,就必须完成对基于S3C2410X的嵌入式系统的初始化。

初始化工作包括对S3C2410X和串口的初始化以及一些辅助函数的实现。

S3C2410X的初始化工作包括程序入口点定义、中断矢量的确定、堆栈的初始化、电源管理(包括掉电与重启设置)、S3C2410X各模块的寄存器地址定义及其初始化。

以上初始化工作于硬件紧密相关,采用32位的ARM/Thumb指令集进行编程。

Display-Rtc( )中的使用PC机的超级终端作为人机接口,完成RTC模块的调试、时间显示及命令选择。

因此,在RTC模块功能设计之前,要完成对串口的初始
化。

串口的初始化由设置PCLK(CPU系统时钟)、波特率设置、控制寄存器设置等几部分完成。

这部分程序与硬件相关性不是特别紧密,可以用嵌入式C语言完成。

在进行人机接口交互时,需要从超级终端输入/输出一些信息。

3.2 功能设计
完成初始化工作后,可以进行RTC模块的功能应用开发。

功能应用按照自顶向下的程序设计思路,可以分为不同的功能模块。

这些功能模块由具体的函数实现,在编写主函数时,可以按完成功能的不同,分别调用不同的子函数。

RTC模块初始化由函数Rtc_Init()实现。

该函数主要实现对BCD数据初始化,当其他函数读取初始化时间时,可以调用此函数。

时间设置功能由函数Rtc_TineSet()实现。

该函数调用Uart_GetIntNum()函数从超级终端读入整型数字,由用户完成对当前时间的修改。

重置测试功能由函数RndRst_Rtc()实现。

该函数通过对Rtc_TimeSet()函数的调用完成用户当前时间设置,然后通过修改RTCRST寄存器,实现重置边界的修改,进而通过对Uart_Printf()函数的调用,显示输出时间。

用户可以观察重置后的时间,来测试重置功能。

报警测试功能由函数Test_Rtc_Alarm()实现。

该函数完成RTC初始化,通过清除RTC模块的中断屏蔽位,产生报警,然后再设置中断屏蔽位,关闭中断。

时钟滴答测试功能由函数Test_Rtc_Tick()实现。

通过寄存器RTICNT设置时钟滴答周期,再通过调用Uart_Printf()输出时钟滴答具体值。

报警中断开与时钟滴答完成相应中断状态位和中断挂起位开中断的功能。

相应的功能可以查看S3C2410X的中断模块。

显示时间功能由函数Display_Rtc( )完成。

3.3设计程序代码
//====================================================================
// File Name : 2410RTC.h
// Function : S3C2410 RTC Head file
//====================================================================
#ifndef __2410RTC_H__
#define __2410RTC_H__
void Display_Rtc(void);
void RndRst_Rtc(void);
void Test_Rtc_Alarm(void);
void Rtc_Init(void);
void Rtc_TimeSet(void);
void Test_Rtc_Tick(void);
void EINT0_int(void) __attribute__ ((interrupt ("IRQ")));
void Rtc_Int(void) __attribute__ ((interrupt ("IRQ")));
void Rtc_Tick(void) __attribute__ ((interrupt ("IRQ")));
#define TESTYEAR (0x01)
#define TESTMONTH (0x12)
#define TESTDATE (0x31)
#define TESTDAY (0x02) //SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7
#define TESTHOUR (0x23)
#define TESTMIN (0x59)
#define TESTSEC (0x59)
#define TESTYEAR2 (0x02)
#define TESTMONTH2 (0x01)
#define TESTDATE2 (0x01)
#define TESTDAY2 (0x03) //SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7
#define TESTHOUR2 (0x00)
#define TESTMIN2 (0x00)
#define TESTSEC2 (0x00)
#endif //__2410RTC_H__
//====================================================================
// File Name : 2410RTC.c
// Function : S3C2410 RTC Test Program
//====================================================================
#include "2410addr.h"
#include "2410lib.h"
#include "2410RTC.h"
char *day[8] = {" ","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}; volatile int isRtcInt, isInit = 2;
volatile unsigned int sec_tick;
//=======================================
//Period = (n + 1) / 128 second
// n : Tick time count value (1~127)
//=======================================
//********************[ Display_Rtc ]*********************************
void Display_Rtc(void)
{
int year,tmp,key;
int month,date,weekday,hour,min,sec;
Uart_Printf("[ Display RTC Test ]\n");
Uart_Printf("0. RTC Initialize 1. RTC Time Setting 2. Only RTC Display\n\n");
Uart_Printf("Selet : ");
key = Uart_GetIntNum();
Uart_Printf("\n\n");
isInit = key;
if(isInit == 0)
{
Rtc_Init();
isInit = 2;
}else if(isInit == 1)
{
Rtc_TimeSet();
isInit = 2;
}
rRTCCON = 0x01; //No reset, Merge BCD counters, 1/32768, RTC Control enable
Uart_Printf("Press any key to exit.\n\n");
while(!Uart_GetKey())
{
while(1)
{
if(rBCDYEAR==0x99)
year = 0x1999;
else
year = 0x2000 + rBCDYEAR;
month = rBCDMON;
weekday = rBCDDAY;
date = rBCDDATE;
hour = rBCDHOUR;
min = rBCDMIN;
sec = rBCDSEC;
if(sec!=tmp) //Same time is not display
{
tmp = sec;
break;
}
}
Uart_Printf("%02x:%02x:%02x%10s,%02x/%02x/%04x\r",hour,min,sec,day[weekday],month,date,y ear);
}
rRTCCON = 0x0;
}
//***********************[ RndRst_Rtc ]*********************************
void RndRst_Rtc(void)
{
int year;
int month,date,weekday,hour,min,sec,tmp;
unsigned int save_GPFCON;
save_GPFCON = rGPFCON;
rEXTINT0 = 0x2; //Falling edge triggered
rGPFCON = 0x2; //EINT0
pISR_EINT0 = (unsigned int)EINT0_int;
rINTMSK = ~(BIT_EINT0);
if(isInit==0)
{
Rtc_Init();
isInit = 1;
}
rRTCCON = 0x01; //No reset, Merge BCD counters, 1/32768, RTC Control enable
Uart_Printf("Press any key to exit.\n\n");
Uart_Printf("Press EINT0 key to test round reset.\n");
while(!Uart_GetKey())
{
while(1)
{
if(rBCDYEAR == 0x99)
year = 0x1999;
else
year = 0x2000 + rBCDYEAR;
month = rBCDMON;
weekday = rBCDDAY;
date = rBCDDATE;
hour = rBCDHOUR;
min = rBCDMIN;
sec = rBCDSEC;
if(sec!=tmp)
{
tmp = sec;
break;
}
}
Uart_Printf("%2x:%2x:%2x%10s,%2x/%2x/%4x\r",hour,min,sec,day[weekday],month,date,year);
}
rRTCCON = 0x0; //No reset, Merge BCD counters, 1/32768, RTC Control disable
rGPFCON = save_GPFCON;
}
//************************[ Test_Rtc_Alarm ]******************************
void Test_Rtc_Alarm(void)
{
Uart_Printf("[ RTC Alarm Test for S3C2410 ]\n");
Rtc_Init();
rRTCCON = 0x01; //No reset, Merge BCD counters, 1/32768, RTC Control enable rALMYEAR = TESTYEAR2 ;
rALMMON = TESTMONTH2;
rALMDATE = TESTDATE2 ;
rALMHOUR = TESTHOUR2 ;
rALMMIN = TESTMIN2 ;
rALMSEC = TESTSEC2 + 9;
isRtcInt = 0;
pISR_RTC = (unsigned int)Rtc_Int;
rRTCALM = 0x7f; //Global,Year,Month,Day,Hour,Minute,Second alarm enable rRTCCON = 0x0; //No reset, Merge BCD counters, 1/32768, RTC Control disable rINTMSK = ~(BIT_RTC);
while(isRtcInt==0);
rINTMSK = BIT_ALLMSK;
}
//************************[ Rtc_Init ]*********************************
void Rtc_Init(void)
{
rRTCCON = rRTCCON & ~(0xf) | 0x1;
rBCDYEAR = rBCDYEAR & ~(0xff) | TESTYEAR;
rBCDMON = rBCDMON & ~(0x1f) | TESTMONTH;
rBCDDATE = rBCDDATE & ~(0x3f) | TESTDA TE;
rBCDDAY = rBCDDAY & ~(0x7) | TESTDAY;
rBCDHOUR = rBCDHOUR & ~(0x3f) | TESTHOUR;
rBCDMIN = rBCDMIN & ~(0x7f) | TESTMIN;
rBCDSEC = rBCDSEC & ~(0x7f) | TESTSEC;
rRTCCON = 0x0; //No reset, Merge BCD counters, 1/32768, RTC Control disable
}
//************************[ Rtc_TimeSet ]*********************************
void Rtc_TimeSet(void)
{
int syear,smonth,sdate,shour,smin,ssec;
int sday;
Uart_Printf("[ RTC Time Setting ]\n");
Rtc_Init(); //RTC Initialize
Uart_Printf("RTC Time Initialized ...\n");
Uart_Printf("Year (Two digit the latest)[0x??] : ");
syear = Uart_GetIntNum();
Uart_Printf("Month [0x??] : ");
smonth = Uart_GetIntNum();
Uart_Printf("Date [0x??] : ");
sdate = Uart_GetIntNum();
Uart_Printf("\n1:Sunday 2:Monday 3:Thesday 4:Wednesday 5:Thursday 6:Friday 7:Saturday\n");
Uart_Printf("Day of the week : ");
sday = Uart_GetIntNum();
Uart_Printf("Hour [0x??] : ");
shour = Uart_GetIntNum();
Uart_Printf("Minute [0x??] : ");
smin = Uart_GetIntNum();
Uart_Printf("Second [0x??] : ");
ssec = Uart_GetIntNum();
rRTCCON = rRTCCON & ~(0xf) | 0x1;
rBCDYEAR = rBCDYEAR & ~(0xff) | syear;
rBCDMON = rBCDMON & ~(0x1f) | smonth;
rBCDDAY = rBCDDAY & ~(0x7) | sday;
rBCDDATE = rBCDDA TE & ~(0x3f) | sdate;
rBCDHOUR = rBCDHOUR & ~(0x3f) | shour;
rBCDMIN = rBCDMIN & ~(0x7f) | smin;
rBCDSEC = rBCDSEC & ~(0x7f) | ssec;
rRTCCON = 0x0; //No reset, Merge BCD counters, 1/32768, RTC Control disable
}
//************************[ Test_Rtc_Tick ]****************************
void Test_Rtc_Tick(void)
{
Uart_Printf("[ RTC Tick interrupt(1 sec) test for S3C2410 ]\n");
Uart_Printf("Press any key to exit.\n");
Uart_Printf("\n");
Uart_Printf("\n");
Uart_Printf(" ");
pISR_TICK = (unsigned)Rtc_Tick;
sec_tick = 1;
rINTMSK = ~(BIT_TICK);
rRTCCON = 0x0;
rTICNT = (1<<7) + 127; //Tick time interrupt enable, Tick time count value 127
//Period = (n + 1) / 128 second n:Tick time count value(1~127) Uart_Getch();
rINTMSK = BIT_ALLMSK;
rRTCCON = 0x0;
}
//-----------------------------------------------------------------------
void EINT0_int(void)
{
rSRCPND = BIT_EINT0;
rINTPND = BIT_EINT0;
rINTPND;
rRTCRST = (1<<3) | 3; //Round second reset enable, over than 30 sec
}
//-----------------------------------------------------------------------
void Rtc_Int(void)
{
rSRCPND = BIT_RTC;
rINTPND = BIT_RTC;
rINTPND;
Uart_Printf("RTC Alarm Interrupt O.K.\n");
isRtcInt = 1;
}
//---------------------------------------------------------------------
void Rtc_Tick(void)
{
rSRCPND = BIT_TICK;
rINTPND = BIT_TICK;
rINTPND;
Uart_Printf("\b\b\b\b\b\b\b%03d sec",sec_tick++);
}
//*****************************main********************************************* #include "..\common\option.h"
#include "..\common\def.h"
#include "..\common\2410addr.h"
#include "..\common\2410slib.h"
#include "..\common\2410lib.h"
#include "..\common\2410addr.h"
//#include "..\common\k9s1208.h"
#include "..\common\register.h"
#include "..\common\LCD.h"
#include "..\common\LCDlib.h"
#define DOWNLOAD_ADDRESS _RAM_STARTADDRESS
#define BOOT_IMAGE_SIZE 5
#define MEM_OFFSET 0x01000000
void (*run)(void)=(void (*)(void))(DOWNLOAD_ADDRESS+MEM_OFFSET);
void Port_Init(void);
void Led_Display(int);
void Delay(int);
void _Link(void);
volatile unsigned char *downPt;
void Main(int argc,char **argv)
{
int i,j;
char status=0;
char *p;
downPt=(unsigned char *)(DOWNLOAD_ADDRESS+MEM_OFFSET);
MMU_DisableICache();
MMU_DisableDCache();
ChangeClockDivider(1,1); // 1:2:4
ChangeMPllValue(M_MDIV,M_PDIV,M_SDIV); //Fin=12MHz FCLK=200MHz
Port_Init();
Uart_Select(0);
Uart_Init(PCLK, 115200);
//_Link();
Display_Rtc();
/*********************************************************
* on(led1) -> on(led2) -> on(led3) -> on(led4)
********************************************************/
Embest();
Uart_SendString("\n\n S3C2410 Test in Embest IDE for ARM toolkets. \n");
Uart_SendString( " UART Send OK! \n ");
while(1)
{
if(status<5) status +=1;
else status =1;
Led_Display(status);
for(i=0;i<55500;i++)
{;}
for(i=0;i<55500;i++)
{;}
}
}
void __gccmain(void)
{
}
四、设计总结
通过这次课程设计,更深一步的了解了实时时钟在通信工程、电气自动化、工业控制等自动化程度高的领域中的重要作用。

了解了RTC特殊功能寄存器的各种定义,熟悉RTC程序设计的过程及课程设计的基本思路。

参考文献
[1] 范书瑞. ARM处理器与C语言开发应用.北京:北京航空航天大学出版社,2008.8:114-138。

相关文档
最新文档