触摸屏驱动程序移植.docx
- 文档编号:7012642
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:34
- 大小:1.43MB
触摸屏驱动程序移植.docx
《触摸屏驱动程序移植.docx》由会员分享,可在线阅读,更多相关《触摸屏驱动程序移植.docx(34页珍藏版)》请在冰豆网上搜索。
触摸屏驱动程序移植
《课程设计成果说明书》规范要求
课程设计说明书是课程设计主要成果之一,一般在2000~3000字。
1.说明书基本格式
版面要求:
打印时正文采用5号宋体,A4纸,页边距上、下、左、右均为2cm,行间距采用固定值20磅,页码底部居中。
文中标题采用4号宋体加粗。
2.说明书结构及要求
(1)封面
(2)课程设计成绩评定表
(3)任务书(指导教师下发)
(4)摘要
摘要要求对内容进行简短的陈述,一般不超过300字。
关键词应为反映主题内容的学术词汇,一般为3-5个,且应在摘要中出现。
(5)目录
要求层次清晰,给出标题及页次。
最后一项为参考文献。
(6)正文
正文应按照目录所确定的顺序依次撰写,要求论述清楚、简练、通顺,插图清晰整洁。
文中图、表及公式应规范地绘制和书写。
(7)参考文献
ADS1.2环境下移植触摸屏驱动到S3C2410
摘要
本次课程设计的内容是在ADS1.2环境下的触摸屏驱动移植到S3C2410。
在设计开始前我们熟悉了ADS1.2集成调试软件的使用和ADS1.2环境下程序的烧写。
并对软件和硬件的配置进行修改,之后我们将实验五ARM的I/O接口实验程序烧写到S3C2410当中,因为在对触摸屏程序进行仿真之前我们要确保触摸屏的端口地址与S3C2410端口的地址一致,否则触摸屏无法识别来自S3C2410的信息。
在做完了上述准备工作之后开始对触摸屏程序就行仿真检查程序是否有错误之处。
在调试结束确定程序无误,开始着手对触摸屏程序进行修改,使其能够在uCOSII系统上运行。
实验室中的COSII系统程序已经根据S3C2410做了修改,所以我们只需将COSII系统加载到ADS1.2中即可。
程序修改结束后将其和LCD,COSII程序一起加载到ADS1.2上仿真,成功后将程序烧写到S3C2410芯片当中,并确定烧写成功即可。
关键字:
ADS1.2;触摸屏;移植;LCD;
目录
第1章熟悉ADS软件的使用及硬件设置6
1.1ADS软件使用说明6
1.2ADS软件和硬件环境的设置7
第2章COSII操作系统10
2.1COSII简介10
2.2COSII在S3C2410上的可移植10
2.3主体移植过程11
第3章图片代码生成12
第4章触摸屏原理及其程序分析13
4.1触摸屏原理13
4.2触摸矫正原理13
4.3触摸屏程序分析15
第5章LCD显示程序分析21
第6章熟悉ADS环境下程序的烧写方法23
6.1程序烧写步骤23
6.2烧写时程序的修改和设置23
第7章程序调试中出现的问题27
第8章课程设计感想33
[参考文献]34
熟悉ADS软件的使用及硬件设置
1.1ADS软件使用说明
ARM ADS全称为ARM Developer Suite。
是ARM公司推出的新一代ARM集成开发工具。
现在ADS的最新版本是1.2,它取代了早期的ADS1.1和ADS1.0。
ADS由命令行开发工具,ARM时实库,GUI开发环境(Code Warrior和AXD),实用程序和支持软件组成。
有了这些部件,用户就可以为ARM系列的RISC处理器编写和调试自己的开发应用程序了。
先介绍ADS提供的常用命令行开发工具:
armcc是ARM C编译器。
这个编译器通过了Plum Hall C Validation Suite为ANSI C的一致性测试。
armcc用于将用ANSI C编写的程序编译成32位ARM指令代码。
armlink是ARM连接器。
该命令既可以将编译得到的一个或多个目标文件和相关的一个或多个库文件进行链接,生成一个可执行文件,也可以将多个目标文件部分链接成一个目标文件,以供进一步的链接。
ARM链接器生成的是ELF格式的可执行映像文件。
armsd是ARM 和Thumb的符号调试器。
它能够进行源码级的程序调试。
用户可以在用C或汇编语言写的代码中进行单步调试,设置断点,查看变量值和内存单元的内容。
对相关一些术语的解释。
映像文件(image):
是指一个可执行文件,在执行的时候被加载到处理器中。
一个映像文件有多个线程。
它是ELF(Executable and linking format)格式的。
段(Section):
描述映像文件的代码或数据块。
RO:
是Read-only的简写形式。
RW:
是Read-write.的简写形式。
ZI:
是Zero-initialized的简写形式。
输入段(input section):
它包含着代码,初始化数据或描述了在应用程序运行之前必须要初始化为0的一段内存。
输出段(output section):
它包含了一系列具有相同的RO,RW或ZI属性的输入段。
域(Regions):
在一个映像文件中,一个域包含了1至3个输出段。
多个域组织在一起,就构成了最终的映像文件。
加载时地址:
是指映像文件位于存储器(在该映像文件没有运行时)中的地址。
运行时地址:
是指映像文件在运行时的地址。
-output file 这个选项指定了输出文件名,该文件可能是部分链接的目标文件,也可能是可执行映像文件。
如果输出文件名没有特别指定的话,armlink将使用下面的默认:
如果输出是一个可执行映像文件,则生成的输出文件名为__image.axf;
如果输出是一个部分链接的目标文件,在生成的文件名为__object.o;
如果没有指定输出文件的路径信息,则输出文件就在当前目录下生成。
如果指定了路径信息,则所指定的路径成为输出文件的当前路径。
1.2ADS软件和硬件环境的设置
打开ADS软件后加载文件,点击
进行硬件环境设置,
图1.1修改Post-linker
图1.2选择CPU核
图1.3选择CPU核
图1.4修改RO、RW
图1.5修改Imageentrypoint
图1.6修改Object/Symbol、Section
图1.7修改Ourputformat、Outputfilename
配置完毕以后,我们可以点击
和
分别进行编译或单步调试,下面列出编译结束的情况截图:
图1.8编译情况说明图
程序编译后有警告(就是图上的
)是正常情况,上图中的
是错误情况,有错误时是没法得到镜像的。
COSII操作系统
2.1COSII简介
COSII是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。
它被广泛应用于微处理器、微控制器和数字信号处理器。
COS和COSII是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。
CPU硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU上。
用户只要有标准的ANSI的C交叉编译器,有汇编器、连接器等软件工具,就可以将COSII嵌入到开发的产品中。
严格地说COSII只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。
没有提供输入输出管理,文件系统,网络等额外的服务。
但由于COSII良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。
COSII目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。
2.2COSII在S3C2410上的可移植
所谓移植,就是使这个实时内核能在某个微处理器上运行。
为了方便移植,大部分的COSII代码是用c语言写的,但仍需要用c语言和汇编语言写一些与处理器相关的代码,这是因为COSII在读写处理器寄存器时只能通过汇编语言来实现。
由于COSII在设计时就已经充分考虑了可移植性,所以COSII的移植相对来说是比较容易的。
COSII的正常运行需要处理器平台满足以下要求:
a)处理器的C编译器能产生可重入代码。
b)用C语言就可以打开和关闭中断。
c)处理器支持中断,并且能产生定时中断(通常在10至100Hz之间)。
d)处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈。
e)处理器有将堆栈指针和其它CPU寄存器读出和存储到堆栈或内存中的指令。
S3C2410处理器采用ARM920T内核,内部共有37个寄存器,其中R13通常用作堆栈指针,只要系统RAM空间允许,堆栈空间理论上没有限制。
ARM处理器提供ARM指令和Thumb指令两种指令集,每种指令集都包含有丰富的指令对堆栈进行操作,可以随意的对处理器中的寄存器进行堆栈操作。
根据堆栈生长方向的不同,可以生成4种不同的堆栈,分别是满递增、空递增、满递减(此移植中使用的是满递减方式)、空递减。
芯片内集成5个定时时钟,任何一个都可以产生定时中断,满足第三条要求。
ADS集成开发环境的内置编译器可以产生可重入代码,并且支持内嵌汇编,C环境中可任意的进行开关中断操作。
综上所述uCOSII完全可以移植到S3C2410上运行。
2.3主体移植过程
1)把文件分为两类,其一是STARTUP目录下的系统初始化、配置等文件,其二是COSII的全部源码,arch目录下的3个文件是和处理器架构相关的。
2)设置os_cpu.h中与处理器和编译器相关的代码
typedefunsignedcharBOOLEAN;
typedefunsignedcharINT8U;
typedefsignedcharINT8S;
typedefunsignedintINT16U;
typedefsignedintINT16S;
typedefunsignedlongINT32U;
typedefsignedlongINT32S;
typedeffloatFP32;
typedefdoubleFP64;
typedefunsignedintOS_STK;
typedefunsignedintOS_CPU_SR;
externintINTS_OFF(void);
externvoidINTS_ON(void);
#defineOS_ENTER_CRITICAL(){cpu_sr=INTS_OFF();}
#defineOS_EXIT_CRITICAL(){if(cpu_sr==0)INTS_ON();}
#defineOS_STK_GROWTH1
3)用C语言实现与处理器任务相关的函数[OS_CPU_C.C]
OSTaskStkInit()
OSTaskCreateHook()
OSTaskDelHook()
OSTaskSwHook()
OSTaskStatHook()
OSTimeTickHook()
实际需要修改的只有OSTaskStkInit()函数,其它五个函数需要声明,但不一定有实际内容。
OSTaskStkInit()函数由OSTaskCreate()或OSTaskCreateExt()调用,需要传递的参数是任务代码的起始地址、参数指针(pdata)、任务堆栈顶端的地址和任务的优先级,用来初始化任务的堆栈,初始状态的堆栈模拟发生一次中断后的堆栈结构。
堆栈初始化工作结束后,OSTaskStkInit()返回新的堆栈栈顶指针,OSTaskCreate()或OSTaskCreateExt()将指针保存在任务的OS_TCB中。
调用OSTaskStkInit()给任务做一个初始的任务上下文堆栈.
由于本实验箱自带了移植好的ucOS内核,所以我们不需要从零开始一步一步移植,然后我们把重点放在触摸屏驱动移植上面。
图片代码生成
我们利用的是Image2LCD软件生成图片代码,其软件图标为
具体使用过程如下:
图3.1Image2LCD软件使用过程
(1)
点击按钮,打开选择图片,
图3.2Image2LCD软件使用过程
(2)
点击保存即可生成图片代码。
触摸屏原理及其程序分析
4.1触摸屏原理
触摸屏附着在显示器的表面,与显示器相配合使用,如果能测量出触摸点在屏幕上的坐标位置,则可根据显示屏上对应坐标点的显示内容或图符获知触摸者的意图。
触摸屏按其技术原理可分为五类:
矢量压力传感式、电阻式、电容式、红外线式、表面声波式,其中电阻式触摸屏在嵌入式系统中用的较多。
电阻触摸屏是一块4层的透明的复合薄膜屏,最下面是玻璃或有机玻璃构成的基层,最上面是一层外表面经过硬化处理从而光滑防刮的塑料层,中间是两层金属导电层,分别在基层之上和塑料层内表面,在两导电层之间有许多细小的透明隔离点把它们隔开。
当手指触摸屏幕时,两导电层在触摸点处接触。
触摸屏的两个金属导电层是触摸屏的两个工作面,在每个工作面的两端各涂有一条银胶,称为该工作面的一对电极,若给一个工作面的电极对施加电压,则在该工作面上就会形成均匀连续的平行电压分布。
当给X方向的电极对施加一确定的电压,而Y方向电极对不加电压时,在X平行电压场中,触点处的电压值可以在Y+(或Y-)电极上反映出来,通过测量Y+电极对地的电压大小,通过A/D转换,便可得知触点的X坐标值。
同理,当给Y电极对施加电压,而X电极对不加电压时,通过测量X+电极的电压,通过A/D转换便可得知触点的Y坐标。
4.2触摸矫正原理
我们通过触摸屏驱动读取到的XY坐标是AD转换的值,他与实际LCD的坐标是不同的。
比如在LCD上坐标为(50,50)的像素点,AD采样值为(78,540)。
触屏校正的目的就是将AD采样的坐标转换为LCD上对应物理地址的坐标。
由于我们使用的是电阻式触摸屏,由于触摸屏上的电场是均匀分布的,所以两者之间存在着线性关系。
利用这个线性关系我们可以使用两点校正法和三点校正法等,下面就介绍一下本课程设计使用到的触屏校正原理。
1).两点校正法原理
由于存在线性关系,可以利用一次函数描述校正后的Xo和校正前Xad的关系
Xo=kX×Xad+bX
同理:
Yo=ky×Yad+by
方法:
1、先通过程序在LCD上画出两个十字光标,坐标中心点位D1、D2;
2、用触摸笔点击D1、D2,分别记录AD采样坐标值E1、E2;
如图4.1所示
图4.1触摸点坐标
3、由上图可列出方程式并求得校正参数:
kX、bX、ky、Yad,这样程序即可使用这四个校正参数将AD采样坐标转换为LCD上的物理坐标。
程序实现:
由两点LCD物理坐标与触摸屏AD采样的坐标计算参数,代码如下:
//计算参数
tsKx=(float)(REC2_X1-REC2_X2)/(xt[0]-xt[1]);
tsBx=(float)(REC2_X1-tsKx*xt[0]);
tsKy=(float)(REC2_Y1-REC2_Y2)/(yt[0]-yt[1]);
tsBy=(float)(REC2_Y1-tsKy*yt[0]);
校正程序
rec_POS.x=(int)(tsKx*cur_POS.x+tsBx);
rec_POS.y=(int)(tsKy*cur_POS.y+tsBy);
这样转化好的坐标便保存在了rec_POS结构体中。
2).三点校正法原理
三点校正原理与两点校正原理有些不一样,在两点校正算法中认为:
物理坐标的横坐标只是与AD采样的横坐标存在线性关系、物理坐标的纵坐标只与AD采样的纵坐标存在线性关系。
而三点校正算法中将物理坐标的纵坐标与AD采样的纵坐标和横坐标一起列出了一个表达式(横坐标同理)。
在实际实验过程中发现三点校正法要比亮点校正法效果要好很多。
设LCD上每个点PD的坐标为[XD,YD],触摸屏上每个点PT的坐标为[XT,YT]。
要实现触摸屏上的坐标转换为LCD上的坐标,需要下列公式进行转换:
XD=A×XT+B×YT+C
YD=D×XT+E×YT+F
因为其中一共有六个参数(A,B,C,D,E,F),因此只需要三个取样点就可以求得这六个参数。
这六个参数一旦确定下来,只要给出任意触摸屏上的坐标点PT,代入这个公式,就可以得到它所对应的LCD上像素点的坐标PD。
具体的求解过程就不细讲,只给出最终的结果。
已知LCD上的三个取样点为:
PD0,PD1,PD2,它们所对应的触摸屏上的三个点为:
PT0,PT1,PT2。
A,B,C,D,E,F这六个参数最终的结果都是一个分式,而且都有一个共同的分母,为:
K=(XT0-XT2)×(YT1-YT2)-(XT1-XT2)×(YT0-YT2)
那么这六个参数分别为:
A=[(XD0-XD2)×(YT1-YT2)-(XD1-XD2)×(YT0-YT2)]/K
B=[(XT0-XT2)×(XD1-XD2)-(XD0-XD2)×(XT1-XT2)]/K
C=[YT0×(XT2×XD1-XT1×XD2)+YT1×(XT0×XD2-XT2×XD0)+
YT2×(XT1×XD0-XT0×XD1)]/K
D=[(YD0-YD2)×(YT1-YT2)-(YD1-YD2)×(YT0-YT2)]/K
E=[(XT0-XT2)×(YD1-YD2)-(YD0-YD2)×(XT1-XT2)]/K
F=[YT0×(XT2×YD1-XT1×YD2)+YT1×(XT0×YD2-XT2×YD0)+
YT2×(XT1×YD0-XT0×YD1)]/K
程序实现:
1、计算六个参数,代码如下:
//计算参数
tsK=(float)(xt[0]-xt[2])*(yt[1]-yt[2])-(xt[1]-xt[2])*(yt[0]-yt[2]);
tsA=(float)(REC3_X1-REC3_X3)*(yt[1]-yt[2])-(REC3_X2-REC3_X3)*(yt[0]-yt[2]);
tsB=(float)(xt[0]-xt[2])*(REC3_X2-REC3_X3)-(xt[1]-xt[2])*(REC3_X1-REC3_X3);
tsC=(float)yt[0]*(xt[2]*REC3_X2-xt[1]*REC3_X3)+yt[1]*(xt[0]*REC3_X3–
xt[2]*REC3_X1)+yt[2]*(xt[1]*REC3_X1-xt[0]*REC3_X2);
tsD=(float)(REC3_Y1-REC3_Y3)*(yt[1]-yt[2])-(REC3_Y2-REC3_Y3)*(yt[0]-yt[2]);
tsE=(float)(xt[0]-xt[2])*(REC3_Y2-REC3_Y3)-(xt[1]-xt[2])*(REC3_Y1-REC3_Y3);
tsF=(float)yt[0]*(xt[2]*REC3_Y2-xt[1]*REC3_Y3)+yt[1]*(xt[0]*REC3_Y3-
xt[2]*REC3_Y1)+yt[2]*(xt[1]*REC3_Y1-xt[0]*REC3_Y2);
校正代码如下:
rec_POS.x=(int)((tsA*cur_POS.x+tsB*cur_POS.y+tsC)/tsK);
rec_POS.y=(int)((tsD*cur_POS.x+tsE*cur_POS.y+tsF)/tsK);
这样转化好的坐标便保存在了rec_POS结构体中。
4.3触摸屏程序分析
触摸屏流程图(如图4.2):
1.触摸屏初始化程序
—****触屏初始化****
——参数:
无
——返回值:
1成功
intTouchScreen_Init(void)
{
memset(&cur_POS,0x00,sizeof(cur_POS));
new_pos=0;
rADCDLY=0x5000;//延时
rADCCON=(1<<14)|(ADCPRS<<6)|(7<<3)|(0<<2)|(0<<1)|(0);//设置ADC控制寄存器;
rADCTSC=(0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);//设置成等待中断模式;
return1;
}
图4.2触摸任务流程图
2.触摸矫正参数程序
—***触屏矫正参数初始化****
—参数:
无
—返回值:
1成功
intRectify_Init(void)
{
#if(1==TS_USE_REC)//2点矫正
//说明:
屏幕会依次提示点击"+"
intxt[2],yt[2];
Set_Color(GUI_RED);//设置字体颜色
Set_Font(&CHINESE_FONT16);//转换字体格式
Disp_String(CN_start"请点十字"CN_end,LCD_X_SIZE/2-10,LCD_Y_SIZE/2);//显示“请点十字”
Set_Font(&GUI_Font8x16);//转换字体格式
Disp_String("1",LCD_X_SIZE/2-10+62,LCD_Y_SIZE/2+1);//显示“1”
Draw_Cross(REC2_X1,REC2_Y1,0xffffff);//画"+"字
Uart_Printf("Rectify_Init:
disp_stringstart!
!
\n");//
Uart_Printf("Rectify_Init:
disp_stringend!
!
\n");
Wait_Touch(&xt[0],&yt[0]);//等待触笔抬起
Set_Color(GUI_BLACK);//设置背景颜色为黑色
Fill_Rect(0,0,640,480);
Set_Color(GUI_RED);//设置字体颜色
Set_Font(&CHINESE_FONT16);//转换字体格式
Disp_String(CN_start"请点十字"CN_end,LCD_X_SIZE/2-10,LCD_Y_SIZE/2);//显示“请点十字”
Set_Font(&GUI_Font8x16);//转换字体格式
Disp_String("2",LCD_X_SIZE/2-10+62,LCD_Y_SIZE/2+1);//显示“2”
Draw_Cross(REC2_X2,REC2_Y2,0xffffff);//画"+"字
Wait_Touch(&xt[1],&yt[1]);//等待触笔抬起
Set_Color(GUI_BLACK);//设置背景颜色为黑色
Fill_Rect(0,0,640,480);
//计算参数
tsKx=(float)(REC2_X1-REC2_X2)/(xt[0]-xt[1]);
tsBx=(float)(REC2_X1-tsKx*xt[0]);
tsKy=(float)(REC2_Y1-REC2_Y2)/(yt[0]-yt[1]);
tsBy=(float)(RE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 触摸屏 驱动程序 移植