DMA

什么是DMA

DMA,Direct Memory Access,直接内存访问,是一种不经过CPU而直接从内存存取数据的数据交换模式。在DMA模式下,CPU只需要向DMA控制器下达指令,传输数据由DMA来完成,数据传送完再把信息反馈给CPU,这样能够减少CPU的资源占有率。DMA由硬件实现,从共用系统数据总线的角度看,DMA和CPU是竞争对手的关系,当完成一批数据的传输工作之后,快速设备可以向CPU发出中断请求,报告本次传输结束的同时,请示下一步的操作要求。

应用场合

DMA应用于快速设备和主存储器成批交换数据的场合,DMA应用在数据交换,既能够保证数据传输的准确性,即不丢失快速设备提供出来的数据,也能够进一步减少快速设备读写操作对CPU的干扰。

DMA中断和普通中断的区别

两者最大的不同表现为对CPU的干扰程度不同:DMA 传送方式的优先级高于程序中断,两者的区别主要表现在对CPU的干扰程度不同。中断请求不但使CPU停下来,而且要CPU执行中断服务程序为中断请求服务,这个请求包括了对断点和现场的处理以及CPU与外设的传送,所以CPU付出了很多的代价;DMA请求仅仅使CPU暂停一下,不需要对断点和现场的处理,并且是由DMA控制外设与主存之间的数据传送,无需CPU的干预,DMA只是借用了一点CPU的时间而已。还有一个区别就是,CPU对这两个请求的响应时间不同,对中断请求一般都在执行完一条指令的时钟周期末尾响应,而对DMA的请求,由于考虑它的高效性,CPU在每条指令执行的各个阶段之中都可以让给DMA使用,是立即响应。 DMA主要由硬件来实现,此时高速外设和内存之间进行数据交换不通过CPU的控制,而是利用系统总线。DMA方式是I/O系统与主机交换数据的主要方式之一,另外还有程序查询方式和中断方式。

DMA特性

● 12个 独立的可配置的通道(请求)DMA1 有7个通道DMA2有5个通道

● 每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置。

● 在七个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),假如在相等优先权时由硬件决定(请求0优先于请求1 ,依此类推) 。

● 独立的源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐

● 支持循环的缓冲器管理

● 每个通道都有3个事件标志(DMA 半传输, DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求。

存储器和存储器间的传输

外设和存储器,存储器和外设的传输

● 闪存、 SRAM、外设的SRAM、 APB1 APB2和AHB外设均可作为访问的源和目标

可编程的数据传输数目:最大为65536

DMA配置过程

(1)外设寄存器地址;DMA_CPARx(x=1-7),DMA1和DMA2共享用7个,DMA2没有6和7

(2)存储器地址;DMA_CMARx(x=1-7),DMA1和DMA2共享用7个99,DMA2没有6和7

(3)传输量,DMA_CNDTRx,只用bit0-15,0-65535,只在DMA_CCRx的EN为0时,可写,减为0时,不会发生任何数据传输,除非使用循环模式;传输数据宽度,传输方向,DMA_CCRx

(4)循环/正常模式,地址增量模式(包括外设和存储器的地址),DMA_CCRx

(5)通道优先级,DMA_CCRx

(6)中断请求标志,DMA_ISR和DMA_IFCR

DMA的工作过程及循环模式、存储器到存储器模式

配置DMA完后,并且使能了DMA,当发生外设数据传输请求时,如果传输量不为0,在DMA的控制下,数据以指定的方向,以传输数据宽度,从源地址传输到目标地址,一次传输完成,传输量减1,此时如果开启了地址增量模式,那么下一个源地址、目标地址将会是前一个地址加上增量值,增量值取决于所选的数据宽度(8位+1,16位+2,32位+4),当源地址设定的数据宽度小于目标地址的数据宽度,那么源数据全部写入目标地址后,目标地址剩下的位置将写0,当大于时,目标地址将全被写满,源数据未写部分将被舍弃。如果开启了循环模式,数据传输量变为0时,将会自动恢复成配置通道时设置的初值,DMA操作继续执行。

如果开启了中断(传输错误中断、传输完成中断、半传输中断),将会产生相应的中断事件。三种不同中断共用一个中断函数,但可以通过中断标志区分。

当设置了DMA_CCRx的MEM2MEM位,在软件设置了DMA_CCRx的EN位启动DMA传输,DMA传输立即开始,当传输量减为0,传输结束。注意存储器到存储器模式不能和循环模式共同使用。

DMA的DMA_ISR和DMA_IFCR的区别

DMA_ISR,存储中断标志位,由硬件置位,使用了前28位,共7个通道,每个通道使用4位,分别是GIFx(全局中断)、TCIFx(传输完成)、HTIFx(半传输)、TEIFx;特别地,GIFx 置1时,表示有中断发生。

DMA_IFCR,中断标志清除寄存器,由软件置位, 使用了前28位,共7个通道,每个通道使用4位,分别是CGIFx(全局中断)、CTCIFx(传输完成)、CHTIFx(半传输)、CTEIFx;写入0不起作用,写入1清除DMA_ISR相应的标志位。

错误管理

读写一个保留的地址区域,将会产生DMA传输错误。当在DMA读写操作时发生DMA传输错误时,硬件会自动地清除发生错误的通道所对应的通道配置寄存器(DMA_CCRx)的EN位,该通道操作被停止。此时,在DMA_IFT寄存器中对应该通道的传输错误中断标志位(TEIF)将被置位,如果在DMA_CCRx寄存器中设置了传输错误中断允许位,则将产生中断。

操作一个不支持字节或半字写的AHB设备

当DMA模块开始一个AHB的字节或半字写操作时,数据将在HWDATA[31:0]总线中未使用的部分重复。因此,如果DMA以字节或半字写入不支持字节或半字写操作的AHB设备时(即HSIZE不适于该模块),不会发生错误, DMA将按照下面两个例子写入32位HWDATA数据:

● 当HSIZE=半字时,写入半字’0xABCD’, DMA将设置HWDATA总线为’0xABCDABCD’。

● 当HSIZE=字节时,写入字节’0xAB’, DMA将设置HWDATA总线为’0xABABABAB’。

假定AHB/APB桥是一个AHB的32位从设备,它不处理HSIZE参数,它将按照下述方式把任何AHB上的字节或半字按32位传送到APB上:

● 一个AHB上对地址0x0(或0x1 、 0x2或0x3)的写字节数据’0xB0’操作,将转换到APB上对地址0x0的写字据’0xB0B0B0B0’操作。

● 一个AHB上对地址0x0(或0x2)的写半字数据’0xB1B0’操作,将转换到APB上对地址0x0的写字数据’0xB1B0B1B0’操作。

例如,如果要写入APB后备寄存器(与32位地址对齐的16位寄存器),需要配置存储器数据源宽度(MSIZE)为’16位’,外设目标数据宽度(PSIZE)为’32位’。

注意:

(1)存储器到存储器模式下,可以使用任意DMA通道;

(2)开启DMA数据传输模式,除了存储器到存储器的数据传输,其他外设的DMA传输,不仅要支持DMA,还要在使用的时候,自己开启DMA功能,比如USART1的DMA开启为,USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);

(3)外设的DMA,还要注意选择的通道是否正确。

本文链接:http://www.cnblogs.com/cposture/p/4278801.html

时间: 2024-08-09 09:13:09

DMA的相关文章

kobox : dma_s3c.ko -v1 操作寄存器方式操作S3C2440的DMA

平台:TQ2440 linux版本:Linux EmbedSky 3.16.1-svn57 #56 Sat Oct 18 21:46:22 PDT 2014 armv4tl GNU/Linux 目标:v2中改成s3c2410_dma_xxx方式来操作DMA,看这里的寄存器映射是怎么使用系统接口来操作的! #include "dma.h" #define MEM_CPY_NO_DMA 0 #define MEM_CPY_DMA 1 //#define BUF_SIZE (512*1024

NIOS2随笔——DMA(1)

1. NIOS2 DMA控制器结构框图 与其它IP外设一样,DMA控制器也是通过AVALON MM总线,实现寄存器配置,数据读写功能. 2. NIOS2 DMA三种传输方式 3. NIOS2 DMA API函数 NIOS2 DMA的API函数原型都定义在alt_dma.h头文件中,常用的API函数如下: alt_dma_txchan alt_dma_txchan_open (const char* name); static ALT_INLINE int alt_dma_txchan_send 

重学STM32---(六)DAC+DMA+TIM

这两天复习了DAC,DMA再加上把基本定时器TIM6和TIM7看了一下,打算写一个综合点的程序,,,就在网上找了一些关于DAC,DMA和定时器相关的程序,最终打算写了输出正弦波的程序... 由于没有示波器,也就不能显示出效果了,本来是打算用软件调试看效果的,但TIM6总是出问题,CNT不自增,可是我真的找不出TIM6有什么错误,,,后来在网上发现许多道友遇到同样的问题,有人说TIM6不支持软件调试,不知道是不是这么回事,,没办法,没示波器,软件调试又不行,自己本身也不想耽搁复习的进程,也就不纠结

ok6410的DMA裸机总结

1.为何使用DMA:为了提高CPU的工作效率,避免多余的等待时间 2.关于DMA控制器:(1)通道数:2440有4个通道,6410有4个DMA控制器(初始化的时候要选择),32个通道.210有两种DMA一种是内存与内存之间,另外则是普通的内存与外设之间.(2)请求源:(3)基本时序 nXDREQ请求生效并经过2CLK周期同步后,nXDACK响应并开始生效,但至少还要经过3CLK的周期延迟,DMA控制器才可获得总线的控制权,并开始数据传输(4)工作模式:•Demond模式:如果DMA完成一次请求后

多功能PCIE交换机之五: 基于NTB的DMA

如果说PCIE多功能桥中的NTB为跨节点的数据传输铺好路.架好桥的话,那么PCIE多功能桥中的DMA就是多个节点之间的高铁和航班.没有NTB打通数据通道,DMA也不可能跨越节点.但没有DMA的话,NTB还是可以依赖CPU来在多个节点之间搬运数据.因此DMA对NTB而言是如虎添翼.锦上添花. 和NTB的单NT和双NTB配置相比,DMA可配置的选项比较多,但不管是中断模式.查询模式,也无论描述符是在DMA控制器片上还是片外,亦或配置成单个还是多个DMA channel,都有现成的代码可供参考或寄存器

DMA过程分析

1.1 当我们在应用程序中编写write系统调用,向磁盘中写入数据时,写入请求会先调用底层写函数,将请求先写入内存中的页快速缓存(page cache)中,写入成功则立马返回,真正的写入磁盘操作会延迟运行.Page cache是硬盘在内存中的一个缓存,是linux内核所使用的主要磁盘快速缓存,在绝大多数情况下,内核在读写磁盘时都引用page cache(极少数应用会绕过页快速缓存,如数据库软件). 当把page cache中的一页数据写到块设备之前,内核首先检查相应的页是否已经在快速缓存中,假设

cortex_m3_stm32嵌入式学习笔记(十九):DMA实验(高速传输)

DMA,全称为: Direct Memory Access,即直接存储器访问. DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路, 能使 CPU 的效率大为提高. 即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU. 一个完整的DMA传输过程必须经过下面的4个步骤. 1.DMA请求 CPU对DMA控制器初始化,并向I/O接

STM32的串口DMA收发以及双缓冲区的实现

在使用STM32的UART的DMA功能总结如下: 首先上代码,这里采用STM32 的USART1作为Demo,RX的DMA为DMA1_Channel5,TX的DMA为DMA1_Channel4.初始化如下,红色的标记需要注意: RX-DMA初始化 1 // DMA Rx 2 USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE); 3 DMA_Cmd(DMA1_Channel5,DISABLE); 4 DMA_InitStruct.DMA_PeripheralBa

mini2440裸机试炼之——DMA直接存取 实现Uart(串口)通信

这个只能作为自己初步了解MDA的开门篇 实现功能: 将字符串数据通过DMA0通道传递给UTXH0,然后在终端 显示.数据传输完后,DMA0产生中断,beep声, LED亮. DMA基本知识 计算机系统中各种常用的数据输入/输出方法有查询方式(包括无条件及条件传送方式)和中断方式,这些方式适用于CPU与慢速及中速外设之间的数据交换.但当高速外设要与系统内存或者要在系统内存的不同区域之间进行大量数据的快速传送时,就在一定程度上限制了数据传送的速率.直接存储器存取(DMA)就是为解决这个问题提出的,采

STM32的串口采用DMA方式接收数据测试(转)

STM32的串口采用DMA方式接收数据测试 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.   参考链接:http://www.amobbs.com/forum.PHP?mod=viewthread&tid=5511863&highlight=dma%E6%8E%A5%E6%94%B6   环境: 主机:WINXP 开发环境:MDK4.23 MCU:STM32F103CBT6 说明: 串口可以配置成用DMA的方式接收数据,不过DMA需要定长才