DMA实验.doc

上传人:hw****26 文档编号:3550894 上传时间:2019-06-04 格式:DOC 页数:7 大小:72KB
下载 相关 举报
DMA实验.doc_第1页
第1页 / 共7页
DMA实验.doc_第2页
第2页 / 共7页
DMA实验.doc_第3页
第3页 / 共7页
DMA实验.doc_第4页
第4页 / 共7页
DMA实验.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

1、实验 x DMA 实验一、实验目的1、了解 DMA 传送原理;2、掌握 S3C2410 DMA 控制器的使用;3、掌握 DMA 软件编程方法。二、实验内容1、编写单字节方式、双字节方式和四字节方式常规内存拷贝及时间检测程序;2、编写 DMA 方式内存拷贝及时间检测程序;3、比较 DMA 方式内存拷贝及常规内存拷贝的效率。三、实验设备1、硬件:DM2410 实验板;测控与显示扩展板;PC 机;JTAG 仿真器;2、软件:PC 机操作系统(WINDOWS 2000);ARM Developer Suite v1.2;Multi-ICE V2.2.5(Build1319);四、基础知识1、掌握 AD

2、S 开发环境的基本功能;2、了解 DMA 的原理以及处理步骤。五、实验说明1、DMA 基本知识计算机系统中常用的传输数据的控制方式通常包括三种:查询方式、中断方式和 DMA方式。对于高速外设与系统内存,或者系统内存的不同区域之间,进行大量数据的快速传送时,采用 DMA 方式可以大大提高系统的效率。DMA(直接存储器存取)方式是指在一定时间段内,由 DMA 控制器取代 CPU,获得总线控制权,来实现内存与外设,或者内存的不同区域之间大量数据的快速传递。典型 DMA 控制器(DMAC )的数据传送过程如下:1) DMAC 发出 DMA 传送请求;2) DMAC 通过连接到 CPU 的 HOLD 信

3、号向 CPU 提出 DMA 请求;3) CPU 在完成当前总线操作后立即对 DMA 请求响应。 CPU 的响应包括两部分: 1CPU 将控制总线、数据总线和地址总线浮空,即放弃对各总线的控制权; CPU 2将有效的 HLDA 信号加到 DMAC 上,以通知 DMAC CPU 已经放弃了总线的控制权;4) CPU 放弃总线控制权后,DMAC 接管系统总线的控制权,并向外设送出 DMA 的应答信号;5) DMAC 送出地址信号和控制信号,实现外设与内存或内存之间大量数据的快速传送;6) DMAC 将规定的数据字节传送完后,通过向 CPU 发 HOLD 信号,撤销对 CPU的 DMA 请求。CPU

4、收到此信号后,使 HLDA 信号无效,同时又重新开始控制总线,实现正常取指令、分析指令和执行指令的操作。【注意】1)在内存与外设之间进行 DMA 传送期间,DMAC 只输出地址信号和控制信号而数据传送是直接在内存和外设端口之间进行的,并不经过 DMAC;2)对于内存不同区域之间的 DMA 传送,则应先用一个 DMA 存储器读周期将数据从内存的源区域读出,存入到 DMAC 的内部数据暂存器中,再利用一个 DMA 存储器写周期将该数据写到内存的目的区域中去。2、S3c2410 的 DMA 控制器典型的 DMA 控制器如下图所示:S3c2410 支持位于系统总线和外设总线之间的 4 个通道的 DMA

5、C,每个通道可以处理四种情况:源和目的都在系统总线上; 1源在系统总线上,目的在外设总线上; 2源在外设总线上,目的在系统总线上; 3源和目的都在外设总线上。 4关于每个寄存器的详细说明,请参考 S3c2410 的数据手册。3、实验参考代码及其结果本实验通过 DMA 方式实现存储器到存储器的数据传送。1) 头文件、函数声明及特殊功能寄存器#include #include “def.h“#include “option.h“#include “2410addr.h“#include “2410lib.h“#include “2410slib.h“/函数声明存储器CPU数据端口状态/控制端口数据

6、缓冲寄存器DMA请求触发器DMA 控制器地址寄存器控制/状态寄存器计数器HOLDHLDA输入外设ReadyDMA请求DMA响应static void _irq Dma0Done(void);static void _irq Dma1Done(void);static void _irq Dma2Done(void);static void _irq Dma3Done(void);void DMA_M2M(int ch,int srcAddr,int dstAddr,int tc,int dsz,int burst);/DMA 特殊功能寄存器typedef struct tagDMAvolati

7、le U32 DISRC; /0x0 DMA 初始源寄存器volatile U32 DISRCC; /0x4 DMA 初始源控制寄存器volatile U32 DIDST; /0x8 DMA 初始目的寄存器volatile U32 DIDSTC; /0xc DMA 初始目的控制寄存器volatile U32 DCON; /0x10 DMA 控制寄存器volatile U32 DSTAT; /0x14 DMA 状态寄存器volatile U32 DCSRC; /0x18 当前源寄存器volatile U32 DCDST; /0x1c 当前目的寄存器volatile U32 DMASKTRIG;

8、/0x20 DMA 掩码触发寄存器DMA;static volatile int dmaDone;2) DMA 内存拷贝函数void DMA_M2M(int ch,int srcAddr,int dstAddr,int tc,int dsz,int burst)int i,time;volatile U32 memSum0=0,memSum1=0;DMA *pDMA;int length;length = tc*(burst ? 4:1)*(dsz=0)+(dsz=1)*2+(dsz=2)*4);Uart_Printf(“DMA%d MEM2MEM Testn“,ch);switch(ch)c

9、ase 0:pISR_DMA0 = (int)Dma0Done;rINTMSK pDMA = (void *)0x4b000000; /通道 0 地址break;case 1:pISR_DMA1 = (int)Dma1Done;rINTMSK pDMA = (void *)0x4b000040; /通道 1 地址break;case 2:pISR_DMA2 = (int)Dma2Done;rINTMSK pDMA = (void *)0x4b000080; /通道 2 地址break;case 3:pISR_DMA3 = (int)Dma3Done;rINTMSK pDMA = (void *

10、)0x4b0000c0; /通道 3 地址break;Uart_Printf(“DMA%d %8xh-%8xh,size=%xh(tc=%xh),dsz=%d,burst=%dn“,ch,srcAddr,dstAddr,length,tc,dsz,burst);Uart_Printf(“Initialize the src.n“);for(i=srcAddr; iDISRC = srcAddr;pDMA-DISRCC = (0DIDST = dstAddr;pDMA-DIDSTC = (0DCON = tc|(1DMASKTRIG = (1DISRC,写寄存器的代码 pDMA-DISRC =

11、1srcAddr。在读写寄存器之前,pDMA 寄存器必须首先赋值,否则将导致异常;DMA 内存拷贝: 2该程序中使用的是软件请求源(DCON 的第 23 位设置为 0) ,源和目的均使用系统总线(AHB,通过 DISRCC 和 DIDSTC 设置) ,并使用中断,当所有传输完成时产生 DMA 中断请求。在 DMA 中断处理程序中将 dmaDone 置零,以便在主程序中通过检验 dmaDone 是否置零来判断 DMA 传输是否完成。DMA 传输数据大小计算: 3该程序中传输数据的大小是通过 DCON 寄存器来设置的。一次 DMA 传输数据的大小计算公式是:DSZ * TSZ * TC(单位:字节

12、)其中,DSZ由 dst 参数传入,设置到 DCON 的第 2021 位。它可以选择数据宽度,此处包括单字节、双字节和四字节,其中四字节方式速度最快。TSZ由 burst 参数传入,设置到 DCON 的第 28 位。它可以选择突发模式和单元模式,其中突发模式速度更快。TC由 tc 参数传入,设置到 DCON 的第 019 位。拷贝动作的计时处理: 4该程序中采用定时器。采用函数 Timer_Start、Timer_Stop 分别启动和停止定时器。参数 divider 表示定时时间间隔,例如 0:16s、1:32s、2:64s、3:128s。函数Timer_Stop 的返回值就是计数值,该值乘以

13、 128s 就等于计时时间。在函数 Test_DMA 中用到了 DMA_M2M 函数,该函数中的第三个参数都是 5_NONCACHE_STARTADDRESS+0x800000,表示测试数据的长度都是 0x800000 字节。六、实验步骤1、仔细阅读实验说明部分,熟悉 S3C2410 的 DMA 控制器的原理;2、将实验系统光盘中“实验工程ADS 实验ADC”目录拷贝到本地硬盘,用 DMA 组件中的 CodeWarrior for ARM Developer Suite 工具软件打开打开其中的 ADC.mcp 工程文件。用实验一中的方法选用本机的地址中的 scat.scf 文件。3、在 DebugRel 目录下编译源文件。 (详见实验一) ,分析并熟悉程序。4、将 PC 机、仿真器和实验板连接并打开“Multi-ICE Server”和“AXD Debugger”对 CPU 进行初始化,导入本地硬盘上“实验工程ADS 实验DMA”中“DMA_DataDebugRelDMA.axf”文件或光盘上的实验项目文件。 (详见实验二)5、调试运行程序观察程序运行。验证 DMA 数据传输的速度与其它数据传输的差异。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育教学资料库 > 精品笔记

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。