什么是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