电子科技大学.docx
《电子科技大学.docx》由会员分享,可在线阅读,更多相关《电子科技大学.docx(19页珍藏版)》请在冰豆网上搜索。
电子科技大学
电子科技大学
综合设计报告
题目全称:
人脸识别
课程名称:
嵌入式系统综合训练Ⅰ
指导老师:
廖勇职称:
副教授
序号
姓名
学号
班号
报告成绩(40分)
设计过程成绩(30分)
1
严伟
2012223010009
38
28
2
董超华
2012223010012
36
26
3
杨龙
2012223010007
34
24
4
郭庭昊
2012223010008
32
22
5
6
(注:
学生姓名填写按学生对该综合设计的贡献及工作量由高到底排列,分数按排名依次递减。
序号排位为“1”的学生成绩最高,排位为“6”的学生成绩最低。
)
指导老师评语:
(对设计过程和报告成绩分别进行点评)
指导签字:
=
本小组成员任务分工情况
序号
姓名
学号
分工
完成情况
1
严伟
2012223010009
代码编写、报告撰写
完成
2
董超华
2012223010012
代码编写、报告撰写
完成
3
杨龙
2012223010007
需求分析、报告撰写
完成
4
郭庭昊
2012223010008
测试、报告撰写
完成
电子科技大学
综合训练报告
1、综合训练目的
1)熟悉并熟练使用ARM2440开发板串口通讯功能;
2)提高ARM汇编编程能力;
3)在不断地查询数据手册的过程中,学会如何快速查找手册类资料;
4)对在裸板上进行一些初始化操作,实现UART串口通讯驱动,即实现PC端与开发板间串口的通讯,从PC终端输入数据,开发板再将其经过/不经过转换后返回到PC终端;
5)通过分小组完成方式,锻炼团队合作能力。
2、综合训练任务
1)了解串口基本通信原理,查看开发板数据表上关于串口的连接方式,以及其特点;
2)根据ARM2440开发板的硬件原理,初始化开发板,初始化串口硬件,控制串口硬件实现字符串接收和发送功能;
3)编程实现ARM2440开发板上的UART通讯;
其中配置串口的主要任务如下:
1)设置管脚模式;
2)设置通信模式;
3)设置数据读取模式;
4)设置是否使用硬件缓存;
5)设置是否启使用硬件流控;
6)设置传输速度,即波特率;
3、裸板上串口驱动程序的设计
3.1整体结构设计
根据以上两节对本次课程设计的目的和需求的分析可以知道,本次课程设计需要完成以下两个任务:
1)裸板的正常启动;
2)串口的正确驱动。
裸板的正常启动过程比较简单。
由于裸板的启动过程中不能够被其他事件打断,其运行方式是顺序运行,因此,其过程比较简单,将其划分为一个模块比较适合。
串口的正确驱动则稍显复杂。
为了在程序运行时验证串口经过配置能够正确运行,因此,在本次程序的设计时需要设计一个串口应用小程序来展示结果。
串口应用程序需要展示串口的发送和接收数据功能,在本次设计中将发送数据过程安排在串口应用程序中实现,而将串口接收数据过程作为普通中断来处理。
因此,可将串口的正确驱动任务划分为串口应用程序模块、FIQ处理模块和UART中断服务模块。
综上所述,本次裸板上串口驱动程序设计的模块图如图1所示。
裸板串口驱动程序包括裸板启动模块、串口应用程序模块、FIQ处理模块和UART中断服务模块,其中裸板启动模块完成对开发板的初始化,串口应用程序模块、FIQ处理模块和UART中断服务模块是用于配置并展示串口的配置是否正确。
图1裸板上串口驱动程序模块图
3.2模块设计
根据3.1节对裸板上驱动程序的整体结构的设计可知,在编写代码前需要完成以下模块的详细设计:
裸板启动模块、串口应用程序模块、FIQ处理模块和UART中断服务模块。
3.2.1裸板启动模块设计
本次课程设计使用的开发板为以三星公司生产的S3C2440芯片作为处理器的飞凌ARM2440开发板,所以裸板启动的任务是通过设置让飞凌ARM2440开发板正常工作。
为了让开发板可以正常运行,需要对所有需要设置的部件进行设置。
由于飞凌2440开发板没有NorFlash,因此,开发板默认是从NandFlash启动。
在板子上电复位时,处理器会将NandFlash的前4KB数据拷贝至内部的一个大小为4KB的RAM中,因此可以直接将中断向量表放在程序开始的地方,那么在处理器拷贝完成后,中断向量表就放到了需要放到的地方,这样可以免去软件拷贝的过程。
正是由于这个原因,裸板启动的第一个任务是跳过中断向量表,执行真正的程序。
由于启动的过程不能被其它中断打断,所以接下来应该关闭中断,禁止处理器响应外部中断。
并且由于在上电复位的时候,内存还没有初始化,因此暂时还需要禁用Cache和MMU。
接下来,需要关闭开门狗计数器,避免其在启动过程中产生复位信号中断启动过程。
然后需要设置时钟,让整块板子工作在正常的时钟频率下。
完成时钟的配置后需要配置内存控制器以使得外部的内存可用。
紧接着需要将堆栈指针初始化,为应用程序的运行做准备。
由于在本次课程设计中只要求对UART进行配置,因而需要屏蔽掉与之无关的其他中断,以免在产生中断后没有相应的中断服务程序为其服务。
在裸板初始化的最后需要打开Cache、将中断向量表完善、打开中断。
打开Cache主要是为了让指令执行的效率提高,打开中断是为了让处理器能够响应外部事件。
本模块的最后一步是进入串口应用程序,但是由于启动代码的运行是顺序运行的,所以只需要让串口应用程序的代码接在启动代码之后即可,在程序运行的时候会自动进入串口应用程序。
综上所述,裸板启动的流程图如图2所示。
图2裸板启动模块流程图
3.2.2串口应用程序模块设计
为了验证串口经过配置后能够正常地收发数据,在此设计了串口应用程序模块来展示。
串口应用程序模块需要完成的任务如下:
1)根据接收到的数据按照一定的对应关系控制4个LED灯的亮和灭;
2)在没有数据接收的时候,自动的将当前数据逐渐增加,并反应到LED灯上;
3)实时向PC返回当前LED灯所表示的数据。
刚进入本模块是可能还没有收到数据,需要对数据进行一次初始化,在此初始化为0,因此,在板子运行时可以看到4个LED从全灭到全亮的过程,反复循环。
综上,串口应用程序的模块流程图如图3所示。
图3串口应用程序模块流程图
3.2.3FIQ中断处理模块设计
在开发板的运行过程中,处理器为了和外界进行交互必然会使用中断这一机制来实现。
在处理器接收到中断信号后进入中断服务程序通常还需要做一些前期的处理,主要是中断现场的保护,然后转向用户编写的中断服务程序运行,最后还需要关闭中断源,恢复现场以及返回断点继续执行。
三星公司的S3C2440处理器提供了快速中断方式。
在本次课程设计中将UART产生的中断设置为快速中断方式,因此,需要在快速中断的中断处理程序中处理这一中断。
于是,可以把FIQ中断处理模块的流程图设计为图4。
图4FIQ中断处理模块流程图
3.2.4UART中断服务模块设计
UART中断服务模块比较简单,由于本次课程设计中中断控制器器开启了UART的数据接收中断,因此处理时只需考虑数据接收的问题。
在进入本模块后,首先需要检查串口是否收到数据,如果收到数据则需要检查数据是否存在错误,如果没有错误则需要将数据读出并减一后放到内存的特定地方,方便串口应用程序使用。
因此,可将其流程图设计为图5。
图5UART中断服务流程图
4、裸板上串口驱动程序的实现
在对裸板上串口驱动程序进行详细设计以后,现在需要根据流程图逐步实现裸板上的串口驱动程序。
4.1裸板启动模块的实现
本次课程设计的裸板启动第一步是跳过中断向量表,因此只需要使用一个标号和一条跳转指令即可实现。
禁用Cache和MMU时需要执行ARM920T数据手册中的4条协处理器操作指令即可实现。
在关闭中断时将当前状态处理器的I位和F位置为1即可,实现时直接使用两条状态字访问指令即可完成。
禁止看门狗定时器时直接将看门狗控制寄存器中的使能位清0即可。
在此之后,需要正确的设置开发板上所有的时钟频率。
在本次课程设计中把FCLK设置为405MHz,FCLK:
HCLK:
PCLK按照1:
4:
8的比例进行设置。
由于在飞凌的开发板上输入时钟为12.000MHz,在设置MPLLCON和UPLLCON寄存器的时候需要计算分频系数,但三星公司要求使用他们提供的数据,因此直接使用即可。
时钟分频系数和UPLLCON的设置可用代码4-1实现。
MPLLCON的配置可由代码4-2实现。
代码4-1:
MPLLCON的配置
ldrr0,=0x4c000014;0x4c000014CLKDIVN
movr1,#0x5;UCLK=Upll(=48.00MHz),HCLK=FCLK/4
;(=101.25MHz),PCLK=HCLK/2(50.625MHz)
strr1,[r0]
mrcp15,0,r1,c1,c0,0;setcpubusmodetoasynchronousmode
orrr1,r1,#0xc0000000
mcrp15,0,r1,c1,c0,0
ldrr0,=0x4c000008;0x4c000008UPLLCON
ldrr1,=0x00038022;setUpll=48.00MHz(Fin=12.00MHz)
strr1,[r0]
代码4-2:
MPLLCON的配置
ldrr0,=0x4c000004;0x4c000004MPLLCON
ldrr1,=0x0007f021;setMpll=405.00MHz(Fin=12.00MHz)
strr1,[r0]
在时钟配置完成后需要对内存控制器进行配置。
由于本次使用的开发板只有BANK6挂载了64MB的SDRAM,因此,只需要配置BANK6和BANK7即可(数据手册要求BANK6和BANK7的某些配置必须一致,如大小、地址分布等)。
设置内存控制器可用代码4-3实现。
代码4-3:
设置内存控制器
ldrr0,=0x4800001c;0x4800001cBANKCON6
ldrr1,=0x18001;sdram,rcd=3clock,9bitscolumnaddress
strr1,[r0]
addr0,r0,#4;0x48000020BANKCON7
strr1,[r0]
addr0,r0,#4;0x48000024REFRESH
ldrr1,=0xa004eb;enablerefresh,Auto/CBRrefresh,RP4clock,rc
;(4+4)clock,refreshcount1259
strr1,[r0]
;setsdramsize64MB(bank7isunavailable)
addr0,r0,#4;0x48000028BANKSIZE
movr1,#0x91;burstenable,64MB
strr1,[r0]
;setsdrammode
addr0,r0,#4;0x4800002cMRSRB6
movr1,#0x0020
strr1,[r0]