《DMA实验报告.doc》由会员分享,可在线阅读,更多相关《DMA实验报告.doc(4页珍藏版)》请在三一办公上搜索。
1、实验七 DMA实验一、 实验目的 1、 了解DMA传送原理。2、 掌握S3C44B0 DMA控制器的使用。3、 掌握DMA软件编程方法。二、 实验内容 1、编写单字节方式、双字节方式和四字节方式常规内存拷贝及时间检测程序。2、编写DMA方式内存拷贝及时间检测程序。3、比较DMA方式内存拷贝及常规内存拷贝的效率。三、 实验设备1、 硬件S3C44B0教学实验箱PC机JTAG仿真器串口线2、 软件 PC机操作系统ARM Developer Suite v1.2Multi-ICE V2.2.5DNW(或者超级终端)四、 预备知识 1、 了解ADT集成开发环境的基本功能。2、 了解DMA的原理以及处理
2、步骤。3、 熟悉S3C44B0 DMA有关的寄存器。五、 基础知识1、 DMA方式:当高速外设要与系统内存或者要在系统内存的不同区域之间,进行大量数据的快速传送时,查询方式和中断方式可能不能满足要求。直接存储器存取(DMA)就是为解决这个问题提出的。采用DMA方式,在一定时间段内,由DMA控制器取代CPU,获得总线控制权,来实现内存与外设或者内存的不同区域之间大量数据的快速传送。2、 典型的DMA控制电路3、 DMA数据传送的工作过程3.1、DMAC发出DMA传送请求。3.2、DMAC通过连接到CPU的HOLD信号向CPU提出DMA请求。3.3、CPU在完成当前总线操作后会立即对DMA请求做出
3、响应,CPU的响应包括两个方面:CPU将控制总线、数据总线和地址总线浮空,即放弃对这些总线的控制权、CPU将有效的HLDA信号加到DMAC上,以通知DMAC CPU已经放弃了总线的控制权。3.4、CPU将总线浮空,即放弃了总线控制权后,由DMAC接管系统总线的控制权,并向外设送出DMA的应答信号。3.5、DMAC送出地址信号和控制信号,实现外设与内存或内存之间大量数据的快速传送。3.6、DMAC将规定的数据字节传送完之后,通过向CPU发HOLD信号,撤消对CPU的DMA请求。CPU收到此信号,一方面使HLDA无效,另一方面又重新开始控制总线,实现正常取指令、分析指令、执行指令的操作。4、 DM
4、A传输方式4.1、I/O接口到存储器的传送:当进行由I/O接口到存储器的数据传送时,来自I/O接口的数据利用DMAC送出的控制信号,将数据输送到系统数据总线D0D7上,同时,DMAC送出存储器单元地址及控制信号,将存在于D0D7上的数据写入所选中的存储单元中。这样就完成了由I/O接口到存储器一个字节的传送。同时DMAC修改内部地址及字节数寄存器的内容。 4.2、存储器到I/O接口:与前一种情况类似,在进行这种传送时,DMAC送出存储器地址及控制信号,将选中的存储单元的内容读出放在数据总线D0D7上,接着,DMAC送出控制信号,将数据写到规定的(预选中)端口中去,而后MDAC自动修改内部的地址及
5、字节数寄存器的内容。 4.3、存储器到存储器:存储器到存储器的DMA数据传送采用数据块传送方式,首先送出内存源区域的地址和控制信号,将选中内存单元的的数据暂存,接着修改地址及字节数寄存器的值,然后输出内存目的区域的地址及控制信号,将暂存的数据,通过系统数据总线,写入到内存的目的区域中去,最后修改地址和字节数寄存器的内容,当字节计数器减到零或外部输入时可结束一次DMA传输过程。 5、 DMA控制器及寄存器5.1、S3C44B0集成了4个通道的DMA控制器:两个ZDMA控制器ZDMA0/1:可以用于存储器到存储器、储存器到I/O设备、I/O设备之间的DMA传送;两个BDMA控制器BDMA0/1:用
6、于储存器与I/O设备之间的传输。5.2、ZDMA0/1控制寄存器、ZDMA0起始地址、目的地址寄存器、DMA计数器寄存器。六、 实验说明1、本实验通过DMA方式实现存储器到存储器间的数据传送,并将其与常规的内存拷贝操作进行比较 2、拷贝动作的计时处理 2.1、采用定时器进行计时处理,采用函数Timer_Start启动计时处理,参数divider 表示定时时间间隔。0: 16 us,1:32us,2:64us,3:128us。2.2、操作完成时调用Timer_Stop停止定时器计数,其返回值为计数值,该值乘以时间间隔(128us)即为计时时间。Timer_Start(3);/* 128 us *
7、/ time=Timer_Stop();/* 停止定时器 */ Uart_Printf(Copy Bytes :time=%fn,time*128E-6);3、常规内存拷贝3.1、字节拷贝:*(unsigned char*)(dstAddr) = *(unsigned char*)(srcAddr); 3.2、双字节拷贝:*(unsigned short*)(dstAddr) = *(unsigned short*)(srcAddr); 3.3、四字节拷贝:*(unsigned int*)(dstAddr) = *(unsigned int*)(srcAddr); 3.4、清除传输完毕标志:z
8、dma0Done=0;3.5、设置DMA传输的起止地址和长度: rZDISRC0=srcAddr|(dw30)|(128);/* dw 为DMA传输宽度 */rZDIDES0=dstAddr|( 230)|(128);rZDICNT0=length |( 228)|(126)|(322)|(120); 3.6、启动DMA传输并开始计时:rZDCON0=0x1; Timer_Start(3); 3.7、等待传输完成,传输完成标记将在DMA中断服务程序中置位:while(zdma0Done=0); 3.8、返回当前定时计数器中的值:time=Timer_Stop();Uart_Printf(ZDMA0 :time=%fn,time*128E-6); 3.9、关中断:rINTMSK=BIT_GLOBAL; 4、DMA中断处理函数 void isr_dma0(void) rI_ISPC=BIT_ZDMA0;/ zdma0Done = 1; * 设置传输完毕标志 */ 七、 实验思考1、 什么叫DMA传送方式?试说明DMA方式传送数据的主要步骤。2、 试比较DMA传输、查询式传输及中断方式传输之间的优缺点和适用场合?