type
date
slug
category
icon
password
一、DMA 简介不走 DMA,CPU介入DMA方式,CPU不介入二、DMA 功能框图2.1 外设通道选择2.2 仲裁器2.3 FIFO2.4 存储器端口、外设端口2.5 编程端口 STM32F103C8 和 STM32F407IG DMA功能对比三、DMA 数据配置3.1 DMA 传输模式3.2 源地址和目标地址3.3 流控制器3.4 循环模式3.5 传输类型3.6 直接模式3.7 双缓冲模式3.8 DMA 中断
一、DMA 简介
DMA,简称 Direct Memory Access,即直接存储器访问。
DMA传输将数据从一个地址空间复制到另一个地址空间, 提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。DMA将CPU从数据的复制和存储中解放出来,让CPU去处理其他复杂计算任务,解决大量数据转移过度消耗CPU资源的问题。
不走 DMA,CPU介入
如果没有DMA,CPU传输数据还要以内核作为中转站, 比如要将ADC采集的数据转移到到SRAM中, 这个过程是这样的:
第一步:内核通过 DCode 经过总线矩阵协调, 从获取 AHB 存储的外设 ADC 采集的数据,
第二步:然后内核再通过 DCode 经过总线矩阵协调把数据存放到内存 SRAM 中。

DMA方式,CPU不介入
- 外设对 DMA 控制器发出请求。
- DMA 控制器收到请求, 触发 DMA 工作。
- DMA 控制器从 AHB 外设获取ADC采集的数据, 存储到 DMA 通道中。
- DMA 控制器的 DMA 总线与总线矩阵协调, 使用 AHB 把外设 ADC 采集的数据经由 DMA 通道存放到SRAM中, 这个数据的传输过程中, 完全不需要内核的参与, 也就是不需要 CPU 的参与,

每次DMA传送由3个操作组成:
- 从外设数据寄存器或者从当前外设/存储器地址寄存器指示的存储器地址取数据, 第一次传输时的开始地址是
DMA_CPARx
或DMA_CMARx
寄存器指定的外设基地址或存储器单元;
- 存数据到外设数据寄存器或者当前外设/存储器地址寄存器指示的存储器地址, 第一次传输时的开始地址是
DMA_CPARx
或DMA_CMARx
寄存器指定的外设基地址或存储器单元;
- 执行一次
DMA_CNDTRx
寄存器的递减操作, 该寄存器包含未完成的操作数目。
二、DMA 功能框图
STM32F4xx 系列的 DMA 可以实现外设寄存器与存储器之间或者存储器与存储器之间传输三种模式。这要得益于 DMA 控制器是采用 AHB 主总线的,可以控制 AHB 总线矩阵来启动 AHB 事务。
它可以执行下列事务:
● 外设到存储器的传输
● 存储器到外设的传输
● 存储器到存储器的传输

- 可供每个数据流选择的通道请求多达 8 个。此选择可由软件配置,允许几个外设启动 DMA 请求。
2.1 外设通道选择
- 每个 DMA 控制器有 8 个数据流,每个数据流有多达 8 个通道(或称请求,外设请求) Request_Stream0-Chanell0
- DMA传输前,设置 DMA 数据流 x 配置寄存器 DMA_SxCR 的 CHSEL[2:0] 位选择对应的通道作为该数据流的目标外设。
- 外设通道选择要解决的主要问题是决定哪一个外设作为该数据流的源地址或者目标地址。
- 每个外设请求都占用一个数据流通道,相同外设请求可以占用不同数据流通道。
- STM32F4X DMA1 和 DMA2 请求映射查看 《STM32F407, 429 参考手册(中文)》表 35. DMA1 请求映射,表 36. DMA2 请求映射。(P206)
- STM32F1X DMA1 和 DMA2 请求映射查看 《STM32F10x中文参考手册_V10》表 59和表60(P149)
2.2 仲裁器
- 决定同一DMA控制器多外设请求时,哪一个数据流具有优先传输的权利
- 软件阶段:配置 DMA_SxCR 寄存器 PL[1:0] 位,配置4个优先级
- 硬件阶段:编号越低越具有优先权
2.3 FIFO
- 每个数据流都独立拥有四级 32 位 FIFO(先进先出存储器缓冲区)。 DMA 传输具有 FIFO 模式和直接模式。
- 直接模式:在每个外设请求都立即启动对存储器传输。
- FIFO模式:DMA 数据流 xFIFO 控制寄存器 DMA_SxFCR 的 FTH[1:0] 位来控制 FIFO 的阈值,分别为 1/4、 1/2、 3/4 和满。如果数据存储量达到阈值级别时, FIFO 内容将传输到目标中。
- FIFO 对于要求源地址和目标地址数据宽度不同时非常有用
- FIFO 另外一个作用使用于突发 (burst) 传输。
2.4 存储器端口、外设端口
DMA 控制器的功能是快速转移内存数据,需要一个连接至源数据地址的端口和一个连接至目标地址的端口。

- DMA2(DMA 控制器 2) 的存储器端口和外设端口都是连接到 AHB 总线矩阵,可以使用 AHB 总线矩阵功能。 DMA2 存储器和外设端口可以访问相关的内存地址,包括有内部 Flash、内部 SRAM、AHB1 外设、 AHB2 外设、 APB2 外设和外部存储器空间。
- DMA1 的存储区端口相比 DMA2 的要减少 AHB2 外设的访问权,同时 DMA1 外设端口是没有连接至总线矩阵的,只有连接到 APB1 外设,
所以 DMA1 不能实现存储器到存储器传输
。
2.5 编程端口
AHB 从器件编程端口是连接至 AHB2 外设的。 AHB2 外设在使用 DMA 传输时需要相关控制信号。
STM32F103C8 和 STM32F407IG DMA功能对比
Here’s a more detailed comparison of the DMA function between the STM32F103C8 and STM32F407IG microcontrollers:
- DMA Controller:
- STM32F103C8: The STM32F103C8, which belongs to the STM32F1 series, has a DMA controller based on the DMA1 module. It provides basic DMA functionality with a simpler architecture.
- STM32F407IG: The STM32F407IG, part of the STM32F4 series, has an advanced DMA controller based on the DMA2 module. It features a more versatile and enhanced architecture with additional features for efficient data transfers.
- Number of Channels:
- STM32F103C8: The STM32F103C8 offers a limited number of DMA channels. It typically provides 7 channels (DMA1_Channel1 to DMA1_Channel7).
- STM32F407IG: The STM32F407IG has a greater number of DMA channels compared to the STM32F103C8. It offers 12 channels (DMA2_Stream0 to DMA2_Stream7, DMA2_Stream4 and DMA2_Stream7 are not available on STM32F407IG).
- Data Width:
- STM32F103C8: The DMA controller in the STM32F103C8 supports data transfers in 8-bit, 16-bit, and 32-bit modes.
- STM32F407IG: The DMA controller in the STM32F407IG also supports 8-bit, 16-bit, and 32-bit data transfers. Additionally, it provides a 16-bit half-word mode for more efficient transfer of 16-bit data.
- Burst Mode Support:
- STM32F103C8: Burst mode transfers in the STM32F103C8 are limited. It supports burst transfers of up to 4 data units in a single burst.
- STM32F407IG: The STM32F407IG has better support for burst mode transfers. It offers larger burst sizes, usually up to 16 or 32 data units in a single burst, resulting in improved transfer speeds.
- FIFO Support:
- STM32F103C8: The DMA controller in the STM32F103C8 does not have dedicated FIFO buffers for each DMA channel.
- STM32F407IG: The STM32F407IG features dedicated FIFO buffers for each DMA channel, enabling efficient buffering and reducing the risk of data loss during high-speed transfers.
- Performance:
- STM32F103C8: The STM32F103C8 operates at a maximum clock frequency of 72 MHz and belongs to the STM32F1 series, which generally offers good performance for many applications.
- STM32F407IG: The STM32F407IG operates at a maximum clock frequency of 168 MHz and is part of the STM32F4 series, which provides significantly higher performance and more advanced features, suitable for demanding applications.
三、DMA 数据配置
DMA 工作模式多样,具有多种可能工作模式,具体可能配置见表 DMA 配置可能情况 。

3.1 DMA 传输模式
- DMA2 支持全部三种传输模式,而 DMA1 只有外设到存储器和存储器到外设两种模式。
- 在 DMA_SxCR 寄存器的 PSIZE[1:0] 和 MSIZE[1:0] 位分别指定外设和存储器数据宽度大小,可以指定为字节 (8 位)、半字 (16 位) 和字 (32 位)
- 直接模式要求外设和存储器数据宽度大小一样,实际上在这种模式下 DMA 数据流直接使用 PSIZE, MSIZE 不被使用。
3.2 源地址和目标地址

- 其中 DMA_SxM1AR 只用于双缓冲模式, DMA_SxM0AR 和 DMA_SxM1AR 都是 32 位数据有效的。
3.3 流控制器
流控制器主要涉及到一个控制 DMA 传输停止问题。 DMA 传输在 DMA_SxCR 寄存器的 EN 位被置 1 后就进入准备传输状态,如果有外设请求 DMA 传输就可以进行数据传输。很多情况下,我们明确知道传输数据的数目,比如要传 1000 个或者 2000 个数据,这样我们就可以在传输之前设置
DMA_SxNDTR
寄存器为要传输数目值, DMA 控制器在传输完这么多数目数据后就可以控制DMA 停止传输。- DMA_SxNDTR是一个 16 位数据有效寄存器,即最大值为 65535
- 如果某些情况下在传输之前我们无法确定数据的数目,那 DMA 就无法自动控制传输停止了,此时需要外设通过硬件通信向 DMA 控制器发送停止传输信号。这里有一个大前提就是外设必须是可以发出这个停止传输信号,只有 SDIO 才有这个功能,其他外设不具备此功能。
3.4 循环模式
循环模式相对应于一次模式。一次模式就是传输一次就停止传输,下一次传输需要手动控制,而循环模式在传输一次后会自动按照相同配置重新传输,周而复始直至被控制停止或传输发生错误。
3.5 传输类型
- PBURST[1:0] 和 MBURST[1:0] 位是位于 DMA_SxCR 寄存器中的,用于分别设置外设和存储器不同节拍数的突发传输;
- PINC 位和 MINC 位是寄存器DMA_SxCR 寄存器的第 9 和;第 10 位,如果位被置 1 则在每次数据传输后数据地址指针自动递增,其增量由 PSIZE 和 MSIZE 值决定;

突发传输与 FIFO 密切相关,突发传输需要结合 FIFO 使用,具体要求 FIFO 阈值一定要是内存突发传输数据量的整数倍。 FIFO 阈值选择和存储器突发大小必须配合使用,具体参考表 FIFO 阈值配置:

3.6 直接模式
默认情况下, DMA 工作在直接模式,不使能 FIFO 阈值级别。
- 直接模式在每个外设请求都立即启动对存储器传输的单次传输。直接模式要求源地址和目标地址的数据宽度必须一致,所以只有 PSIZE 控制,而 MSIZE 值被忽略。突发传输是基于 FIFO 的所以直接模式不被支持。另外直接模式不能用于存储器到存储器传输。
- 在直接模式下,如果 DMA 配置为存储器到外设传输那 DMA 会见一个数据存放在 FIFO 内,如果外设启动 DMA 传输请求就可以马上将数据传输过去。
3.7 双缓冲模式
设置 DMA_SxCR 寄存器的 DBM 位为 1 可启动双缓冲传输模式,并自动激活循环模式。双缓冲不应用于存储器到存储器的传输。
双缓冲模式应用在需要解码程序的地方是非常有效的。比如 MP3 格式音频解码播放, MP3 是被压缩的文件格式,我们需要特定的解码库程序来解码文件才能得到可以播放的 PCM 信号,解码需要一定的实际,按照常规方法是读取一段原始数据到缓冲区,然后对缓冲区内容进行解码,解码后才输出到音频播放电路,这种流程对 CPU 运算速度要求高,很容易出现播放不流畅现象。如果我们使用 DMA 双缓冲模式传输数据就可以非常好的解决这个问题,达到解码和输出音频数据到音频电路同步进行的效果。
3.8 DMA 中断
每个 DMA 数据流在发生以下事件时产生中断:
- 达到半传输: DMA 数据传输达到一半时 HTIF 标志位被置 1,如果使能 HTIE 中断控制位将产生达到半传输中断;
- 传输完成: DMA 数据传输完成时 TCIF 标志位被置 1,如果使能 TCIE 中断控制位将产生传输完成中断;
- 传输错误: DMA 访问总线发生错误或者在双缓冲模式下试图访问“受限”存储器地址寄存器时 TEIF 标志位被置 1,如果使能 TEIE 中断控制位将产生传输错误中断;
- FIFO 错误:发生 FIFO 下溢或者上溢时 FEIF 标志位被置 1,如果使能 FEIE 中断控制位将产生FIFO 错误中断;
- 直接模式错误:在外设到存储器的直接模式下,因为存储器总线没得到授权,使得先前数据没有完成被传输到存储器空间上,此时 DMEIF 标志位被置 1,如果使能 DMEIE 中断控制位将产生直接模式错误中断。
- Author:felixfixit
- URL:http://www.felixmicrospace.top/e58db941420e4176a2847ce160f6e484
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!