基于ARM9的硬件初始化程序的设计.docx
- 文档编号:8564474
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:19
- 大小:95.15KB
基于ARM9的硬件初始化程序的设计.docx
《基于ARM9的硬件初始化程序的设计.docx》由会员分享,可在线阅读,更多相关《基于ARM9的硬件初始化程序的设计.docx(19页珍藏版)》请在冰豆网上搜索。
基于ARM9的硬件初始化程序的设计
摘要
随着移动设备的流行和发展,嵌入式系统已经成为一个热点。
它并不是最近出现的新技术,只是随着微电子技术和计算机技术的发展,微控制芯片功能越来越大,而嵌入微控制芯片的设备和系统越来越多,从而使得这种技术越来越引人注目。
windows CE之所以脱颖而出,是因为Windows CE的高级特性,诸如网络、通信以及图形功能,和模块化设计结合在一起,为中级开发人员创建高复杂度嵌入式系统提供了理想的环境。
同时,Windows CE提供一个稳定、灵活且被广泛支持的操作系统来处理建立在嵌入式系统上的多种多样的硬件平台和软件应用程序。
本文所要研究的就是基于ARM嵌入式系统的DMA控制器驱动程序的设计。
关键字:
嵌入式,ARM,DMA
目录
第一章嵌入式发展历程-1-
1.1嵌入式的功能-2-
1.2嵌入式系统的特点-2-
第二章硬件-3-
2.1ARM920T,中央处理器-3-
2.2S3C2410典型内核(ARM920T)结构图-4-
第三章嵌入式系统的组成-5-
3.1硬件层-5-
3.2中间层-5-
3.3系统软件层-6-
第四章ARM处理器系统初始化过程-7-
4.1 ARM处理器系统初始化编程注意事项-7-
4.1.1将程序从flash搬移到DRAM中运行-7-
4.1.2系统工作在虚拟地址模式-8-
4.2嵌入式系统设计流程-8-
4.2.1ARM的启动-8-
4.2.2分配中断向量表-9-
4.2.3初始化存储器系统-9-
4.3初始化堆栈-10-
4.4ADS开发环境-10-
第五章软件设计-11-
5.1软件编码设置-11-
5.1.1建立新工程-11-
5.1.2添加文件-11-
5.2ADS1.2下仿真、调试-11-
5.3设计程序流程图-12-
第六章主要源代码-13-
6.1设置各异常模式服务子程序-13-
6.2初始化函数-13-
6.3设置2410的S3C2410PLL,Uart,LED,PortInit-17-
第七章运行结果及结论-22-
第八章心得体会-23-
参考文献-24-
第一章嵌入式发展历程
嵌入式行业的发展经历了从20世纪七十年代单片机的出现到今天各式各样的嵌入式微处理器、微控制器的大规模应用,已经有了近40年的发展历史。
70年代单片机的出现,使得汽车、家电、工业机器、通信装置以及成千上万种产品可以通过内嵌电子装置来获得更佳的使用性能:
更容易使用、更快、更便宜。
这些装置已经初步具备了嵌入式的应用特点,但是这时的应用只是使用8位的芯片,执行一些单线程的程序,还谈不上“系统”的概念。
从80年代早期开始,嵌入式系统的程序员开始用商业级的“操作系统”(例如之前仅在通用计算机上使用的UNIX系统)编写嵌入式应用软件,这样可以获取更短的开发周期,更低的开发资金和更高的开发效率,真正的“嵌入式系统”出现了。
确切点说,这个时候的操作系统是一个实时核,这个实时核包含了许多传统通用计算机操作系统的特征,包括任务管理、任务间通讯、同步与相互排斥、中断支持、内存管理等功能。
其中比较著名的有ReadySystem公司的VRTX、IntegratedSystemIncorporation(ISI)的PSOS和IMG的VxWorks、QNX公司的QNX等。
这些嵌入式操作系统都具有嵌入式的典型特点:
它们均采用占先式的调度,响应的时间很短,任务执行的时间可以确定;系统内核很小,具有可裁剪、可扩充和可移植性,可以移植到各种处理器上;较强的实时和可靠性,适合嵌入式应用。
这些嵌入式实时核的出现,使得应用开发人员得以从小范围的开发解放出来,同时也促使嵌入式有了更为广阔的应用空间。
90年代以后,随着软件规模不断上升,对嵌入式系统实时性要求不断提高,实时核逐渐发展为实时多任务操作系统(RTOS),并作为一种软件平台(包括驱动程序、嵌入式操作系统和支撑软件,不包括应用软件)逐步成为目前国际嵌入式系统的主流。
这时候更多的公司看到了嵌入式系统的广阔发展前景,开始大力发展自己的嵌入式操作系统。
除了上面的几家老牌公司以外,还出现了PalmOS,WinCE,嵌入式Linux,Lynx,Nucleus,以及国内的Hopen,DeltaOs等嵌入式操作系统。
随着嵌入式技术的发展前景日益广阔,相信会有更多的嵌入式操作系统软件出现。
1.1嵌入式的功能
嵌入式系统技术具有非常广阔的应用前景,其应用领域可以包括:
工业控制、交通管理、信息家电、家庭智能系统、POS网络及电子商务、环境工程与自然、机器人。
这些应用中,可以着重于在控制方面的应用。
就远程家电控制而言,除了开发出支持TCP/IP的嵌入系统之外,家电产品控制协议也需要制订和统一,这需要家电生产厂家来做。
同样的道理,所有基于网络的远程控制协议也需要与嵌入式系统之间实现接口,然后再由嵌入式系统来控制并通过网络实现控制。
所以,开发和探试嵌入式系统有着十分重要的意义。
相对于其他的领域,机电产品可以说是嵌入式系统应用最典型最广泛的领域之一。
从最初的单片机以现在的工控机、SOC在种机电产品中均有着巨大的市场。
工业设备是机电产品中最大的一类,在目前的工业控制设备中,工控机的使用非常广泛,这些工控机一般采用的是工业级的处理器和各种设备,其中以X86的MPU最多。
家电行业是嵌入式应用的另一大行业,我们传统的电视,电冰箱当然其中也嵌有处理器,但是这些处理器只是在控制方面应用。
而现在只有按钮、开关的电器显然已经不能满足人们的日常需求,具有用户界面,能远程控制,智能管理的电器是未来的发展趋势。
到我们身边。
1.2嵌入式系统的特点
嵌入式系统的特点与定义不同,它是由定义中的三个基本要素衍生出来的。
不同的嵌入式系统其特点会有所差异。
与“计算机系统”的相关特点:
嵌入式系统必须是能满足对象系统控制要求的计算机系统。
与上两个特点相呼应,这样的计算机必须配置有与对象系统相适应的接口电路。
另外,在理解嵌入式系统定义时,不要与嵌入式设备相混淆。
嵌入式设备是指内部有嵌入式系统的产品、设备,例如,内含单片机的家用电器、仪器仪表、工控单元、机器人、手机、PDA等。
第二章硬件
2.1ARM920T,中央处理器
ARM920T是ARM920TDMI系列中的一款通用性的微处理器,ARM920TDMI系列微处理器包含如下几种类型的内核。
ARM9TDMI:
只有内核。
ARM940T:
由内核、高速缓存和内存保护单元组成。
ARM920T:
由内核、高速缓存和内存管理单元(MMU)组成。
ARM9TDMI采用5级流水线,具体如下。
取指:
从存储器中取出指令,并将其放入指令流水线。
译码:
对指令进行译码。
执行:
把一个操作数移位,产生ALU的结果。
缓冲/数据:
如果需要,则访问数据存储器;否则ALU的结果只是简单地缓冲1个时钟周期,以便所有的指令具有同样的流水线流程。
回写:
将指令产生的结果回写到寄存器,包括任何从存储器中读取的数据。
2.2S3C2410典型内核(ARM920T)结构图
MMU:
(MemoryManagementUnit)内存处理单元:
它负责虚拟地址到物理地址的映射,并提供硬件机制的内存访问权限检查。
CACHE:
高速缓冲处理器:
在主存和CPU通用寄存器之间设置一个高速的、容量相对较小的存储器,把正在执行的指令地址附近的一部分指令或数据从主存调入这个存储器,供CPU在一段时间内使用,这对提高程序的运行速度有很大的作用。
TLB(TranslationLookasideBuffers,TLB):
使用一个高速、容量相对较小的存储器来存储近期用到的页表条目,以避免每次地址转换时都到主存区查找,这样可以大幅度的提高性能。
这个存储器用来帮助快速地进行地址转换,称为“转译查找缓存”
VA(VirtualAddress)虚拟地址:
MVA(ModifiedVirtualAddress)变换后的虚拟地址:
PA(PhysicalAddress)物理地址:
没启动MMU时,CPU核、cache、MMU、外设等所有部件使用的都是物理地址;
启动MMU时,CPU核对外发出虚拟地址VA;VA被转换成MVA供cache、MMU使用,在这里MVA被转换成PA;最后使用PA读写实际设备;
第三章嵌入式系统的组成
一个嵌入式系统装置一般都由嵌入式计算机系统和执行装置组成嵌入式计算机系统是整个嵌入式系统的核心,由硬件层、中间层、系统软件层和应用软件层组成。
执行装置也称为被控对象,它可以接受嵌入式计算机系统发出的控制命令,执行所规定的操作或任务。
执行装置可以很简单,如手机上的一个微小型的电机,当手机处于震动接收状态时打开;也可以很复杂,如SONY智能机器狗,上面集成了多个微上控制电机和多种传感器,从而可以执行各种复杂的动作和感受种状态信息。
下面对嵌入式计算机系统的组成进行介绍。
3.1硬件层
硬件层中包含嵌入式微处理器、存储器(SDRAM、ROM、Flash等)、通用设备接口和I/O接口(A/D、D/A、I/O等)。
在一嵌入式处理器基础上添加电源电路、时钟电路和存储器电路,就构成了一个嵌入式核心控制模块。
其中操作系统和应用程序都可以固化在ROM中。
3.2中间层
硬件层与软件层之间为中间层,也称为硬件抽象层(HardwareAbstractLayer,HAL)或者板级支持包(BoardSupportPackage,BSP),它半系统上层软件与底层硬件分离开来,使系统的底层驱动程序与硬件无关,上层软件开发人员无需关心底层硬件的具体情况,根据BSP层提供的接口即可进行开发。
该层一般包含相关底层硬件的初始化、数据的输入/输出操作和硬件设备的配置功能。
实际上,BSP是一个介于操作系统和底层硬件之间的软件层次,包括了系统中大部分与硬件联系紧密的软件模块。
设计一个完整的BSP需要完成两部分工作:
嵌入工系统的硬件初始化的BSP功能,设计硬件相关的设备驱动。
3.3系统软件层
系统软件层由实时多任务操作系统(Real-timeOperationSystem,RTOS)、文件系统、图形用户接口(GraphicUserInterface,GUI)、网络系统及通用组件模块组成。
RTOS是嵌入式应用软件的基础和开发平台。
第四章ARM处理器系统初始化过程
每次系统上电/复位启动时,处理器都处于一种最低性能即只有最基本功能的状态,此时它只能从复位向量地址处去读取指令,其他功能模块都处于禁止或者不可预知状态,而一旦处理器从复位向量地址位置读取到第一条指令开始执行,那么从软件的角度看,处理器和整个系统就开始进入了软件可控状态,系统下面的行为就由软件流程决定,软件要做的第一件事就是初始化整个系统。
系统初始化的一般顺序为:
1)禁止MMU,关闭中断,禁止cache;
2)根据硬件设计配制好处理器时钟、DRAM时钟、定时器时钟;
3)根据系统中所用的flash和DRAM芯片容量和电气参数设置它们的起始地址、容量、刷新频率等;
4)将固化在flash芯片中的程序搬移到DRAM内存中;
5)使能cache,使能MMU,跳转到DRAM内存中运行继续初始化,包括根据具体应用以及系统中的硬件配置初始化各个功能模块、安装好异常中断处理程序、使能中断等;
6)进行操作系统相关初始化。
4.1 ARM处理器系统初始化编程注意事项
在上述系统初始化过程中有以下两点需要注意,如果处理不好就可能出现程序跑飞的情况。
4.1.1将程序从flash搬移到DRAM中运行
在现代嵌入式系统中,由于DRAM的速度比flash的速度快很多,所以除了极少数对性能要求不高但对成本要求很高的系统把程序放在flash中并一直在flash中运行外,大部分嵌入式系统都是将程序从flash芯片搬到DRAM芯片中运行,这样就会存在一个问题,因为我们编译链接程序都是将程序链接到程序最后运行的场所DRAM中的地址上,但是系统启动时只能从flash中读取指令,所以从系统启动读取的第一条指令到进入到DRAM运行前的程序代码是与地址无关的,如果要跳转到某个标号处运行,必须是基于pc的,不能是绝对跳转指令,因为此时程序存放的位置与其所链接到的位置不同,如果使用跳转指令,程序将跑飞。
4.1.2系统工作在虚拟地址模式
MMU使得系统能够更好地管理内存,因为MMU可以将同一段物理内存映射到多段虚拟地址空间上,而且可以将物理上不连续的内存映射到连续的虚拟内存空间(减少内存碎片),另外MMU还可以控制虚拟内存区段的缓冲特性和访问权限,所以MMU可以提高内存的使用效率,使程序仿佛能够使用比实际物理内存容量多得多的内存空间,提高系统性能,同时也增加了系统的安全性,所以在带有MMU功能的处理器系统中,一般都应该使能MMU,充分利用其功能。
这样一来也会导致一个和上面相同的问题,因为在使用MMU的系统中,各种物理存储空间的实际物理地址与对应的虚拟地址设置得各不相同,包括flash和DRAM的物理地址与虚拟地址。
系统启动时MMU被禁止,系统运行在实模式即物理地址模式,但程序却被编译链接到了虚拟地址上,这样在使能MMU之前,存放在flash或DRAM中的程序的实际地址(物理地址)与其链接到的地址是不相同的,所以从系统启动到MMU使能之间的程序代码也应该是与地址无关的,如果要跳转到某个标号处运行,必须是基于pc的,不能是绝对跳转指令,否则程序也将跑飞。
4.2嵌入式系统设计流程
本实验仅使用实验教学系统的CPU板。
在进行本实验时,LCD电源开关、音频的左右声道开关、AD通道选择开关、触摸屏中断选择开关等均应处在关闭状态。
4.2.1ARM的启动
基于ARM芯片的应用系统,多数为复杂的片上系统,该复杂系统里,多数硬件模块都是可配置的,需要由软件来预先设置其需要的工作状态,因此在用户的应用程序之前,需要由专门的一段代码来完成对系统基本的初始化工作。
由于此类代码直接面对处理器内核和硬件控制器进行编程,故一般均用汇编语言实现。
ARM要求中断向量表必须放置在从0x00000000地址开始,连续32个字节的空间内。
每当一个中断发生后,ARM处理器便强制把PC指针指向对应中断类型的向量表中的地址。
因为每个中断只占据向量表中4个字节的存储空间,只能放置一条ARM指令,所以,通常放一条跳转指令让程序跳转到存储器的其他地方,再执行中断处理。
4.2.2分配中断向量表
其中关键字ENTRY是指定编译器保留这段代码,链接的时候要确保这段代码被链接在整个程序的入口地址,该地址也就是RO的连接地址。
当ARM启动时,PC指针会自动寻找该关键字从该关键字处执行,该关键字的地址应满足4字节对齐的地址。
当中断控制器使能外设模块为向量中断时,如定时器向量中断,ADC向量中断,外部中断向量中断等等,外设中断向量表同理需要相应的跳转指令,以发生相应中断时从对应的中断向量表跳到存储器的某个地方,一般可选择让其跳到SDRAM的高端地址,然后,再跳入中断服务程序的地址,往下执行。
4.2.3初始化存储器系统
存储器类型,存储的容量以及时序配置、总线宽度等等。
通常Flash和SRAM同属于静态存储器类型,可以合用同一个存储器端口;而DRAM因为有动态刷新和地址线复用等特性,通常配有专用的存储器端口。
除存储器外,网络芯片的存储器相关配置,外接大容量的存储卡的配置均在此处实现。
存储器端口的接口时序优化是非常重要的,这会影响到整个系统的性能。
因为一般系统运行的速度瓶颈都存在于存储器访问,所以存储器访问时序应尽可能的快;而同时又要考虑到由此带来的稳定性问题。
4.3初始化堆栈
因为ARM有7种执行状态,每一种状态的堆栈指针寄存器(SP)都是独立的。
所以,对程序中需要用到的每一种模式都要给SP定义一个堆栈地址。
方法是改变状态寄存器内的状态位,使处理器切换到不同的状态,然后给SP赋值。
注意:
不要切换到User模式进行User模式的堆栈设置,因为进入User模式后就不能再操作CPSR回到别的模式了,可能会对接下去的程序执行造成影响。
4.4ADS开发环境
ADS(ARMDeveloperSuite),ADS1.2是为嵌入式ARM设计的一整套软件开发工具,是从最初的软件原型到最终优化的ROM代码。
ADS1.2发布于2001年12月份,其支持的主机系统有IBMcompatiblePCswithWindows95,98,2000,MEorNT4和RedHatLinux6.2&7.1。
ADS的功能有:
(1)支持最新的ARM内核,包括ARMM926EJ-S,ARM9EJ-S,VFPv2,
(2)支持V5TEJ体系结构
(3)支持ARM和Thumb的C和C++语言
(4)支持ARM和Thumb的汇编指令
(5)软仿真、在线仿真和在线编程、调试
(6)主机系统可支持RedHatLinux(6.2and7.1)
(7)库管理器可合并各种库
(8)为可重定位的代码设置新的链接选项
(9)编译器同时输出汇编码和目标码[3]
第五章软件设计
5.1软件编码设置
5.1.1建立新工程
可以将该新建的空的项目文件作为模板保存起来。
首先,要将该项目工程文件一个合适的名字,如S3C2410ARM.mcp等,然后,在ADS1.2软件安装的目录下的Stationary目录下新建一个合适的模板目录名,如,S3C2410ARMExecutableImage,再将刚刚设置完的S3c2410ARM.mcp项目文件存放到该目录下即可。
5.1.2添加文件
新建项目工程后,就可以执行菜单Project|AddFiles把和工程所有相关的文件加入,ADS1.2不能自动进行文件分类,用户必须通过Project|CreateGroup来创建文件夹,然后把加入的文件选中,移入文件夹。
或者鼠标放在文件填加区,右键点击,即出!
如图5.1
图5.1
5.2ADS1.2下仿真、调试
在ADS1.2下进行仿真调试,首先需要一根仿真调试电缆。
其驱动程序的安装和使用在光盘中的\实验软件\ARM9_RDI中,里面有相关的文档。
在连上调试电缆后,给实验箱上电,打开调试软件AXDDebugger。
点击File|loadimage加载文件ADS.axf(\实验程序\HARDWARE\ADS\实验一\ADS\ADS_data目录下)。
打开超级终端,设置其参数为:
波特率为115200,数据位数8,奇偶校验无,停止位无1,数据流控无。
点击全速运行。
5.3设计程序流程图
图5.1基于ARM9的硬件初始化程序设计的程序流程图
第六章主要源代码
6.1设置各异常模式服务子程序
该程序段功能:
设成死循环为调试用,一旦发生此类异常,程序便跳入异常模式服务子程序,终止程序运行。
voidHaltUndef(void)
{
Uart_Printf("Undefinedinstructionexception.\n");
while
(1);
}
voidHaltSwi(void)
{
Uart_Printf("SWIexception.\n");
while
(1);
}
voidHaltPabort(void)
{
Uart_Printf("Pabortexception.\n");
while
(1);
}
voidHaltDabort(void)
{
Uart_Printf("Dabortexception.\n");
while
(1);
}
6.2初始化函数
//异常及中断控制器的初始化
voidIsr_Init(void)
{
pISR_UNDEF=(unsigned)HaltUndef;
pISR_SWI=(unsigned)HaltSwi;
pISR_PABORT=(unsigned)HaltPabort;
pISR_DABORT=(unsigned)HaltDabort;
rINTMOD=0x0;//All=IRQmode
rINTMSK=BIT_ALLMSK;//Allinterruptismasked.
rINTSUBMSK=BIT_SUB_ALLMSK;//Allsub-interruptismasked.<-April01,2002SOP
}
//目标板初始化程序,主函数中只需调用此函数,即可完成目标板的初始化
voidTarget_Init(void)
{
MMU_Init();
ChangeClockDivider(1,1);//1:
2:
4
ChangeMPllValue(0xa1,0x3,0x1);//FCLK=202.8MHz
Port_Init();
Isr_Init();
Uart_Init(0,115200);
Uart_Select(0);
}
voidMMU_Init(void)//MMU的初始化
{
inti,j;
MMU_DisableDCache();
MMU_DisableICache();
//如果使用回写,则应该清楚DCache
for(i=0;i<64;i++)
for(j=0;j<8;j++)
MMU_CleanInvalidateDCacheIndex((i<<26)|(j<<5));
MMU_InvalidateICache();
#if0
//为了快速完成MMU_Init(),Icache在这打开
MMU_EnableICache();
#endif
MMU_DisableMMU();
MMU_InvalidateTLB();
//MMU_SetMTT(intvaddrStart,intvaddrEnd,intpaddrStart,intattr)
MMU_SetMTT(0x00000000,0x07f00000,0x00000000,RW_CNB);
//bank0
MMU_SetMTT(0x08000000,0x0ff00000,0x08000000,RW_CNB);
//bank1
MMU_SetMTT(0x10000000,0x17f00000,0x10000000,RW_NCNB);//bank2
MMU_SetMTT(0x18000000,0x1ff00000,0x18000000,RW_NCNB);//bank3
MMU_SetMTT(0x20000000,0x27f00000,0x20000000,RW_NCNB);//bank4
MMU_SetMTT(0x28000000,0x2ff00000,0x28000000,RW_NCNB);//bank5
MMU_SetMTT(0x30000000,0x30f00000,0x30000000,RW_CB);//bank6-1
MMU_SetMTT(0x31000000,0x33e00000,0x31000000,RW_NCNB);
//bank6-2
MMU_SetMTT(0x33
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 ARM9 硬件 初始化 程序 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)