嵌入式课程设计报告.docx

上传人:b****2 文档编号:159924 上传时间:2023-04-28 格式:DOCX 页数:16 大小:401KB
下载 相关 举报
嵌入式课程设计报告.docx_第1页
第1页 / 共16页
嵌入式课程设计报告.docx_第2页
第2页 / 共16页
嵌入式课程设计报告.docx_第3页
第3页 / 共16页
嵌入式课程设计报告.docx_第4页
第4页 / 共16页
嵌入式课程设计报告.docx_第5页
第5页 / 共16页
嵌入式课程设计报告.docx_第6页
第6页 / 共16页
嵌入式课程设计报告.docx_第7页
第7页 / 共16页
嵌入式课程设计报告.docx_第8页
第8页 / 共16页
嵌入式课程设计报告.docx_第9页
第9页 / 共16页
嵌入式课程设计报告.docx_第10页
第10页 / 共16页
嵌入式课程设计报告.docx_第11页
第11页 / 共16页
嵌入式课程设计报告.docx_第12页
第12页 / 共16页
嵌入式课程设计报告.docx_第13页
第13页 / 共16页
嵌入式课程设计报告.docx_第14页
第14页 / 共16页
嵌入式课程设计报告.docx_第15页
第15页 / 共16页
嵌入式课程设计报告.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

嵌入式课程设计报告.docx

《嵌入式课程设计报告.docx》由会员分享,可在线阅读,更多相关《嵌入式课程设计报告.docx(16页珍藏版)》请在冰点文库上搜索。

嵌入式课程设计报告.docx

嵌入式课程设计报告

中南大学

 

嵌入式课程设计

《基于ARM平台的打地鼠游戏》

 

姓名:

董嘉伟

学号:

0909103303

班级:

物联网1002

指导教师:

刘连浩李刚

时间:

2013-9-13

●课程设计内容

●课程设计实验环境

●课程设计原理分析

●课程设计开发计划

●课程设计系统设计图

●课程设计关键源码分析

●课程设计成果展示

●课程设计总结

●参考资料

●工程源代码

1、课程设计内容

本次课程设计基于课程《物联网与嵌入式系统》的学习,利用现有的硬件知识和计算机软件编程知识从以下三个题目选择一个作为课程设计内容:

测频程序、交通灯演示系统、打地鼠游戏,难度依次递增。

基于个人实力和兴趣的考虑,我选择了打地鼠游戏作为我的课程设计题目。

具体要求如下:

●LCD正确显示需求内容

●触摸屏功能正常使用

●基本的打地鼠游戏环节

●打地鼠游戏流畅运行,无显著BUG

●游戏结束后输出统计数据

2、课程设计实验环境

软件:

WindowsXP\KeiluVision4.72\ARMDeveloperSuite1.2\

H-JTAG\DNW\,其中keil编译优化等级为Level0.

硬件:

飞凌FL2440开发板,4.3寸(480*272)显示屏、USB-JTAG仿真器

实验室:

中南大学-美国德州仪器联合嵌入式实验室

三、课程设计原理分析

1、LCD显示原理分析

S3C2440的LCD控制器由由一个逻辑单元组成,它的作用是:

把LCD图像数据从一个位于系统内存的videobuffer传送到一个外部的LCD驱动器。

LCD控制器使用一个基于时间的像素抖动算法和侦速率控制思想,可以支持单色,2-bitperpixel(4级灰度)或者4-bit-pixel(16级灰度)屏,并且它可以与256色(8BPP)和4096色(12BPP)的彩色STNLCD连接。

它支持1BPP,2BPP,4BPP,8BPP的调色板TFT彩色屏并且支持64K色(16BPP)和16M色(24BPP)

非调色板真彩显示。

LCD控制器是可以编程满足不同的需求,关于水平,垂直方向的像素数目,数据接口的数据线宽度,接口时序和刷新速率。

S3C2440LCD控制器被用来传送视频数据和生成必要的控制信号,比如VFRAME,VLINE,VCLK,VM,等等。

除了控制信号外,这S3C2440还有作为视频数据的数据端口,它们是如图15-1

所示的VD[23:

0]。

LCD控制器由REGBANK,LCDCDMA,VIDPRCS,TIMEGEN,和LPC3600(看15-1LCD控制器方块图)组成。

REGBANK由17个可编程的寄存器组和一块256*16的调色板内存组成,

它们用来配置LCD控制器的。

LCDCDMA是一个专用的DMA,它能自动地把在侦内存中的视频数据传送到LCD驱动器。

通过使用这个DMA通道,视频数据在不需要CPU的干预的情况下显示在LCD

屏上。

VIDPRCS接收来自LCDCDMA的数据,将数据转换为合适的数据格式,比如说4/8位单扫,4位双扫显示模式,然后通过数据端口VD[23:

0]传送视频数据到LCD驱动器。

TIMEGEN由可编程

的逻辑组成,支持不同的LCD驱动器接口时序和速率的需求。

TIMEGEN块可以产生VFRAME,VLINE,VCLK,VM等等。

数据流描述如下:

LCDCDMA中存在FIFO存储器。

当FIFO为空,或者部分为空的时候,LCDCDMA请求从侦存储器中取得数据,是用突发的存储传输模式取得数据的(每一个突发请求,连续的取4个字

(16bytes)在总线传输过程中,不允许总线控制权交给另一个总线控制)当传输请求被存储控制器中的总线仲裁器接收了后,将会产生连续的4个字的数据传输从系统内存到内部的FIFO。

FIFO

的总共大小为28个字,由12个字的FIFOL和16个字的FIFOH分别组成。

S3C2440有2个FIFOs支持双扫显示模式。

假如是单扫模式,FIFOH将会被用到。

16BPP彩色模式:

1个像素有16个位(5位红,6位绿,5位蓝)视频数据。

但是STN控制器仅仅用到12位色彩数据。

这意味着每一个彩色数据的高4位将被使用,作为像素数据(R[15:

12],G[10:

7],B[4:

1])。

下面的表显示了在字中的数据格式。

2、触摸屏原理

S3C2440A触摸屏控制器

触摸屏的外接电路主要就是要控制上下两层导电层的通断情况以及如何取电压,取电压之后还需要将这个模拟量转换成数字量,这部分工作主要是靠S3C2440A芯片中的模数转换器部分来实现的。

即触摸屏的功能实现实际上分两部分,分别是触摸屏的外接电路部分和S3C2440A芯片自带的A/D转换控制部分。

S3C2440A芯片的A/D转换器有8个输入通道。

转换结果为10bit数字,转换的过程是在芯片的内部自动实现的,转换的结果可以直接从寄存器中取值出

来,在进行一定的转后就可以得到触摸点的坐标。

触摸屏电路部分占用了ADC8个通道中的两个通道作为X、Y两个坐标轴方向的电压输入。

触摸屏接口模式

1.一般转换模式:

单独的转换模式一般使用来作为通用的ADC转换使用,这种模式可以通过初始化设置寄存器ADCCON,并且读写寄存器ADCDAT0来实现。

2.分别X/Y位置转换模式:

触摸屏控制器可以通过X/Y两个转换模式中的一个来完成,X位置模式写X位置转换数据到寄存ADCDAT0,这时触摸屏接口产生中断源到中断控制器。

Y位置模式写Y位置转换数据到寄存器ADCDAT1,,这时触摸屏接口产生中断源到中断控制器。

3.自动X/Y位置转换模式:

自动X/Y位置转换模式的工作方式如下:

当触摸屏有触点触发时,触摸屏控制器依次转换X位置和Y位置。

在触摸屏控制器写X位置测试数据到寄存器ADCDAT0和写Y位置测试数据到寄存器ADCDAT1后,触摸屏接口产生中断源到中断控制

器。

4.等待中断模式:

当有触摸笔按下的时候,触摸屏控制器会产生中断信号(INT_TC)。

触摸屏控制器在等待模式时必须设置触摸屏接口XP、XM、YP、YM的状态。

4、课程设计开发计划

●9月2日-9月3日:

开发板连接测试各项功能是否正常

●9月4日-9月6日:

LCD功能开发,实现图片显示

●9月9日-9月10日:

触摸屏功能开发,实现点击中断处理函数

●9月11日-9月12日:

打地鼠游戏逻辑编写,各功能整合

●9月13日:

检查验收

五、课程系统设计图

6、课程设计关键源码分析

480*272屏输出控制

#defineVBPD_480_272(3)

#defineVFPD_480_272(5)

#defineVSPW_480_272(5)

#defineHBPD_480_272(33)

#defineHFPD_480_272(15)

#defineHSPW_480_272(8)

#defineLCD_BLANK12

#defineCLKVAL_TFT_480_272(3)

#defineADCPRS9//YH0627

staticvoidLcd_Init(U8size)//标准的LCD初始化函数

{

rGPCUP=0xffffffff;//DisablePull-upregister

rGPCCON=0xaaaa56a9;//InitializeVD[7:

0],LCDVF[2:

0],VM,VFRAME,VLINE,VCLK,LEND

rGPDUP=0xffffffff;//DisablePull-upregister

rGPDCON=0xaaaaaaaa;//InitializeVD[15:

8]

rLCDCON1=(CLKVAL_TFT_480_272<<8)|(MVAL_USED<<7)|(3<<5)|(12<<1)|0;

//比较关键的就是3<<5是将色彩输出模式为16BPP(5:

6:

5)

rLCDCON2=(VBPD_480_272<<24)|(LINEVAL_TFT_480_272<<14)|(VFPD_480_272<<6)|(VSPW_480_272);

rLCDCON3=(HBPD_480_272<<19)|(HOZVAL_TFT_480_272<<8)|(HFPD_480_272);

rLCDCON4=(MVAL<<8)|(HSPW_480_272);

rLCDCON5=(1<<11)|(1<<9)|(1<<8)|(1<<3)|(BSWP<<1)|(HWSWP);

//rLCDCON5=(1<<11)|(0<<9)|(0<<8)|(0<<6)|(BSWP<<1)|(HWSWP);//FRM5:

6:

5,HSYNCandVSYNCareinverted

rLCDSADDR1=(((U32)LCD_BUFFER>>22)<<21)|M5D((U32)LCD_BUFFER>>1);

rLCDSADDR2=M5D(((U32)LCD_BUFFER+(SCR_XSIZE_480_272*LCD_YSIZE_480_272*2))>>1);

rLCDSADDR3=(((SCR_XSIZE_480_272-LCD_XSIZE_480_272)/1)<<11)|(LCD_XSIZE_480_272/1);

rLCDINTMSK|=(3);//MASKLCDSubInterrupt

rTPAL=0;//DisableTempPalette

}

}

staticvoidPutPixel(U32x,U32y,U32c)//LCDBUFFER区控制,用以输出LCD屏上像素点,为加快编译速度,直接操纵开发板固化内存地址0x30100000,这里也是通过查阅参考手册知道该地址起为LCD数据存取区域,跟显示屏分辨率有关系

{

if((x<480)&&(y<272)){

(*(volatileunsignedchar*)(0x30100000+(y*480+x)*2))=c&0x0ff;

(*(volatileunsignedchar*)(0x30100000+(y*480+x)*2+1))=c>>8;

}

}

staticvoidPaint_Bmp(intx0,inty0,inth,intl,unsignedcharbmp[])

{//该函数用以读取图片信息并输出到LCD屏指定位置,其中bmp[]为图片转化为的16进制数组,x0,y0分别为图片起始坐标,h、l分别为图片宽度和高度

intx,y;

U32c;

intp=0;

for(y=0;y

{

for(x=0;x

{

c=bmp[p+1]|(bmp[p]<<8);//这里由于色彩显示为16BPP,所以需要16位,bmp[]为16进制数据,单字节8位,故需要移位8,高位在前。

if(((x0+x)

PutPixel(x+x0,y+y0,c);

p=p+2;

}

}

}

voidtouchinit(void)//触摸屏功能初始化函数

{

rADCDLY=50000;//Normalconversionmodedelayabout(1/3.6864M)*50000=13.56ms

rADCCON=(1<<14)+(ADCPRS<<6);//ADCPRSEn,ADCPRSValue

rADCTSC=0xd3;//Wfait,XP_PU,XP_Dis,XM_Dis,YP_Dis,YM_En

pISR_ADC=(int)AdcTsAuto2;

rINTMSK=~BIT_ADC;//ADCTouchScreenMaskbitclear

rINTSUBMSK=~(BIT_SUB_TC);

Uart_Printf("\nTouchScreeninitsucessfully!

");

}

void__irqAdcTsAuto2(void)//中断处理函数

{

inti;

U32saveAdcdly;

if(rADCDAT0&0x8000)

{

rADCTSC&=0xff;//Setstylusdowninterruptbit

}

rADCTSC=(1<<3)|(1<<2);//Pull-updisable,Seq.X,Ypostionmeasure.

saveAdcdly=rADCDLY;

rADCDLY=40000;//Normalconversionmodedelayabout(1/50M)*40000=0.8ms

rADCCON|=0x1;//startADC

while(rADCCON&0x1);//checkifEnable_startislow

while(!

(rADCCON&0x8000));//checkifEC(EndofConversion)flagishigh,Thislineisnecessary~!

!

while(!

(rSRCPND&(BIT_ADC)));//checkifADCisfinishedwithinterruptbit

xdata=(rADCDAT0&0x3ff);//ADC数据寄存器低10位为有效数据,其中0为x坐标值,1为y坐标值

ydata=(rADCDAT1&0x3ff);

//YH0627,TocheckStylusUpInterrupt.

rSUBSRCPND|=BIT_SUB_TC;

ClearPending(BIT_ADC);

rINTSUBMSK=~(BIT_SUB_TC);

rINTMSK=~(BIT_ADC);

rADCTSC=0xd3;//Waitingforinterrupt

rADCTSC=rADCTSC|(1<<8);//Detectstylusupinterruptsignal.

while

(1)//tocheckPen-upstate

{

if(rSUBSRCPND&(BIT_SUB_TC))//checkifADCisfinishedwithinterruptbit

{

break;//ifStylusisup

(1)state

}

}

TouchState=testPos(xdata,ydata);//testpos是由我自己编写的LCD触及位置判断函数,由于返回的xdata和ydata在LCD屏上与分辨率并不匹配,需要大致计算

if(TouchState==MouseState)

{

Uart_Printf("\nSuccessfullyHittedamouse!

");//X-positionConversiondata

TouchState=6;

tnumplus();

}

rADCDLY=saveAdcdly;

rADCTSC=rADCTSC&~(1<<8);//DetectstylusDowninterruptsignal.

rSUBSRCPND|=BIT_SUB_TC;

rINTSUBMSK=~(BIT_SUB_TC);//Unmasksubinterrupt(TC)

ClearPending(BIT_ADC);//清中断寄存器,比较重要,否则会陷入中断循环中

}

voidRandomMouse(void)//产生随机数函数,由于ARM无法支持C语言中的srand()随机数函数,所以自作随机函数,经本地测试,随机种子生成数具备一定随机性,满足实验要求。

{

//srand(time(0));

unsignedlongdongseed;

dongseed=((2617*seed)+123)/37;

seed=dongseed;

MouseState=dongseed%4;

sumplus();

//Uart_Printf("ms=%d",MouseState);

}

7、课程设计成果展示

开发板上电后主菜单:

地鼠出现速度选择:

游戏启动界面:

(董先生的打地鼠,董嘉伟@中南大学物联网工程)

(只能照到部分画面)

手机不太给力,拍摄比较模糊

地鼠随机出现:

正确敲击后串口输出以及最终结果显示:

8、课程设计总结

与之前去杰普实训所做的智能家居平台不同的是,本次课程设计采用了功能更为强大的ARM9平台。

平时所学嵌入式大多针对部分51单片机来做的,但51单片机运行主频低、功能少不适合完成复杂的计算或者控制功能,此次全用全新的ARM9平台来做,感觉上功能更加强大,开发难度也有所增加。

本次课程设计完全按照实验老师的要求来进行,经过合理规划,最终按时完成了开发任务。

在开发过程中遇到了很多的问题,对于我们这种经常搞上层应用开发的同学来说,底层的开发问题确实给了我们足够多的压力,除了参考资料的匮乏以外,再加上开发板本身存在一些问题,着实对调试代码产生了巨大影响。

像LCD的显示分辨率,基本上如果按照参考手册来配置的话,必然会出现尺寸超界,显示不完全的问题。

这就需要我们自己去摸索和尝试,经过多番查找和网上求救,最终确定LCD屏的最佳分辨率为480*272,才使图片显示完全不会出界。

同时16BPP的色彩输出模式也曾给我造成了巨大的困扰,之前一直无法正确输出色彩,我曾怀疑位运算出现问题,但查看很久都未发现问题,后来意识到我的图片转换16进制数组有可能存在问题。

我使用的转换软件为Image2LCD3.2,发现它输出16BPP时默认输出的位分配模式为5:

5:

6,而S3C2440中的LCD初始化选择的是5:

6:

5,故出现颜色显示错误,重新输出后解决问题。

在测试触摸屏中断时,我的代码逻辑一直陷入中断循环中,无法返回中断现场,令我十分困惑。

后来发现中断处理结束后,忘了添加清中断寄存器的代码,以至于陷入了中断循环中。

最后一个比较烦人的问题便是keilC的编译器问题了,很多定义的全局静态volatile变量在中断中都无法获取到正常的初始化值,上网查询后才知道keilC编译器存在着这样的问题,需要在中断的现场再次初始化volatile变量值,才可以解决,在ADS下开发不会存在该问题。

这次课程设计我不仅掌握了ARM开发的基本流程,另外我的C语言水平再次得到提升,分析问题、解决问题的能力也得到锻炼。

此次课程设计的完成离不开老师、同学的帮助,同样离不开网上的热心网友的指点,感谢诸位。

9、参考资料

《物联网与嵌入式系统》刘连浩编著

《ARM系统开发与设计》李驹光编著

《S3C2440AIntroduction》Samsung’s

10、工程源码

请查看源代码文件夹

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2