学习要点记录,并不全面,祥参 参考手册RM0090
简介:
DMA用于外设-内存,内存-内存之间数据的快速传输
DMA控制器由双AHB 主总线架构和独立的FIFO组成,以此来优化系统带宽
两个DMA控制器一共含有16个数据流,每个控制器含有8个数据流;每个数据流有8个通道,每个数据流有一个优先级仲裁器。
主要特征:
双AHB总线架构,一个负责内存访问,另一个负责外设访问
AHB从机编程接口只支持32位访问
每个数据流拥有4个独立的32位FIFO,直接模式和FIFO模式都可以使用
--FIFO模式下,可以通过软件设置FIFO阈值为1/4,1/2,3/4
--直接模式下,每个DMA请求立即触发一次数据传输。当处于直接模式,从内存向外设传输数据时,DMA只从内存预装载一个数据到FIFO
--每个数据流可以通过软件配置为:
-------常规通道,支持 外设-内存 ;内存-外设 ;内存-内存 。
-------双缓冲通道,支持内存双缓冲
--数据流之间的优先级可以通过软件设置为:非常高 ;高 ;中等 ;低 ;如果优先级相等,那么数据流编号越小,优先级越高
--只有DMA2的每个数据流支持软件触发的数据传输,而且只有传输方向为: 内存-内存
--每个数据流请求是8个通道中的一个。选择可以通过软件设置,而且允许一些外设来触发DMA请求
--传输的数据量可以通过DMA控制器管理,或者通过外设管理
----------通过DMA控制:数据量可以通过软件设置,从1-65535
---------------外设控制:需要传输的数据量未知,通过外设硬件给出传输结束的信号
--只有在FIFO模式下,源和目的数据宽度可以不一样:字节;半字;字
--源和目的地址可以增长或者不增长
--支持增长burst传输,每 4次; 8次; 16次请求才进行一次突发传输。突发的大小可以通过软件设置,通常等于外设FIFO的一半。burst详参:(http://blog.csdn.net/sunjiajiang/article/details/7945057)
--每个数据流支持循环缓冲管理
--5种事件标志经过 或运算 来产生中断请求:1.DMA传输了一半 2.DMA传输结束 3.DMA传输出错 4.DMA FIFO错误 5.直接模式错误
DMA功能框图请参考数据手册。
DMA控制器提供两个AHB主机端口:一个是AHB内存端口,用来连接内存;另一个是AHB外设端口,用来连接外设。但是,如果需要 内存-内存 的数据传输,AHB外设端口必须访问内存。
AHB从机端口用来对DMA控制器进行编程设置,它支持32位访问。
通过DMA架构,可以看出只有DMA2控制器支持 内存-内存 的数据传输。
DMA传输:
DMA传输有三个步骤:
1. 从外设数据寄存器或者内存中取出数据,外设数据寄存器地址和内存地址分别由DMA_SxPAR寄存器和DMA_SxM0AR寄存器给出
2. 将取出的数据进行存储
3. DMA_SxNDTR寄存器的自减,DMA_SxNDTR寄存器里的值表示还需要传输的数据个数
通道选择:
每个数据流的通道可以通过DMA_SxCR寄存器中的CHSEL[2:0] 设置。通道和数据流的映射祥参数据手册。
DMA数据流:
每个数据流提供 源和目的 的单向连接。每个数据流可以配置为:
---------常规传输
----------双缓冲传输:双缓冲传输在内存端利用两个内存指针,当DMA对一个缓冲区进行操作时,应用程序可以对另一个缓冲区进行操作。
源和目的以及传输模式:
传输方向由DMA_SxCR寄存器中的DIR[1:0]位控制。
当数据宽度是 半字 ;字 的时候,相应地数据地址必须和数据宽度边界对齐。
外设-内存模式:
在该模式下,每次出现外设请求,数据流就从源地址进行一次数据传输去填充FIFO。
当达到FIFO阈值后,FIFO里的内容被取出并且存储到目的地址。
当DMA_SxNDTR寄存器值减到0时,数据传输结束。
在直接模式下,FIFO阈值是没有用的:每个数据传到FIFO后,会立即被取出然后存储到目的地址。
内存-外设模式:
与 外设-内存 操作 类似,祥参技术手册。
指针增长:
外设和内存的指针可以设置为自动后增(在每次数据传输结束后增加)或者恒定,利用 DMA_SxCR寄存器里的PINC and MINC bits。如果使能了增长模式,那么下一次传输的地址就会变为前一次地址加1(对于字节传输)加2(对于半字)加4(对于字),这是由数据宽度决定的。
burst传输时必须使能地址增长,地址不变模式不允许使用burst传输。
循环模式:
循环模式用来处理连续的数据流。通过DMA_SxCR寄存器中的CIRC bit 设置。
在循环模式下,传输数据量的值被自动重载。
循环模式下,如果内存被配置为burst传输,以下规则需要强制遵循:
-------
DMA_SxNDTR = Multiple of ((Mburst beat) × (Msize)/(Psize))
解释:数据传输量=beat数 X 内存数据宽度 / 外设数据宽度
双缓冲模式:
DMA1和DMA2的所有数据流都可以设置为双缓冲模式。
双缓冲模式和常规模式一样,只不过双缓冲模式有两个内存指针。当双缓冲模式使能后,循环模式自动使能,在每次传输结束后,内存指针被交换。
该模式我也不是很清晰。
可编程数据宽度:
在使能数据流之前,必须设置传输数据量,除非数据流控制器是外设。
使用FIFO模式时,源和目的 的数据宽度可以通过DMA_SxCR寄存器里的PSIZE and MSIZE bits设置。
在直接传输模式时,数据宽度必须相等!
单次传输和burst传输:
DMA 控制器可以进行单词传输或者地址增长的burst传输,burst的节拍数为4 ;8 ;16中的一个。
burst的大小可以通过软件设置,通过 DMA_SxCR 寄存器里的MBURST[1:0] and PBURST[1:0] bits。
在直接模式下,数据流只能产生单次传输。
只有使能地址增长模式,才能使用burst模式。
FIFO:
FIFO是用来暂时存放从源地址取得的数据。
每个数据流拥有一个独立的 4字 的FIFO,并且FIFO的阈值可以通过软件设置。如果要使用FIFO的阈值功能,必须禁止直接模式。
内存-内存 方向的数据传输不允许使用直接模式。
DMA传输结束:
不同的事件能够通过设置DMA_LISR寄存器里的TCIFx bit来结束数据传输。
----------DMA控制数据流模式:
-DMA_SxNDTR计数值为0
-在数据传输结束之前数据流被禁止(通过设置DMA_SxCR寄存器里的EN bit )
----------外设控制数据流模式:
-最后一个burst传输或单次传输,并且FIFO里的数据被传输到内存
-数据流被软件禁止
在传输方向为 外设-内存 时,传输结束依赖于FIFO中的剩余数据。
来源:https://www.cnblogs.com/mumustudio/p/3275302.html