当前位置:   article > 正文

STM32——DMA原理-M4_dma循环模式

dma循环模式

一、DMA简介

DMA全称Direct Memory Access,即直接存储器访问。DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场过程,通过硬件为RAM和IO设备开辟一条直接传输数据的通道,使得CPU的效率大大提高。

作用:为CPU减负。

STM32F4最多有2个DMA控制器,2个DMA控制器总共有16个数据流(每个控制器8个)。每个DMA控制器都用于管理一个或者多个外设的存储器访问请求。每个数据流总共可以有多达8个通道(或请求),每个通道都有一个仲裁器用于处理DMA请求间的优先级。

二、DMA主要特性

1、每个DMA控制器有8个数据流,每个数据流有多达8个通道(或请求)。

2、每个数据流有单独的四级32位先进先出存储器缓冲区(FIFO),可用于FIFO模式或者直接模式:

——FIFO模式:可通过软件将阈值级别选取为FIFO大小的1/4、1/2或3/4

——直接模式

每个DMA请求会立即启动对存储器的传输。当在直接模式(禁止FIFO)下将DMA请求配置为以存储器到外设模式传输数据时,DMA仅会将一个数据从存储器预加载到内部FIFO,从而确保一旦外设触发DMA请求时则立即传输数据。

3、通过硬件可以将每个数据流配置为:

——支持外设到存储器、存储器到外设和存储器到存储器传输的常规通道。

——支持在存储器方双缓冲的双缓冲区通道。

4、8个数据流中的每一个都连接到专用硬件DMA通道(请求)。

5、DMA数据请求之间的优先级可以用软件编程(4个级别:非常高、高、中、低),在软件优先级相同的情况下可以通过硬件决定优先级(例如,请求0的优先级高于请求1)。

6、每个数据流也支持通过软件触发存储器到存储器的传输(仅限DMA2控制器)。

7、可供每个数据流选择的通道请求多达8个。此选择可由软件配置,允许几个外设启动DMA请求。

8、要传输的数据项的数目可以由DMA控制器或者外设管理:

——DMA流控制器:要传输的数据项的数目是1到65535,可用软件编程

——外设流控制器:要传输的数据项的数目未知并由源或目标外设控制,这些外设通过·硬件发出传输结束的信号。

9、独立的源和目标传输宽度(字节、半字、字):源和目标的数据宽度不相等时,DMA自动封装/解封必要的传输数据来优化带宽。这个特性仅在FIFO模式下可用。

10、对源和目标的增量或非增量寻址。

11、支持4个、8个和16个节拍的增量突发传输。突发增量的大小可由软件配置,通常等于外设FIFO大小的一半。

12、每个数据流都支持循环缓冲区管理。

13、5个事件标志(DMA半传输、DMA传输完成、DMA传输错误、DMA FIFO错误、直接模式错误),进行逻辑或运算,从而产生每个数据流的单个中断请求。

DMA框图

三、通道选择

每个数据流都与一个DMA请求相关联,此DMA请求可以从8个可能的通道请求的选出。此选择由DMA_SxCR寄存器中的CHSEL[2:0]位控制。

四、DMA数据流

8个DMA控制器数据流都能够提供源和目标之间的单向传输链路。

每个数据流配置后都可以执行:

1、常规类型事务:存储器到外设、外设到存储器或存储器到存储器的传输。

2、双缓冲区类型事务:使用存储器的两个存储器指针的双缓冲区传输(当DMA正在进行自/至缓冲区的读/写操作时,应用程序可以进行至/自其它缓冲区的写/读操作)。

要传输的数据量(多大65535)可以编程,并与连接到外设AHB端口的外设(请求DMA传输)的源宽度相关。每个事务完成后,包含要传输的数据项总量的寄存器都会递减。

五、DMA事务

DMA事务由给定数目的数据传输序列组成。要传输的数据项的数目及其宽度(8位、16位或32位)可用软件编程。

每个DMA传输包含三项操作:

1、通过DMA_SxPAR或DMA_SxM0AR寄存器寻址,从外设数据寄存器或存储单元中加载数据。

2、通过DMA_SxPAR或DMA_SxM0AR寄存器寻址,将加载的数据存储到外设数据寄存器或存储单元。

3、DMA_SxNDTR计数器在数据存储结束后递减,该计数器中包含仍需执行的事务数。

在产生事件后,外设会向DMA控制器发送请求信号。DMA控制器根基通道优先级处理该请求。只要DMA控制器访问外设,DMA控制器就会向外设发送确认信号。外设获得DMA控制器的确认信号后,便会立即释放其请求。一旦外设使请求失败,DMA控制器就会释放确认信号。如果有更多请求,外设可以启动下一个事务。

六、仲裁器

仲裁器为两个AHB主端口(存储器和外设端口)提供基于请求优先级的8个DMA数据流请求管理,并启动外设/存储器访问序列。

优先级管理分为两个阶段:

1、软件:每个数据流优先级都可以在DMA_SxCR寄存器中配置。分为四个级别:

——非常高优先级

——高优先级

——中优先级

——低优先级

2、硬件:如果两个请求具有相同的软件优先级,则编号低的数据流优先于编号高的数据流。例如数据2的优先级高于数据4。

七、指针递增

根据DMA_SxCR寄存器中PINC和MINC位的状态,外设和存储器指针在每次传输后可以自动向后递减或保持常量。

通过单个寄存器访问外设源或目标数据时,禁止递增模式十分有用。

如果使能了递增模式,则根据在DMA_SxCR寄存器PSIZE或MSIZE位中编程的数据宽度,下一次传输的地址将是前一次传输的地址递增1(对于字节)、2(对于半字)或4(对于字)。

为了优化封装操作,可以不管AHB外设端口上传输数据的大小,将外设地址的增量偏移大小固定下来。DMA_SxCR寄存器中的PINCOS位用于增量偏移大小与外设AHB端口或32位地址(此时地址递增4)上的数据大小对齐。PINCOS位仅对AHB外设端口有影响。

如果将PINCOS位置1,则不论PSIZE值是多少,下一次传输的地址总是前一次传输的地址递增4(自动与32位地址对齐),但是AHB存储端口不受此影响。

如果AHB外设端口或AHB存储器端口分别请求突发事务,为了满足AMBA协议(在固定地址模式下不允许突发事务),则需要将PINC或MINC位置1。

循环模式

循环模式可用于处理循环缓冲区和连续数据流(例如ADC扫描模式)。可以使用DMA_SxCR寄存器中的CIRC位使能此特性。当激活循环模式时,要传输的数据项的数目在数据流配置阶段自动用设置的初始值进行加载,并继续响应DMA请求。

 

可编程数据宽度、封装/解封、字节序

要传输的数据项数目必须在使能数据流之前编程到DMA_SxNDTR(要传输数据项数目位,NDT)中,当流控制器是外设且DMA_SxCR中的PFCTRL位置为1时除外。

当使用内部FIFO时,源和目标数据的数据宽度可以通过DMA_SxCR寄存器的PSIZE和MSIZE位(可以是8、16或32位)编程。

当PSIZE和MISZE不相等时:

在DMA_SxNDTR寄存器中配置的要传输的数据项数目的数据宽度等于外设总线的宽度(由DMA_SxCR寄存器中的PSIZE位配置)。例如,在外设到存储器、存储器到外设或存储器到存储器传输的情况下,如果将PSIZE[1:0]位配置为半字,则要传输的字节数等于2✖NDT。

单次传输和突发传输

DMA控制器可以产生单次传输或4个、8个和16个节拍的增量突发传输。

突发大小通过软件针对两个AHB端口独立配置,配置时使用DMA_SxCR寄存器中的MBURST[1:0]和PBURST[1:0]位。

突发大小指示突发中的节拍数,而不是传输的字节数。

为确保数据一致性,形成突发的每一组传输都不可分割:在突发传输序列期间,AHB传输会锁定,并且AHB总线矩阵的仲裁器不解除对DMA主总线的授权。

根据单次或突发配置的情况,每个DMA请求在AHB外设端口上相应地启动不同数量的传输。

·当AHB外设端口被配置为单次传输时,根据DMA_SxCR寄存器在PSIZE[1:0]位的值,每个DMA请求产生一次字节、半字或字的数据传输。

·当AHB外设端口被配置为突发传输时,根据DMA_SxCR寄存器PBURST[1:0]和PSIZE[1:0]位的值,每个DMA请求相应的生成4个、8个或16个节拍的字节、半字或字的传输。

对于需要配置MBURST和MSIZE位的AHB存储端口,必须考虑与上述相同的内容。在直接模式下,数据流只能生成单次传输,而MBURST[1:0]和PBURST[1:0]位由硬件强制配置。

双缓冲区模式

 此模式可用于所有DMA1和DMA2数据流。

通过将DMA_SxCR寄存器中的DBM位置1,即可使能双缓冲区模式。

除了有两个存储器指针外,双缓冲区数据流的工作方式与常规(单缓冲区)数据流的一样。使能双缓冲区模式时,将自动使能循环模式(DMA_SxCR中的CIRC位的状态是“无关”),并在每次事务结束时交换存储器指针。

在此模式下,每次事务结束时,DMA控制器都从一个存储器目标交换为另一个存储器目标。这样,软件在处理一个存储器区域的同时,DMA传输还可以填充/使用第二个存储器区域。

DMA中断

对于每个DMA数据流,可以发生以下事件时产生中断:

1、达到半传输。

2、传输完成。

3、传输错误。

4、FIFO模式(上溢、下溢或FIFO识别错误)

5、直接模式错误。

可以使用单独的中断使能位以实现灵活性。 

配置流程

 配置DMA数据流x(其中x是数据流编号)时应遵循下面的顺序:

1、如果使能了数据流,通过重置DMA_SxCR寄存器中的EN位将其禁止,然后读取此为以确保没有正在进行的数据流操作。将此位写为0不会立即生效,因为实际上只有所有当前传输都已完成时才会写为0。当所读取EN位的值为0时,才表示可以配置数据流。因此在开始任何数据流配置之前,需要等待EN位置0。应将先前的数据块DMA传输中在状态寄存器(DMA_LISR和DMA_HISR)中置的所有数据流专用的位置0,然后才可重新使能数据流。

2、在DMA_SxPAR寄存器中设置外设端口寄存器地址。外设事件发生后,数据会从此地址移动到外设端口或从外设端口移动到此地址。

3、在DMA_SxMA0R寄存器(在双缓冲区模式的情况下还有DMA_SxMA1R寄存器)中设置存储器地址。外设事件发生后,将从此存储器读取数据或将数据写入此存储器。

4、在DMA_SxNDTR寄存器中配置要传输的数据项的总数。每出现一次外设事件或每出现一个节拍的突发传输,该值都会递减。

5、使用DMA_SxCR寄存器中的CHSEL[2:0]选择DMA通道(请求)。

6、如果外设用作流控制器而且支持此功能,请将DMA_SxCR寄存器中的PFCTRL位置1。

7、使用DMA_SxCR寄存器中的PL[1:0]位置数据流优先级。

8、配置FIFO的使用情况(使能或禁止,发送和接收阈值)

9、配置数据传输方向、外设和存储器增量/固定模式、单独或突发事务、外设和存储器数据宽度、循环模式、双缓冲区模式和传输完成一半和/或全部完成,和/或DMA_SxCR寄存器中的错误中断。

10、通过将DMA_SxCR寄存器中的EN位置1,激活数据流。

一旦使能了流,即可相应连接到数据流的外设发出的任何DMA请求。

一旦在AHB目标端口上传输了一半数据,传输一半标志(HTIF)便会置1,如果传输一半中断使能位(HTIE)置1,还会生成中断。传输结束时,传输完成标志(TCIF)便会置1,如果传输完成中断使能位(TCIE)置1,还会生成中断。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/584440
推荐阅读
相关标签
  

闽ICP备14008679号