ARM课程设计完结版文档格式.docx
《ARM课程设计完结版文档格式.docx》由会员分享,可在线阅读,更多相关《ARM课程设计完结版文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
![ARM课程设计完结版文档格式.docx](https://file1.bdocx.com/fileroot1/2022-12/31/5ebcc06a-804c-4b4c-9dd9-5610f024782f/5ebcc06a-804c-4b4c-9dd9-5610f024782f1.gif)
第3章项目设计与实现9
3.1程序设计与实现9
3.2程序功能代码9
第4章个人总结与改进方案15
摘要
随着科技的发展,嵌入式系统广泛应用于工业控制和商业管理领域,在智能手机、平板电脑、笔记本电脑、车载导航器等方面的应用,更是极大地促进了嵌入式技术深入到生活和工作各个方面。
嵌入式系统主要由嵌入式处理器、相关支撑硬件及嵌入式软件系统组成;
本课题主要介绍基于S3C2410的实时时钟及闹钟设计与实现,利用RTC模块、IIC,通过八位七段数码管动态显示时间,并在闹钟设定后能通过蜂鸣器报警。
实时时钟单元在系统电源关闭的情况下可以在备用电池下继续工作。
关键词:
S3C2410;
RTC;
IIC
Abstract
Withthedevelopmentofscienceandtechnology,theembeddedsystemiswidelyusedinindustrialcontrolandinthefieldofbusinessmanagement,andalsogreatlypromotetheembeddedtechnologyintothelifeandworkinthesmartphone,tabletPC,computer,theapplicationofvehiclenavigation,Anembeddedsystemismainlycomposedofembeddedprocessorandrelatedsupportofhardwareandembeddedsoftwaresystem;
ThistopicmainlyintroducedthatrealtimeclockandalarmclockdesignbasedonS3C2410,utilizationofRTCmoduleandIIC,throughsevensegmentdigitaltubedynamicdisplayoftime,
andsetthealarmclockthroughthebuzzeralarm.Realtimeclockunitcancontinuetoworkunderthebackupbatterywhenthesystempowerwasturnedoff.
Keyword:
S3C2410;
第1章项目分析
1.1项目的背景和意义
一般电子系统都会提供实时时钟(RTC)给不同功能使用,例如系统的时间、日期和定时工作的启动,定期唤醒系统执行任务。
已有许多系统解决方案将实时时钟(RTC)和完整的“独立”功能整合至微控制器,将微控制器整合的许多好处付诸实现。
实时时钟(RTC)由于有了嵌入式的技术支持,已经大量生产,并且广泛地应用于电子信息行业。
实时时钟最基本的是可以实现时间和日期等同步,此外,实时时钟还提供了很多比如看门狗等功能。
所以,选择RTC芯片除了需要考虑其时间和日期跟踪功能外,还要针对相应的应用来对RTC的功能、成本、功耗、尺寸等进行综合的考虑。
本课程设计简单的介绍了时钟的时间同步和闹钟功能的设计与实现。
1.2项目的介绍与设计的目的
1)能够通过键盘输入进入时钟设定模式设定实时时钟的初始参数;
2)能够通过键盘输入进入闹钟设定模式设定闹钟的基本参数,通过调用蜂鸣器实现闹钟报警;
3)通过IIC总线传送键盘的输入信号到CPU;
4)ZLG7290控制8位的七段LED数码管显示:
000000,分别为时、分、秒;
1.3项目的程序流程图及硬件实验平台
程序流程图:
硬件实验平台:
本次设计主要使用S3C2410芯片内部RTC单元,SPI,IIC总线及Uart0等。
ZLG7290是IIC接口键盘及LED数码管驱动器。
提供键盘中断信号,方便与处理器接口,可驱动8位共阴数码管或64只独立LED和64个按键。
图2S3C2410开发板结构图
图3RTC模块结构图
图4IICLED控制器连接电路
图5IIC的EEPROM连接电路
图6ZLG7290引脚图
1.4项目的开发及运行环境
CodeWarrior
for
ARM
Developer
Suite
AXD
Debuger
H-JTAG仿真器
超级终端
第2章项目内容
2.1实时时钟(RTC)
实时时钟(RealTimeClock):
S3C2410提供了一个实时时钟,该时钟使用独立的一路1.8V供电,电池与专用于RTC电源的引脚RTCVDD连接,保证主电源切断时能正常维持RTC工作。
S3C2410的RTC支持两个中断:
TimeTick(固定在一个频率内发出的时钟中断)和Alarm中断(在某个时刻产生闹铃中断)。
利用这两个中断可以设置每一秒中断一次显示变化时间,用Alarm中断实现闹钟功能。
S3C2410内部RTC模块结构图,如图3。
S3C2410的RTC主要由五部分构成:
✓时钟发生器
✓节拍发生器
✓时间与日期计数器
✓报警发生器
✓控制逻辑
寄存器有以下组成:
✓控制寄存器:
RTCCON
✓报警控制寄存器:
RTCALM
✓实时时钟计数器:
TICNT
✓报警时间寄存器:
ALMSEC,ALMMIN,ALMHOUR,ALMDATE,ALMMON,ALMYEAR
RTC最重要的功能就是显示时间。
RTC时间显示功能是通过读/写寄存器实现的。
要显示秒、分、时、日、月、年,CPU必须读取存于BCDSEC,BCDMIN,BCDHOUR,BCDDAY,BCDDATE,BCDMON与BCDYEAR寄存器中的值。
时间的设置也是通过以上的寄存器实现的,即以上寄存器是可读可写的。
本课程设计只显示秒、分、时。
2.2IIC总线
IIC(Inter-IntegratedCircuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。
IIC总线产生于80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。
例如管理员可对各个组件进行查询、管理系统的配置或掌握组件的功能状态,如电源和系统风扇。
可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便管理。
IIC总线在传送数据过程中共有三种类型信号:
开始信号:
SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:
SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:
接收数据的IIC在接收到8bit数据后,向发送数据的IIC发出特定的低电平脉冲,表示已收到数据。
CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况做出是否继续传递信号的判断。
若未收到应答信号,则判断为受控单元出现故障。
图7超始和停止信号图
IIC总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
图8数据传送时序图
IIC接口:
CPU内置IIC总线控制器,为了方便用户测试IIC总线读写,搭载两个IIC设备,一个是IIC接口的LED数码管显示控制器ZLG7290,通过控制器,控制8位七段数码管的动态扫描(见图4);
另一个是IIC接口的EEPROM24C16,为16K-bit的串行EEPROM(见图5),方便用户存储一些小容量的数据,掉电不丢失。
IIC总线(IICSDA、IICSCL)经过VDD33的上拉后,进入ZLG7290。
2.3ZLG7290
ZLG7290(见图6)能够直接驱动8位共阴式数码管(或64只独立的LED),同时还可以扫描管理多达64只按键。
其中有8只按键还可以作为功能键使用,就像电脑键盘上的Ctrl、Shift、Alt键一样。
采用IIC总线方式,与微控制器的接口仅需两根信号线。
可控制扫描位数,可控制任一数码管闪烁。
第3章项目设计与实现
3.1程序设计与实现
本课程设计采用软件延时的方法来实现实时时钟和闹钟功能。
时钟模式和闹钟模式分别采用disp_buf[8]和Clock_buf[8]两个显示缓冲区来存储数值,在时钟模式下,可以对disp_buf[8]重新赋值,即设定同步时间,通过一个延时函数达到计数时间的功能;
在闹钟模式下,可以对Clock_buf[8]重新赋值,即设定闹钟的时间,当同步时间计时到和设定的闹钟时间相等的时候,调用蜂鸣器函数发出警报,达到闹钟的功能。
由于是8位的LED数码管,而本实验只要求显示:
000000即:
时分秒,所以在第三个和第六个LED数码管最开始赋初值的时候利用0x1F让其不显示,以达到时钟显示的基本效果。
然后通过4*4键盘进入时钟设置模式和闹钟设置模式,函数ZLG7290_SendCmd()和ZLG7290_SendBuf()使设置时对应位闪烁并读取键值,键值通过按键获得,每按一次就存在显示缓冲区,直到时间设置完成。
通过if语句的嵌套,再加上延时显示来达到时间同步的效果,并且在235959时自动清零。
3.2程序功能代码
#include"
config.h"
#defineBEEP(1<
<
10)/*GPH10,低电平时蜂鸣*/
#defineBEEP_MASK(~BEEP)
//定义显示缓冲区
chardisp_buf[8]={0x01,0x00,0x1f,0x00,0x00,0x1f,0x00,0x00};
charClock_buf[8]={0x00,0x00,0x1f,0x00,0x00,0x1f,0x00,0x00};
//ZLG7290控制LED数码管闪烁命令
#defineGlitter_COM0x70
intControl=0;
intStop=0;
intFlag_look=0;
//延时函数
voidDelayNS(uint32dly)
{
uint32i;
for(;
dly>
0;
dly--)
for(i=0;
i<
50000;
i++);
}
//蜂鸣器函数
voidRunBeep(void)
rGPHDAT=rGPHDAT&
BEEP_MASK;
//BEEP=0
DelayNS(8);
rGPHDAT=rGPHDAT|BEEP;
//BEEP=1
//控制时间计数延时函数
voiddelay(intdly)
{
5000;
//50000
//主函数
intmain(void)
//赋初值
intcont=0x80;
intModel=0;
intnum=-1;
intj;
chardata;
uint16key;
uint16key_tmp;
//GPIO设置
rGPACON=rGPACON&
(~(1<
21));
//A口,RUN灯控制口(GPA21)
rGPHCON=(rGPHCON&
(~(0x03<
20)))|(0x01<
20);
//rGPHCON[21:
20]=01b,设置GPH10为I/O输出模式
//初始化I2C接口
InitI2C();
RunBeep();
ZLG7290_SendBuf((uint8*)disp_buf,8);
//读取按键,设置键值对应的显示位闪烁
while
(1)
{
DelayNS
(1);
/*>
0表示键值(低8位为键码,高8位为按键次数)
=0表示无键按下*/
key=ZLG7290_GetKey();
//获取键值
key_tmp=key&
0x00FF;
DelayNS(30);
//软件去抖
key=ZLG7290_GetKey();
key=key&
//判定键值,读取键值为11时进入时间设置模式,读取键值为12时进入闹钟设置模式
if(key_tmp==key)
{
if(key==12&
&
Model==0)
{
ZLG7290_SendBuf((uint8*)Clock_buf,8);
ZLG7290_SendCmd(Glitter_COM,0x80);
Model=2;
num=7;
cont=0x80;
Stop=1;
}
if(key==11&
ZLG7290_SendBuf((uint8*)disp_buf,8);
Model=1;
//进入设置模式后进行初始值设定,可以任意设定时钟和闹钟的时间
if((Model==1||Model==2)&
num>
=0&
key>
=1&
key<
=10&
Stop==1)
if(Model==2)
data=(uint8)key;
Clock_buf[num]=data-1;
if(num==3||num==6)//第三个和第六个LED数码管不显示,所以不进行赋值
{
num--;
cont=cont>
>
1;
}
cont=cont>
ZLG7290_SendBuf((uint8*)Clock_buf,8);
ZLG7290_SendCmd(Glitter_COM,cont);
if(num==-1)//赋值完成后的判定
Model=0;
Stop=0;
ZLG7290_SendCmd(Glitter_COM,0x00);
elseif(Model==1)
{
disp_buf[num]=data-1;
if(num==-1)
}
//赋值是否完成通过Stop来判定,Stop==0则赋值完成,进入if嵌套语句通过Control来控制延时,以达到最佳的计时效果
if(Stop==0)
if(Control==9)//10
disp_buf[0]++;
if(disp_buf[0]>
=10)
{
disp_buf[0]=0;
disp_buf[1]++;
//秒的显示
}
if(disp_buf[1]>
=6)
disp_buf[1]=0;
disp_buf[3]++;
if(disp_buf[3]>
disp_buf[3]=0;
disp_buf[4]++;
if(disp_buf[4]>
=6)//分的显示
disp_buf[4]=0;
disp_buf[6]++;
if(disp_buf[6]>
disp_buf[6]=0;
disp_buf[7]++;
if(disp_buf[7]>
=2&
disp_buf[6]>
=4)//时的显示,计时到235959时自动清零
for(j=0;
j<
8;
j++)
{
disp_buf[j]=0;
}
disp_buf[2]=0x1f;
disp_buf[5]=0x1f;
Control=0;
ZLG7290_SendBuf((uint8*)disp_buf,8);
else
Control++;
delay
(1);
}
//当两个缓冲区的数值相等时调用RunBeep(),即实现闹钟报警的功能。
if((Flag_look>
0)||((disp_buf[7]==Clock_buf[7])&
(disp_buf[7]==Clock_buf[7])&
(disp_buf[6]==Clock_buf[6])&
(disp_buf[4]==Clock_buf[4])&
(disp_buf[3]==Clock_buf[3])&
(disp_buf[1]==Clock_buf[1])&
(disp_buf[0]==Clock_buf[0])))
RunBeep();
if(Flag_look==0)
Flag_look=100;
//控制蜂鸣器报警的时间
else
Flag_look--;
return(0);
第4章个人总结与改进方案
通过这次课程设计,加深了对嵌入式的认识和了解,对本学科有了一个基本的理解,最开始打算做这个课程设计的时候不知道从何下手,通过相关老师的指导和细心讲解,逐渐有了一个实现设计的框架。
做课程设计之前,最先遭遇的问题就是教学所使用的试验箱无法用32.768kHz的晶振来完成时钟功能,通过多方面查阅相关资料,并且在和同学、老师的讨论中,发现可以用其它的方法也同样能实现实时时钟的功能,比如利用中断、软件延时等,经过多次修订和动手实验,最终决定采用软件延时的方法来完成课程设计,软件延时相对来说比较简单,实现起来比较容易,且显示效果比较稳定、逼真,所以通过利用多方资料最终完成此段能够实现实时时钟和闹钟功能的源代码,但此段代码还可以进行优化,使其达到的效果更好,利用手机的时钟进行测试,发现一分钟的时间,此代码实现的时钟大概延迟了0.5s左右,经过长时间的测试,误差则更加明显,所以在延时控制方面,还可以继续调试一达到更加精确的状态,同时,在第三位和第六位的LED数码管可以调用相关函数显示“—”,使显示效果更加完美。
通过这次课程设计,同时提高了自己查找资料、整理资料的能力,也意识到了合作的重要性,有些自己不懂的东西要虚心请教会的同学和老师,这样才能更好、更快的完成任务。