目录
1 DMA
2 DMA功能框图
2.1 外设通道选择
2.2 仲裁器
2.3 FIFO
2.4存储器端口、外设端口
3 DMA传输配置
1 DMA
DMA(Direct Memory Access),即直接存储器访问,DMA提供在外设和存储器之间或者存储器和存储器之间的高速数据传输,硬件系统主要由CPU(内核)、外设、内存(SRAM)、总线等结构组成,数据经常要在存储器与外设直接转移、或是从外设A转移到外设B。在不适用DMA情况下,内核经总线矩阵协调,使用AHB将外设ADC采集的数据读取到内核,然后内核再通过总线矩阵协调,把数据存放到SRAM中;而由DMA控制器的DMA总线与总线矩阵协调,使用AHB把外设ADC的数据经由DMA通道存放到内存SRAM,使用DMA为多通道采集、采样频率高、连续输出数据的AD采集提供了更高效的方法,总结来说就是传输数据时使用DMA传输可以不占用CPU,让CPU有足够时间处理其它事情
2 DMA功能框图
STM32F407有2个DMA控制器(DMA1和DMA2),共16个数据流(每个控制器8个数据流),每个数据流都用来专门管理来自一个或多个外设请求的内存存取,每个数据流有8个通道可以选择。DMA可以工作在FIFO模式和直接模式两种模式下,且每个数据流可以通过硬件配置成常规通道来支持外设到内存、内存到外设、内存到内存的数据传输,也可以配置成双缓冲模式来内存与内存直接的数据传输
DMA的5个事件标志:DMA半传输、DMA传输完成、DMA传输错误、DMA FIFO错误、直接模式错误
5个标志分别对应:DMA_IT_HT、DMA_IT_TC、DMA_IT_TE、DMA_IT_FE、DMA_IT_DME
DMA可实现外设寄存器与存储器之间或者存储器与存储器之间直接传输的三种模式,这主要得益于DMA控制器是采用AHB主总线,它可以控制AHB总线矩阵来启动AHB事务,STM32F407功能框图如下
![](https://img-blog.csdnimg.cn/e36e56bcae8e490788b071bf8a5d4260.png)
2.1 外设通道选择
两个DMA控制器共有16个数据流,每个数据流对应8个外设请求,具体对应情况如下表
![](https://img-blog.csdnimg.cn/be02d47d748f46cdb52c6f93ffed36ba.png)
在实现DMA传输之前,DMA控制器会通过DMA数据流x配置寄存器DMA_SxCR(x为0~7的8个DMA数据流)的SHSEL[2:0]位选择对应的通道作为数据流的目标外设,其中每个外设请求都占用一个数据流通道,相同外设请求可以占用不同的数据流通道
2.2 仲裁器
一个DMA控制器对应8个数据流,数据流包括数据传输的源地址、目标地址、数据等信息,在同时使用同一个DMA控制多个外设请求时,必然需要同时使用多个数据流,哪个数据流优先是由仲裁器选定的
仲裁器为两个AHB主端口(存储器和外设端口)提供基于请求优先级的8个DMA数据流请求管理,并启动外设/存储器访问序列,优先级的管理分为两个阶段:
1、软件。每个数据流优先级可以在DMA_SxCR寄存器中配置,分为四个级别:非常高优先级、高优先级、中优先级和低优先级
2、硬件。如若两个请求具有相同的软件优先级,则编号低的数据流优先于编号高的数据流,如数据流2的优先级高于数据流4
2.3 FIFO
每个数据流都独立拥有四级32位FIFO,DMA传输具有FIFO模式和直接模式
直接模式在每个外设请求都立即启动对存储器传输,在直接模式下,若DMA配置为存储器到外设传输,那DMA会将一个数据存放到FIFO内,外设启动DMA传输请求时就可以立即将数据传输过去
FIFO用于在源数据传输到目标之前临时存储这些数据,可以通过DMA数据流xFIFO控制寄存器DMA_SxFCR的FHT[1:0]位来控制FIFO的阈值,分别为1/4、1/2、3/4和满,在数据存储量大于阈值时,FIFO内容将传输至目标中
FIFO对于要求源地址和目标地址数据宽度不同时非常有用,比如源数据是源源不断的字节数据,而目标地址要求输出字宽度的数据,即在实现数据传输时将4个8位字节数据拼凑成一个32位字数据,此时可以使用FIFO功能先把数据缓冲起来,分别根据需要输出数据
2.4存储器端口、外设端口
DMA控制器实现双AHB主接口,更好利用总线矩阵和并行传输,DMA控制器的功能是快速转移内存数据,需要一个连接至源数据地址的端口和一个连接至目标地址的端口,DMA控制器通过存储器端口和外设端口与存储器和外设进行数据传输,关系见下图
![](https://img-blog.csdnimg.cn/3f9276ce9fa94795b905dc5bd19a38af.png)
DMA2的存储器端口和外设端口均是连接到AHB总线矩阵的,可以使用AHB总线矩阵功能,DMA2存储器和外设端口可以访问相关的内存地址,包括内部Flash、内部SRAM、AHB1外设、AHB2外设、APB2外设和外部存储器空间
DMA1的存储器端口相比DMA2的要减少AHB2外设的访问权,同时DMA1外设端口是没有连接至总线矩阵的,只有连接到APB1外设,所以DMA1不能实现存储器到存储器传输
3 DMA传输配置
1、若使能了数据流,通过复位DMA_SxCR寄存器中的EN位将其禁止,然后读取此位以确认没有正在进行的数据流操作,将此位写0时不会立即生效,因为实际上只有所有当前传输都已完成时该位才会变为0,当所读取EN位的值为0时,才表示可以配置数据流了,因此在开始任何数据流配置前,需要等待EN位清0
2、在DMA_SxPAR寄存器中设置外设端口寄存器地址,外设事件发生后,数据会从此地址传输到外设端口或从外设端口传输到此地址
3、在DMA_SxMA0R寄存器(在双缓冲区模式下还有DMA_SxMA1R寄存器)中设置存储器地址,外设事件发生后,将从此存储器地址读取数据或将数据写入此存储器地址
4、在DMA_SxNDTR寄存器中配置要传输的数据项总数,每出现一次外设事件或每出现一个节拍的批量传输,该值都会递减
5、使用DMA_SxCR寄存器中的CHSEL[2:0]选择DMA通道
6、使用DMA_SxCR寄存器中的批量[1:0]位配置数据流优先级
7、配置FIFO使用情况(使能或禁止、以及发送和接收阈值)
8、在DMA_SxCR寄存器中配置数据传输方向、外设和存储器增量/固定模式、单次/批量传输、外设和存储器数据宽度、循环模式、双缓冲区模式和传输完成一半和/或全部完成、和/或错误中断
9、通过将DMA_SxCR寄存器中的EN位置1使能数据流,一旦使能了数据流,即可响应连接到该数据流的外设发出的任何DMA请求
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)