STM32-(34):DMA传输控制(理论)
2019-08-13 来源:eefocus
直接存储器传送(Direct Memory Access-DMA)
将外设的数据不经过CPU直接送入内存储器,或者,从内存储器不经过CPU直接送往外部设备
一次DMA传送只需要执行一个DMA周期(相当于一个总线读/写周期),因而能够满足高速外设数据传输的需要。
Direct Memory Access (存储器直接访问)。这是指一种高速的数据传输操作,允许在外部设备和存储器之间直接读写数据,既不通过 CPU ,也不需要 CPU 干预。整个数据传输操作在一个称为' DMA 控制器'的控制下进行的。
CPU 除了在数据传输开始和结束时做一点处理外,在传输过程中 CPU 可以进行其他的工作。这样,在大部分时间里,CPU 和输入输出都处于并行操作。因此,使整个计算机系统的效率大大提高。
DMA是在专门的硬件(DMA)控制下,实现高速外设和主存储器之间自动成批交换数据尽量减少CPU干预的输入/输出操作方式。通常有两种方式:①独占总线方式②周期挪用方式
主要特性:
(1) 7个独立的可配置的通道(请求)
(2) 每个通道都直接连接专用的硬件 DMA 请求,每个通道都同样支持软件触发.这些功能通过软件来配置。
(3) 在7个请求间的优先权可以通过软件编程设罝(共有四级:很高,高,中等和低),假如在相等优先权时由硬件决定(请求0优先于请求1,依此类推)。
(4) 独立的源和目标传输宽度(字节,半字,全字),模拟打包和拆包的过程。
(5) 支持循环的缓冲器管理
(6) 每个通道都有3个事件标志( DMA 半传输, DMA 传输完成和 DMA 传输出错),这3个事件标志逻辑或成为一个单独的中断请求。
(7) 存储器和存储器间的传输。
(8) 外设和存储器,存储器和外设的传输。
(9) 闪存, SRAM , 外 设 的 SRAM , APB 1和 APB 2外设均可作为访问的源和目标
(10) 可编程的数据传输数据:最大为65536
DMA控制器
1.DMA控制器
使用DMA方式传输时,需要一个专门的器件来协调外设接口和内存储器的数据传输,这个专门的器件称为DMA控制器,简称DMAC.
DMA的传送过程
1.DMA预处理:
CPU向DMA送命令,如DMA方式,主存地址,传送的字数等,之后CPU执行原来的程序。
2.数据传送:
在DMA控制下自动完成
3.DMA结束处理:
结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU.
DMA的内部寄存器
地址寄存器:存放DMA传输时存储单元地址;
字节计数器:存放DMA传输的字节数;
控制寄存器:存放由CPU设定的DMA传输方式,控制命令等;
状态寄存器:存放DMAC当前的状态,包括有无DMA请求,是否结束等。
DMA的内部结构
简析:我们可以看到DMAC中有刚刚提到的四种寄存器,首先进行预处理(即CPU把寄存器初始化设置OK),接口数据准备就绪,会向DMAC发出一个请求 DREQ,DMAC会向CPU申请系统总线的使用权,发出HOLD信号,如果CPU处于空闲或者任务处理完成之后,会回复一个 HLDA信号,DMAC得到CPU的回复后,会回复DACK信号给接口,表示可以传输数据,然后接口就会将数据放到总线上进行传输,DAMC通过控制地址与读写,将数据从接口送到内存储器或者将内存储器的数据送到接口。传输完成之后,HOLD就会放开,然后CPU就继续使用系统 总线。
DMA的传输过程
总线请求:DMAC向CPU申请使用总线
总线控制转移:CPU同意DMAC管理总线
数据传输:外设接口和存储器之间传输数据
修改地址和计数器:位下一次传输做准备
结束处理:DMAC放弃对总线的控制权
以上过程完全由硬件电路实现,速度很快。
用DMA方式进行一次数据传输所经历的时间称为“DMA周期”,大体相当于一次总线读写周期的时间。
STM32的DMA框图
DMA控制器和Cortex-M3核共享系统数据线执行直接存储器数据传输。
**简析:**外设如果有数据或者接受数据完成,会通过 DMA Request 发送相应的请求信号,AHB系统总线进入 AHB Stave,根据仲裁器和通道号进行相应的操作。DMA的通道,这里能看到的是7个(Ch1-Ch7) ,通道连接到下方图表中,DMA请求映像。
**简析:**这个图里的的请求映像其实相当于上图中的DMA Request,这7个通道是划分的,比如 ADC1/TIM2_CH3/TIM4_CH1他们的触发信号归类为通道1,这些都是 HW REQUEST 1为硬件的触发信号,另外还有 SW TRIGGER 为软件触发信号,一般是内存到内存,这里就与外设无关,这里通道优先级由上到下(1到7),每个通道可以单独打开与关闭,比如Channel 1 EN bit,每个通道都对应多个外设。
DMA 通道分配对照表
DMA通道配置过程
在DMA_CPARx寄存器中设置外设寄存器的地址,发生外设数据传输请求时,这个地
址将是据传输的源或目标。在DMA_CMARx寄存器中设置数据存储器的地址.发生外设数据传输请求时,传输的
数据将从这个地址读出或写入这个地址。在DMA_CNDTRx寄存器中设置要传输的数据量。在毎个数据传输后,这个数值递减。
在DMA_CCRx寄存器的PL[1:0】位中设置通道的优先级,
在DMA_CCRx寄存器中设置数据传输的方向、循环模式、外设和存储器的增量模式、
外设和存储器的数据宽度、传输一半产生中断或传输完成产生中断。设置DMA_CCRx寄存器的ENABLE位,启动该通道。
—旦启动了DMA通道,它既可响应联到该通道上的外设的DMA请求。
当传输一半的数据后,半传输标志(HTIF)被置1 , 当 设置了允许半传输中断位(HTIE)时,将产
生一个中断请求,在数据传输结束后,传输完成标志(TCIF)被置1 , 当 设置了允许传输完成中断位(TCIE)时,将产生一个中断请求。
几种常用的模式
1、正常缓存模式
2、循环缓存模式
循环模式用于处理循环缓冲区和连续的数据传输(如ADC的扫描模式)。在DMA_CCRx寄存器中的CIRC位用于开启这一功能。当启动了循环模式,数据传输的数目变为0时,将会自动地恢复成配置通道时设置的初值,DMA操作将会继续进行。
数据流向
1、外设到内存、内存到外设模式
2、内存到内存模式
当DMA通道的操作可以在没有外设请求的情况下进行,这种操作就是存储器到存储器模式。
当设置了DMA_CCRx寄存器中的 MEM2MEN位后,在软件设置了MA_CCRx寄存器中的EN位启动DMA通道时,DMA传输将马上开始,当DMA_CNDTRx寄存器变为0时,DMA传输结束。存储器到存储器模式不能与循环模式同时使用。
DMA的寄存器
具体寄存器各个位的配置请参照手册