ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

DMA

DMA

DMA

1.DMA基础知识

DMA是存储器和外设之间的一种数据搬运机制,通过CPU进行调度,不占有CPU资源,后台搬运,在搬运完成后会通知CPU。

方向:双向端口,可配置为存储器到存储器,存储器到外设,外设到存储器,外设到外设。

连接方式:一般通过AMBA总线中的AHB总线进行连接,高效快速,在两端之间配备有FIFO用于缓存数据,FIFO深度可以配置为1/4,1/2,3/4,1四个状态,当且仅当FIFO设置的阈值满的时候才会将数据传给另一端。

DMA外设端口和存储器端口的数据宽度
用DMA传输数据时,通过配置其外设端口和存储器端口的数据宽度可完美解决此问题。DMA中数据宽度可配置为1字节、半字(2字节)和字(4字节)。通过DMA_SxCR寄存器的 PSIZE(配置外设端口数据宽度) 和 MSIZE(配置内存端口数据宽度) 位配置。

传输的数据量
(1)连接外设并且要传输的数据数据量未知时,可通过外设发送数据传输的结束信号停止传输,但此种方法需要外设具有SDIO接口。
(2) 在已知需要传输的数据量时,设置需要传输的数据量。要传输的数据量在使能DMA数据流之前写入DMA_SxNDTR 寄存器。在两边数据宽度不一致情况下,DMA_SxNDTR中的数据量等于外设端的数据量。每传输一次后,DMA_SxNDTR中值递减1,递减为0时,DMA停止传输。
通常情况下,使用第2中方法来控制数据量。

数据传输地址
所谓数据传输地址是指从什么地址发送数据,从什么地址接收数据。外设端口和存储器端口各自有自己的数据传输地址,分别通过寄存器DMA_SxPAR 和DMA_SxM0AR/ DMA_SxM1A(DMA_SxM1AR仅在双缓冲区模式下有效)来设置数据传输地址。
image

2.DMA普通传输过程

DMA有一个使能信号,通过使能信号来控制DMA工作,在使用DMA时,首先需要使能DMA。
针对于不同的传输方向,其传输过程略有不同。

2.1从外设向存储器传输数据
DMA使能后,等待外设发出DMA请求信号,DMA收到请求,数据从外设端口数据传输地址(DMA_SxPAR)存储到DMA缓冲区(FIFO)内,当缓冲区(FIFO)内数据量达到缓冲区(FIFO)阈值后,缓冲区(FIFO)内数据移出到内存端口数据传输地址(DMA_SxM0AR)指定的存储器地址中,同时每传输一个数据,DMA_SxNDTR内的值会减1,DMA_SxNDTR值递减为0,DMA传输停止。

2.2从存储器向外设传输数据
DMA使能后,立即会将内存端口数据传输地址(DMA_SxM0AR)指定的数据移动到DMA缓冲区(FIFO)内,完全填满DMA缓冲区(FIFO),等待外设端口DMA请求信号,每次发生外设请求,缓冲区内的数据以外设端口宽度指定的数据量移出到外设端数据传输地址(DMA_SxPAR)指定的目标地址上,同时每传输一个数据,DMA_SxNDTR内的值会减1,DMA_SxNDTR值递减为0,DMA停止传输。当DMA缓冲区(FIFO)内数据量小于等于缓冲区阈值时,会使用存储器内的数据再次填充满FIFO。

3.DMA指针递增传输过程

DMA的外设端口和内存端口各自有一个指针递增参数,可以单独设置是否启用。如果启用了指针递增,则每传输一次,相应端口的数据传输地址递增(递增数等于相应端口地址宽度的字节数),指向下一个地址,下次DMA传输会使用这个新地址来发送或接收数据。

4.DMA循环传输过程

DMA还有一个循环模式参数用来设置是否启用循环模式。在循环模式下,当DMA_SxNDTR递减为0后,外设端口、存储器端口的数据传输地址以及DMA_SxNDTR中的值会自动加载初始值后,开始新一轮的循环传输。

5.DMA双缓冲区传输过程

DMA在循环模式下,还可以设置为双缓冲区模式。在双缓冲区模式下,存储器端口可以利用DMA_SxM0AR和 DMA_SxM1AR 2个寄存器设置两个数据传输地址。DMA可以利用两个数据传输地址交替传输数据。我们使能指针递增情况下,将两个缓冲区首地址分别装入DMA_SxM0AR和 DMA_SxM1AR,这样在一个缓冲区传输数据的时候,可以对另一个缓冲区内的数据进行处理。
以上只是粗略简述整个传输过程,具体详细信息,后面具体描述。

参考链接:https://zhuanlan.zhihu.com/p/652083815

返回列表