基于ARM9的DMA控制器驱动程序的设计.docx

上传人:b****6 文档编号:6287425 上传时间:2023-01-05 格式:DOCX 页数:16 大小:215.54KB
下载 相关 举报
基于ARM9的DMA控制器驱动程序的设计.docx_第1页
第1页 / 共16页
基于ARM9的DMA控制器驱动程序的设计.docx_第2页
第2页 / 共16页
基于ARM9的DMA控制器驱动程序的设计.docx_第3页
第3页 / 共16页
基于ARM9的DMA控制器驱动程序的设计.docx_第4页
第4页 / 共16页
基于ARM9的DMA控制器驱动程序的设计.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

基于ARM9的DMA控制器驱动程序的设计.docx

《基于ARM9的DMA控制器驱动程序的设计.docx》由会员分享,可在线阅读,更多相关《基于ARM9的DMA控制器驱动程序的设计.docx(16页珍藏版)》请在冰豆网上搜索。

基于ARM9的DMA控制器驱动程序的设计.docx

基于ARM9的DMA控制器驱动程序的设计

摘要

 随着移动设备的流行和发展,嵌入式系统已经成为一个热点。

它并不是最近出现的新技术,只是随着微电子技术和计算机技术的发展,微控制芯片功能越来越大,而嵌入微控制芯片的设备和系统越来越多,从而使得这种技术越来越引人注目。

windows CE之所以脱颖而出,是因为Windows CE的高级特性,诸如网络、通信以及图形功能,和模块化设计结合在一起,为中级开发人员创建高复杂度嵌入式系统提供了理想的环境。

同时,Windows CE提供一个稳定、灵活且被广泛支持的操作系统来处理建立在嵌入式系统上的多种多样的硬件平台和软件应用程序。

本文所要研究的就是基于ARM嵌入式系统的DMA控制器驱动程序的设计。

关键字:

嵌入式,ARM,DMA

目录

第1章、设计目的1

第2章、设计思路2

2.1ARM实验箱硬件资源概述2

2.2ARM的DMA控制器3

第3章、关键技术4

3.1ARM9处理器4

3.2嵌入式C语言开发技术5

3.3ADS开发环境6

3.4DMA控制器7

3.4.1DMA控制器工作原理7

3.4.2DMA方式特点8

3.4.3DMA方式的具体过程8

3.4.4DMA通道可处理的4种情况8

3.5实验详解8

第4章、程序流程12

第5章、主要源代码13

5.1主函数设计13

5.2定时器初始化程序14

第6章、运行结果及结论15

6.1运行结果15

6.2结论15

第7章、参考文献16

第1章、设计目的

通过课程设计,熟悉基于ARM微处理器的嵌入式系统开发的过程,掌握嵌入式系统开发的知识。

针对某一嵌入式微处理器进行实际开发,锻炼实践动手能力。

了解并熟悉DMA的概念及其工作原理,掌握ARM相应的寄存器配置,能够用C编写相应的程序。

 

第2章、设计思路

2.1ARM实验箱硬件资源概述

EL-ARM-830型教学实验系统属于一种综合的教学实验系统,该系统采用了目前在国内普遍认同的ARM920T核,32位微处理器,实现了多模块的应用实验。

它是集学习、应用编程、开发研究于一体ARM实验教学系统。

用户可根据自己的需求选用不同类型的CPU适配板,兼容ARM7与ARM9,而不需要改变任何配置,同时,实验系统上的Tech_V总线能够拓展较为丰富的实验接口板。

用户在了解Tech_V标准后,更能研发出不同用途的实验接口板。

除此之外,在实验板上有丰富的外围扩展资源(数字、模拟信号发生器,数字量IO输入输出,语音编解码、人机接口等单元),可以完成ARM的基础实验、算法实验和数据通信实验、以太网实验。

图2.1EL-ARM-830实验教学系统的功能框图

2.2ARM的DMA控制器

中断方式是在CPU的控制下进行的,中断方式尽管可以实时的响应外部中断源的请求,但由于它需要额外的开销时间,以及中断处理服务时间,使得的中断的响应频率受到限制。

当高速外设与计算机系统进行信息交换时,若采用中断方式,CPU将会频繁的出现中断而不能完成主要任务或者根本来不及响应中断而造成数据的丢失现象,因而传输速率受CPU运行指令速度的限制。

采取DMA方式,即(DirectMemoryAcess),可以确保外设和计算机系统进行高速信息交换。

这种方式是存储器与外设在DMA控制器的控制下,直接传送数据而不通过CPU,传输速率主要取决于存储器存取速度。

它为高速I/O设备和存储器之间的批量数据交换提供了直接的传输通道。

这里,“直接”的含义是在DMA传输过程中,DMA控制器负责管理整个操作,CPU不参与管理。

S3C2410有4个通道控制器,作为简单的事例,阐述原理。

本程序是用DMA方法实现串口数据的发送,故使用BDMA。

 

第3章、关键技术

3.1ARM9处理器

新一代的ARM9处理器,通过全新的设计,采用了更多的晶体管,能够达到两倍以上于ARM7处理器的处理能力。

这种处理能力的提高是通过增加时钟频率和减少指令执行周期实现的。

ARM9系列包括三种处理器:

ARM926EJ-S、ARM946E-S和ARM968E-S。

[1]

1、时钟频率的提高

ARM7处理器采用3级流水线,而ARM9采用5级流水线。

增加的流水线

设计提高了时钟频率和并行处理能力。

5级流水线能够将每一个指令处理分配到5个时钟周期内,在每一个时钟周期内同时有5个指令在执行。

2、指令周期的改进

指令周期的改进对于处理器性能的提高有很大的帮助。

性能提高的幅度依赖于代码执行时指令的重叠,这实际上是程序本身的问题。

对于采用最高级的语言,一般来说,性能的提高在30%左右。

a)loads指令和stores指令

指令周期数的改进最明显的是loads指令和stores指令。

从ARM7到ARM9这两条指令的执行时间减少了30%。

指令周期的减少是由于ARM7和ARM9两种处理器内的两个基本的微处理结构不同所造成的。

ARM9有独立的指令和数据存储器接口,允许处理器同时进行取指令和读写数据。

这叫做改进型哈佛结构。

而ARM7只有数据存储接口,它同时用来取指令和数据访问。

5级流水线引入了独立的存储器和写回流水线,分别用来访问存储器和将结果写回寄存器。

b)互锁技术

当指令需要的数据因为以前的指令没有执行完而没有准备好就会产生管道互锁。

当管道互锁发生时,硬件会停止这个指令的执行,直到数据准备好为止。

虽然这种技术会增加代码执行时间,但是为初期的设计者提供了巨大的方便。

编译器以及汇编程序员可以通过重新设计代码的顺序或者其它方法来减少管道互锁的数量。

c)分支指令

ARM9和ARM7的分支指令周期是相同。

而且ARM9TDMI和ARM8E-S并没有对分支指令进行预测处理。

3、ARM9特点

以ARM9E-S为例介绍ARM9处理器的特点。

其主要特点如下:

a)32bit定点RISC处理器,改进型ARM/Thumb代码交织,增强性乘法设计。

支持实时(real-time)调试;

b)片内指令和数据SRAM,而且指令和数据的存储器容量可调;

c)片内指令和数据告诉缓冲器(cache)容量从4K字节到1M字节;

d)设置保护单元(protcctionunit),非常适合嵌入式应用中队存储器进行分段和保护;

e)采用AMBAAHB总线接口,为外设提供统一的地址和数据总线;

f)支持外部协处理器,指令和数据总线有简单的握手信令支持;

g)支持标准基本逻辑单元扫描测试方法学,而且支持BIST;

h)支持嵌入式跟踪宏单元,支持实时跟踪指令和数据。

3.2嵌入式C语言开发技术

不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较强的硬件直接操作能力。

无疑,汇编语言具备这样的特质。

但是,由于汇编语言开发的复杂性,它并不是嵌入式系统开发的一般选择。

而与之相比,C语言――一种“高级的低级”语言,则成为嵌入式系统开发的最佳选择。

[3]

在C语言中,宏是产生内嵌代码的唯一方法,对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法。

嵌入式开发的核心就是利用最少的资源最高的效的实现所需功能。

C语言在嵌入式中控制系统开发中的优势

汇编语言有其执行效率高的优点,但其可移植性和可读性差,以及它本身就是一种编程效率低下的低级语言,这些都使他的编程和维护极不方便,从而导致整个系统的可靠性也较差,而使用C语言进行嵌入式控制系统的开发,有着汇编语言不可比拟的优势。

1、编程调试灵活方便

C语言具有灵的编程方式,当前几乎看了所有的嵌入式控制系统都有相应的C语言级别的仿真调试系统,使得调试十分方便。

2、生成的代码编译效率高。

3、编写的程序完全模块化。

4、可移植性好

一种语言所编写的C语言程序,只需将部分与相关的地方进行适度的修改,就可方便的移植到另外一种系列上。

5、便与项目维护管理

用C语言发的代码便与开发小组计划项目,灵活管理,分工工作,以及后期维护,基本上可以杜绝因开发人员变化而给项目进度或后期维护或升级带来影响。

3.3ADS开发环境

ADS(ARMDeveloperSuite),是在1993年由Metrowerks公司开发,是ARM处理器下最重要的开发工具。

ADS是全套的实时开发软件工具,包编译器生成的代码密度和执行速度优异。

可快速低价地创建ARM结构应用。

ADS对汇编、C/C++、java支持的均很好,是目前最成熟的ARM开发工具。

很多ARM开发软件也是借用的ADS的编译器。

[2]

1、ADS包括三种调试器:

AXD(ARMeXtendedDebugger):

ARM扩展调试器;

Armsd(ARMSymbolicDebugger):

ARM符号调试器;

与老版本兼容的Windows或Unix下的ARM调试工具,ADW/ADU(ApplicationDebuggerWindows/Unix)。

其中AXD不仅拥有低版本ARM调试器的所有功能,还新添了图形用户界面,更方便的视窗管理数据显示,格式化和编辑以及全套的命令行界面。

该产品还包括RealMonitorTM(可以再前台调试的同时断点续存并且在不中断应用的情况下读写内存跟踪调试工具)。

2、组成介绍

a)编译器:

ADS提供多种编译器,以支持ARM和Thumb指令的变异。

armcc是ARMC编译器

tcc是ThumbC编译器

armcpp是ARMC++编译器

tcpp是ThumbC++编译器

armasm是ARM和Thumb的编译器

b)链接器:

armlink是ARM链接器。

该命令既可以将编译得到的一个或多个目标文件和相关的一个或多个库文件进行链接,生成一个可执行文件,也可以将多个目标文件部分链接成一个目标文件,以供进一步的链接。

c)符号调试器:

armsd是ARM和Thumb的符号调试器。

它能够进行源码级的程序调试。

用户可以再用C或汇编语言写的代码中进行单步调试、设置断点、查看变量值和内存单元的内容。

d)fromELF:

将ELF格式的文件转换为各种格式的输出文件,包括bin格式的映像文件、Motorola32位S格式影像文件、Intel32位格式映像文件和Verilog十六进制文件。

e)armar:

armar是ARM库函数生成器,它将一系列ELF格式的目标文件以库函数的形式集合在一起。

用户可以把一个库传递给一个链接器以代替几个ELF文件。

f)CodeWarrior:

CodeWarrior集成开发环境(IDE)为管理和开发项目提供了简单多样化的图形用户界面,用户可以使用ADS的CodeWarriorIDE为ARM和Thumb处理器开发用C、C++或者ARM汇编语言编写的程序代码。

g)C和C++库:

ADS提供ANSIC库函数和C++库函数,支持被编译的C和C++大面。

用户可以把C库中的与目标相关的函数作为自己应用程序中的一部分,重新进行代码的实现。

3.4DMA控制器

3.4.1DMA控制器工作原理

所谓DMA方式,即直接存储器存取,是指存储器与外设在DMA控制器的控制下,直接传送数据而不通过CPU,传输速率主要取决于存储器存取速度。

这里,直接的含义是指在DMA传送过程中,DMA控制器负责管理整个操作,CPU不参与管理。

DMA方式为高速I/O设备和存储器之间的批量数据交换提供了直接的传输通道。

[4]

3.4.2DMA方式特点

它不是使用软件而是采用一个专门的控制器来控制内存与外设之间的数据交流,并且无须CPU介入,从而大大提高了CPU的工作效率;还排除了CPU因并行设备过多而来不及处理以及因速度不匹配而造成数据丢失等现象。

3.4.3DMA方式的具体过程

1.外设向DMA控制器发出DMA请求。

2.DMA控制器向CPU发出总线请求信号。

3.CPU执行完现行的总线周期后,向DMA控制器发出响应请求的回答信号。

4.CPU将控制总线、地址总线及数据总线让出,由DMA控制器进行控制。

5.DMA控制器向外部设备发出DMA请求回答信号。

6.进行DMA传送。

7.数据传送完毕,DMA控制器通过中断请求线发出中断信号。

CPU在接收到中断信号后,转入中断处理程序进行后续处理。

8.中断处理结束后,CPU返回到被中断的程序继续执行。

CPU重新获得总线控制权。

[6]

3.4.4DMA通道可处理的4种情况

1.源和目的都在系统总线上;

2.源在系统总线上,目的在外围总线上;

3.源在外围总线上,目的在系统总线上;

4.源和目的都在外围总线上。

3.5实验详解

首先,要正确的对S3C2410相关寄存器的进行配置:

[5]

在表3.1中,DISRCn为DMA要传送数据地址的初始化寄存器。

 

表3.1

表3.2中,DIDSTn为DMA目标地址初始化寄存器。

表3.2

表3.3为DMA源数据的相关配置。

LOC[1]0:

源数据在ARM高速总线上;

1:

源数据在ARM外围总线上;

INC[0]0:

源数据每传送一个,源数据地址增长一个;

1:

源数据的地址是固定不变的;

表3.3

表3.4为DMA目标数据的相关配置。

LOC[1]0:

目标数据在ARM高速总线上;

1:

目标数据在ARM外围总线上;

INC[0]0:

目标数据每传送一个,源数据地址增长一个;

1:

目标数据的地址是固定不变的;

表3.4

 

接下来配置DCONn(n=0,1,2,3)寄存器,见表3.5。

表3.5

DCONn

描述

DMD_HS

[31]

选择请求模式或握手模式

0:

请求模式1:

握手模式

SYNC

[30]

选择同步模式

0:

DREQ和DACK与APB时钟同步

1:

DREQ和DACK与AHB时钟同步

INT

[29]

当计数器到达0时是否使能中断

0:

禁止中断1:

使能中断

TSZ

[28]

选择传输单位的大小

0:

单位传输1:

长度为4的猝发式传输

SERVMODE

[27]

选择服务模式

0:

单服务模式

1:

整服务模式

HWSRCSEL

[26:

24]

为DMA设置DMA请求源.

DCON0:

000:

nXDREQ0001:

UART0010:

SDI011:

Timer100:

USBdeviceEP1

DCON1:

000:

nXDREQ1001:

UART1010:

I2SSDI011:

SPI100:

USBdeviceEP2

DCON2:

000:

I2SSDO001:

I2SSDI010:

SDI011:

Timer100:

USBdeviceEP3

DCON3:

000:

UART2001:

SDI010:

SPI011:

Timer100:

USBdeviceEP4

SWHW_SEL

[23]

在DMA软件请求源和硬件请求源之间选择

0:

软件请求模式,DMA通过设置DMASKTRIG寄存器SW_TRIG位触发

1:

硬件请求模式,DMA通过本寄存器的HWSRCSEL位设置来触发

RELOAD

[22]

当当前计数器值等于零后是否重新加载

0:

自动加载1:

DMA通道关闭,不重新加载

DSZ

[21:

20]

传输数据的大小

0:

字节1:

半字2:

字3:

保留

TC

[19:

0]

初始化计数器,在这里设置计数器的值。

接下来配置DMASKTRIGn如下表(表3.6)所示:

表3.6

DMASKTRIGn

描述

STOP

[2]

停止DMA操作

1:

当前自动传输结束立刻停止,如果当前没有自动传输,DMA立即停止,CURR_TC=0

ON_OFF

[1]

DMA通道开关位

0:

通道关闭,DMA请求被忽略

1:

通道打开。

SW_TRIG

[0]

DMA通道通过软件请求模式触发

1:

对这个DMA控制器请求一次DMA操作。

注:

这个位只有在DCONn[23]选择1并且本寄存器的ON_OFF位置1才能生效。

当DMA操作开始后,本位自动清0

第4章、程序流程

该程序的流程是,在ADS调试环境下,在主程序Main函数中的rDMASKTRIG0=(1<<1);处设置断点,全速运行映象文件到该处。

下一步单步运行,在串口助手的接收栏中,将接收50个字符,在串口助手的最下栏可以看到接收的字符数,而此时CPU已经停止,但是串口仍然在发送数据,这些数据的传送就是通过DMA控制器发送的,它没有通过CPU,这说明了DMA的直接存储器访问的功能得以实现。

程序流程图如下:

图4.1程序流程图

 

第5章、主要源代码

5.1主函数设计

以下函数为各异常模式服务子程序。

设成死循环是为调试用,一旦发生此类异常,程序便跳入异常模式服务子程序,终止程序运行。

void__irqDma_ISR(void)//DMA中断服务程序

{

//Uart_Printf("Dma_ISR");

rSRCPND|=BIT_DMA0;

rINTPND|=BIT_DMA0;

}

voidDmaINT_Init(void)//DMA中断初始化

{

if((rINTPND&BIT_DMA0))

{

rSRCPND|=BIT_DMA0;

}

pISR_DMA0=(int)Dma_ISR;

rINTMSK&=~(BIT_DMA0);//开中断;

}

 

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

Isr_Init();

Port_Init();

Uart_Init(0,115200);

Uart_Select(0);

DmaINT_Init();

}

5.2定时器初始化程序

voidTimer1_init(void)

{

rGPGCON=rGPGCON&0xfff0ffff|0x00050000;//配置GPG口为信号输出

rGPGDAT=rGPGDAT|0x300;

rTCFG0=255;//Prescaler0=255

rTCFG1=0<<4;

rTCNTB1=48828;//在pclk=50MHZ下,1秒钟的记数值rTCNTB1=50000000/4/256=48828;

rTCMPB1=0x00;

rTCON=(1<<11)|(1<<9)|(0<<8);//禁用定时器1,手动加载

rTCON=(1<<11)|(0<<9)|(1<<8);//启动定时器1,自动装载

}

第6章、运行结果及结论

6.1运行结果 

串口助手的最下栏显示接收的字符数

 

6.2结论

通过学习,我知道了中断方式是在CPU的控制下进行的,中断方式尽管可以实时的响应外部中断源的请求,但额外的开销时间以及中断处理服务时间,使得中断响应频率受到限制。

当高速外设与计算机系统进行信息交换时,若采用中断方式,CPU将会频繁的出现中断而不能完成主要任务,或者根本来不及响应中断而造成数据的丢失,因而传输速率受CPU运行指令速度的限制。

而DMA方式,即存储器与外设在DMA控制器的控制下,直接传送数据而不通过CPU,传送速率主要取决于存储器存取速度。

“直接”的含义是指DMA传输过程中,DMA控制器负责管理整个操作,CPU不参与管理。

DMA方式为高速I/O设备和存储器之间的批量数据交换提供了直接的传输通道。

 

第7章、参考文献

[1]徐英慧马忠梅王磊王琳编著.ARM9嵌入式系统设计.北京.北京航空航天大学出版社.2011

[2]杨宗德编著.嵌入式ARM系统原理与实例开发.北京.北京大学出版社.2007

[3]马忠梅马广云徐英慧田译编著.ARM嵌入式处理结构与应用基础[M].北京.北京航空航天大学出版社.2002

[4]田泽编著.嵌入式系统开发与应用[M].北京.北京航空航天大学出版社.2005

[5]田泽编著.嵌入式系统开发与应用实验教程[M].北京.北京航空航天大学出版社.2004

[6]杜春雷编著.ARM体系结构与编程[M].北京.清华大学出版社.2003

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

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1