嵌入式课设说明书Word文档格式.docx
《嵌入式课设说明书Word文档格式.docx》由会员分享,可在线阅读,更多相关《嵌入式课设说明书Word文档格式.docx(33页珍藏版)》请在冰豆网上搜索。
1.1.1ARM技术
ARM体系结构是业界领先的微处理器体系结构,为系统和软件工程师提供了开发低能耗、高性能消费类和工业产品的硅验证解决方案。
这些终端产品涵盖了从汽车和工业监视器到家庭娱乐和移动设备的各个领域。
ARM完整产品线包括微控制器、微处理器、图形处理器、实现软件、单元库、嵌入式内存、高速连接产品、外设以及开发工具。
借助于完善的设计服务、培训、支持和维护以及公司的庞大合作伙伴社区,我们提供了一个全面的系统解决方案,为主要电子设备公司提供一条快速可靠的途径将产品推向市场。
ARM是32位嵌入式微处理器的行业领先提供商,已推出各种各样基于通用体系结构的处理器,这些处理器具有高性能和行业领先的功效,而且系统成本也有所降低。
1.1.2s3c2410处理器介绍
S3C2410微处理器是一款由Samsung公司为手持设备设计的低功耗、高度集成的基于ARM920T核的微处理器。
为了降低系统总成本和减少外围器件,这款芯片中还集成了下列部件:
16KB指令Cache、16KB数据Cache、MMU、外部存储器控制器、LCD控制器(STN和TFT)、NANDFlash控制器、4个DMA通道、3个UART通道、1个I2C总线控制器、1个I2S总线控制器,以及4个PWM定时器和一个内部定时器、通用I/O口、实时时钟、8通道10位ADC和触摸屏接口、USB主、USB从、SD/MMC卡接口等。
现在它广泛应用于PDA(PersonalDigitalAssistant,个人数码助理,一般指掌上电脑)、移动通讯、路由器、工业控制等领域,其内部结构如图1-1所示。
为了提高系统运行速度,减少能量损失,ARM920T核微处理器把片上器件按器件工作频率,使用频度分成三个模块,各个模块通过各自总线连接,模块之间采用一种叫总线桥的结构过度。
S3C2410中内置的LCD控制器提供了下列外部接口信号(CPU引脚):
VFRAME:
LCD控制器和LCD驱动器之间的帧同步信号。
它通知LCD屏开始显示新的一帧,LCD控制器在一个完整帧的显示后发出VFRAME信号。
VLINE:
LCD控制器和LCD驱动器间的同步脉冲信号,LCD驱动器通过它来将水平移位寄存器中的内容显示到LCD屏上。
LCD控制器在一整行数据全部传输到LCD驱动器后发出VLINE信号。
VCLK:
LCD控制器和LCD驱动器之间的象素时钟信号,LCD控制器在VCLK的上升沿发送数据,LCD驱动器在VCLK的下降沿采样数据。
VM:
LCD驱动器所使用的交流信号。
LCD驱动器使用VM信号改变用于打开或关闭象素的行和列电压的极性。
VM信号在每一帧触发,也可通过编程在一定数量的VLINE信号后触发。
LCD_PWREN:
LCD面板电源使能控制信号。
VD[23:
0]:
LCD象素数据输出端口。
LCD控制器包含REGBANK,LCDCDMA,VIDPRCS,TIMEGEN和LPC3600。
REGBANK具有17个可编程寄存器,用于配置LCD控制器。
LCDCDMA为专用的DMA,它可以自动地将显示数据从帧内存中传送到LCD驱动器中。
通过专用DMA,可以实现在不需要CPU介入的情况下显示数据。
VIDPRCS从LCDCDMA接收数据,将相应格式(比如4/8位单扫描和4位双扫描显示模式)的数据通过VD[23:
0]发送到LCD的驱动器上。
TIMEGEN包含可编程的逻辑,以支持常见的LCD驱动器所需要的不同接口时间和速率的要求。
TIMEGEN部分产生VFRAME,VLINE,VCLK,VM等信号。
图1-1控制器
该图揭示了LCD彩色图像数据在LCD的显示缓存中的存放结构,以及彩色图像数据在LCD液晶屏上是如何显示的规则。
320x240像素的8位数据的256彩色LCD屏,显示一屏所需的显示缓存为320x240x8bit,即76800字节,在显示缓存中每个字节,如最右面的图所示,都对应着屏上的一个象素点,因此,8位256彩色显示的显示缓存与LCD屏上的象素点是字节对应的。
每个字节中又有RGB格式的区分,既有332的RGB,又有233的RGB格式,这因硬件而定。
在彩色图像显示时,首先要给显示缓存区一个首地址,这个地址要在4字节对齐的边界上,而且,需要在SDRAM的4MB字节空间之内。
它是通过配置相应的寄存器来实现的。
之后,接下来的76800字节,就为显示缓存区,这里的数据会直接显示到LCD屏上去。
屏上图像的变化是由于该显示缓存区内数据的变化而产生的。
在了解了8位彩色LCD显示原理之后,通过正确配置S3C2410的LCD控制器相应的寄存器,就能正确启动LCD的显示。
请仔细阅读各寄存器的配置项。
表1-1LCD的控制寄存器1的的配置
LINECNT:
(只读)这些位反映行计数值
[27:
18]CLKVAL:
确定VCLK的频率
[17:
8]STN:
VCLK=HCLK/(CLKVALx2)(CLKVAL≥2)
TFT:
VCLK=HCLK/[(CLKVAL+1)x2](CLKVAL≥0)
MMODE:
确定VM的改变速度.
[7]0=每一帧,1=由MVAL定义
PNRMODE:
选择显示模式
[6:
5]00=4位双扫描显示模式(STN)
01=4位单扫描显示模式(STN)
10=8位单扫描显示模式(STN)
11=TFT显示器
BPPMODE:
选择BPP(BitsPerPixel)模式
[4:
1]0011:
STN8位彩色模式
0100:
STN12位彩色模式
ENVID:
LCD视频输出和逻辑的允许与否
[0]0=不允许,LCDFIFO清除
1=允许
表1-2LCD的控制寄存器2的的配置
VBPD:
[31:
24]在STNLCD上面应该置0
LINEVAL:
[23:
14]确定LCD屏的垂直尺寸
VFPD:
[13:
6]在STNLCD上面应该置0
VSPW:
[5:
0]在STNLCD上面应该置0
WDLY:
确定VLINE和VCLK之间的延时
[25:
19]00=16HCLK,01=32HCLK,
10=48HCLK,11=64HCLK
确定LCD屏的水平尺寸,HOZVAL值的确定必须满足一行总的字节数是4的倍数。
如120点的LCD的水平尺寸X=120不支持,因为一行包含15个字节,而X=128可以被支持(16个字节),额外的8点将被LCD驱动器放弃.LINEBLANK:
[31:
21]确定行扫描的空闲时间。
LINEBLANK的单位是HCLKX8。
表1-3LCD的控制寄存器3的的配置
表1-4LCD的控制寄存器4的的配置说明
MVAL[15:
8]如果MMODE=1,这两位定义VM信号以什么速度变化
VMRate=VLINERate/(2*MVAL)
WLH:
[7:
0]确定VLINE高电平的宽度
2]保留
[1:
0]00=16HCLK,01=32HCLK,
对于STNLCD,需要设置下面几个位:
INVVCLK[10]STN/TFT:
这个位设置VCLK活动边缘的极性
0=在VCLK下降沿视频数据被取走
1=在VCLK上升沿视频数据被取走
INVVLINE[9]STN/TFT:
这个位设置行脉冲的极性
0=Normal
表1-5LCD的控制寄存器5的的配置
1=Inverted
INVVFRAME[8]STN/TFT:
这个位设置VFRAME脉冲的极性
1=Inverted
INVVD[7]STN/TFT:
这个位设置VD(videodata)脉冲的极性
1=VDisinverted.
INVPWREN[5]STN/TFT:
这个位设置PWREN信号的极性
BSWP[1]STN/TFT:
字节交换控制位
0=SwapDisable
1=SwapEnable
HWSWP[0]STN/TFT:
半字交换控制位
表1-6LCD的帧缓冲区开始地址寄存器1的配置
LCDBANK:
[29:
21]
指示视频缓冲区在系统存储器的段地址A[30:
22]
LCDBANK在视点移动时不能变化,LCD帧缓冲区应当与4M区域对齐。
LCDBASEU:
[20:
0]指示帧缓冲区。
LCDBASEL[20:
0]指示在使用双扫描LCD时的低帧存储区的开始地址A[21:
1]
公式如下:
LCDBASEL=LCDBASEU+(PAGEWIDTH+OFFSIZE)x(LINEVAL+1)
注:
用户通过改变LCDBASEU和LCDBASEL的值来滚动屏幕,但在帧结束时,不能改变LCDBASEU和LCDBASEL的值,因为预取下一帧的数据优先于改变帧,如果这时改变帧,预取的数据将无效和将显示不正确.为了检查LINECNT,中断应当被屏蔽,否则如果在读LINECNT后,任意中断刚好执行,因为ISR的执行,LINECNT的值可能是旧的。
LCD的帧缓冲区开始地址寄存器3的的配置说明,它主要是进行虚拟屏幕地址设置。
表1-7LCD的帧缓冲区开始地址寄存器2的配置
OFFSIZE:
[21:
11]虚拟屏幕偏移量(半字的数量),该值定义前一显示行的最后的半字和新的显示一行首先的半字之间的距离。
PAGEWIDTH:
[10:
0]虚拟屏幕宽度(半字的数量),该值定义帧的观察区域的宽度。
PAGEWIDTH和OFFSIZE必须在ENVID=0时变。
LCD的RGB查找表寄存器3的的配置说明。
在这三个寄存器中,我们要设定使用的8种红色,8种绿色,4种蓝色。
其实,不同红色的差异,是通过时间抖动的算法及帧率控制的方法来实现的。
对于绿、蓝也同样。
因此,还要设置一下有关抖动模式寄存器。
详细请看下面关于初始化S3C2410的LCD控制器的程序。
表1-8LCD的帧缓冲区开始地址寄存器3的配置
2Linux的实验环境的搭建
2.1正确安装Redhat9.0操作系统
当安装完linux操作系统后,接下来要安装交叉编译器。
启动主机,必须以root用户名登录,在主机的根目录/下,创建linuette目录,如:
mkdir/linuette。
在/mnt/cdrom目录下找到光盘,将光盘中/实验软件syrj/tools/目录下的RPMS文件夹拷贝到/linuette目录下,打开系统工具下的终端,此时,系统将弹出终端框,在里面改变目录到/linuette/RPMS下,输入如下命令:
图2-1页面显示
等待系统安装,如果所有的RPMS内的文件全部正确安装,将会在根目录下的/opt文件夹内生成一个host文件夹,我们所需的交叉编译库就在该目录下。
所以,所需的交叉编译环境就搭建好了。
由于linux系统在编译驱动程序时,可以用模块的形式来动态加载,这样给实验、调试带来极大的便利,通常的做法是:
把编译好的动态模块和应用程序放在主机上的一个共享文件夹内,启动主机的nfs网络文件系统服务,关闭系统的防火墙服务(如果系统安装了该项),用交叉以太网线把主机和实验系统连接。
在终端下启动minicom,在实验系统起来之后,利用ifconfigeth0xxx.xxx.xxx.xxx命令改变实验系统的IP地址,让该地址的前三段和主机的前三段一致,最后的一段,可以选择和主机不重复的小于255的任意值。
之后把主机上的共享文件夹挂载到实验系统上的一个目录上。
通过相应的命令进行实验或调试。
2.2配置NFS网络文件系统
首先在LINUX主机的终端上执行setup,弹出菜单界面后,选中:
Firewallconfiguration,回车,进入系统服务选项菜单,选择NOFIREWALL关闭防火墙(如果安装了防火墙)。
然后退出。
但是,setup里面会照样显示防火墙设置是HIGH的,这个可以不必理会。
之后选中:
Systemservices,回车,进入系统服务选项菜单,在其中选中[*]nfs,然后按F12键退出,再选择方向键,退出setup界面,返回到命令提示符下。
如下图2-2系统服务显示所示。
图2-2系统服务显示
利用编辑器打开/etc/exports文件,将这个默认的空文件修改为只有如下一行内容:
(注意中间有空格)
/
(rw)
然后,保存退出,之后改变目录到/etc/rc.d/init.d/下,执行如下命令:
./nfsstart
终端内输出:
StartingNFSservices:
[确定]
StartingNFSquotas:
[确定]
StartingNFSdaemon:
StartingNFSmountd:
这样就一切OK了!
主机linux下的NFS启动起来。
2.3用交叉网线把主机和实验系统连接
在终端下输入minicom-s,配置minicom为波特率为115200,无奇偶校验,8bit。
之后,在minicom下,给系统上电,系统正常起来后,利用ifconfigeth0xxx.xxx.xxx.xxx来改变实验系统的IP地址,让该地址的前三段和主机的前三段一致,最后的一段,可以选择和主机不重复的小于255的任意值。
例如,主机是192.168.0.100,则实验系统配置为ifconfigeth0192.168.0.5,之后,利用ping命令,在实验系统上ping192.168.0.1,看看实验系统能否和主机连上。
当连通后,利用mount命令,挂载主机的nfs系统下的共享目录。
要mount成功,首先,利用命令chmod777/home/nfs改变/home/nfs文件夹的属性,让其变为可读可写,如果/home目录下没有nfs文件夹,建议创建此文件夹,以后需要挂载的用于调试的驱动模块以及应用程序均放在该文件夹内。
之后,在终端中,输入mount–onolock192.168.0.1:
/home/nfs/mnt/yaffs回车,即可完成把主机上的/home/nfs下的文件挂载到实验系统的/mnt/yaffs目录下。
图2-3本地连接IP地址
图2-4更改IP地址的程序界面
2.3.1编译内核
当选择采用驱动模块和应用程序利用nfs网络文件系统异地调试时,则不需要重新编译内核,仅需要使用交叉编译器编译驱动模块和应用程序,之后利用mount命令把它们所在的文件目录加载到文件系统中。
然后使用相关命令进行对驱动模块的安装,调试或卸载。
当需要把驱动模块编译进内核,则应在终端的内核目录下输入makemenuconfig配置命令,通过选中新加入的驱动模块,保存配置,退出,第一次需要编译,需要键入makedep命令,而后,输入makeclean,最后,输入makezImage命令,编译内核。
步骤如下,在系统工具的终端下,切换目录到kernel目录下,然后输入命令:
makedep(该命令用于寻找各文件的依存关系)
makeclean(该命令用于清除以前构造内核时生成的所有目标文件、模块文件和临时文件)
makezImage(编译内核中的文件,生成内核)
若编译通过则在/arch/arm/boot/目录下生成内核文件zImage。
如下图所示。
至此,在LINUX操作系统下,对linux的编译过程应有一个大概的了解。
图2-5驱动命令显示界面
(一)
2.3.2实验说明
1.关于linux-2.4.18.-rm7-pxa1
linux-2.4.18.-rm7-pxa1是linux移植到三星S3C2410处理器上的操作系统内核代码。
一般在每个目录下,都有一个.depend文件和一个Makefile文件,这两个文件都是编译时使用的辅助文件,仔细阅读这两个文件对弄清各个文件这间的联系和依托关系很有帮助;
而且,在有的目录下还有Readme文件,它是对该目录下的文件的一些说明,同样有利于我们对内核源码的理解。
Makefile重构Linux内核可执行代码的make文件
Documention有关Linux内核的文档
arch是内核中与具体CPU和系统结构相关的代码,具体的CPU
对应具体的文件夹下的文件。
相关的.h文件分别放在include/asm中。
在每个CPU的子目录中,又进一步分为boot、mm、kernel、lib等子目录,分别包含与系统引导、内存管理、系统调用等相关的代码。
Drivers设备的驱动程序。
放置系统所有的设备驱动程序;
每种驱动程序又各占用一个子目录:
如/block下为块设备驱动程序,比如ide(ide.c)。
Fs文件系统,每个子目录分别支持一个特定的文件系统,例如fat和ext2。
还有一些共同的源程序则用于虚拟文件系统。
Include包含了所有的.h文件。
和arch子目录一样,其下都有相应CPU的子目录,而通用的子目录asm则根据系统的配置“符号连接”到具体的CPU的专用子目录上。
与平台无关的头文件在include/linux子目录下,与ARM处理器相关的头文件在include/asm-arm子目录下,除此之外,还有通用的子目录linux,net等。
InitLinux内核的这个目录包含核心的初始化代码(注意:
不是系统的引导代码),包含两个文件main.c和Version.c。
IpcLinux内核的进程间的通信管理
KernelLinux内核的进程管理和进程调度。
主要的核心代码,此目录下的文件实现了大多数linux系统的内核函数,其中最重要的文件是sched.c;
同样,和体系结构相关的代码在arch/*/kernel中;
Lib此目录为通用的程序库。
MmLinux内核的内存管理。
这个目录包括所有独立于处理器体系结构的内存管理代码,如页式存储管理内存的分配和释放等。
Net包含了各种不同网卡和网络的驱动程序。
Scripts此目录包含用于配置核心的脚本文件。
2.关于RPMS交叉编译器包
RPMS是一个用于Linux-2.4.18-rmk7-pxa1内核的交叉编译器包,它其中包括交叉编译、汇编、链接、二进制文件转换工具、所需要的库函数等等。
所谓交叉编译器就是一种在RedhatLinux操作系统+X86的体系结构下,编译经过移植的linux操作系统,生成内核,该内核能够在另外一种软硬件环境下运行的编译工具,如linux操作系统+ARM的体系结构。
交叉编译其实就是在一个平台上生成能够在另一个平台上运行的代码。
注意这里的平台,实际上包含两个概念:
体系结构(Architecture)和操作系统(Operati