STM32F407之DMA-笔记

放肆的年华 提交于 2020-01-05 09:02:49

学习要点记录,并不全面,祥参 参考手册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中的剩余数据。

 

 

 

 

 

 

 

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!