DMA

DMA(直接内存访问) 是一种强大的功能,用于实现内存与外设之间以及内存与内存之间的高速数据传输。通过 DMA,数据可以快速地移动,而无需 CPU 的干预,这样可以让 CPU 专注于其他任务,从而提高系统效率。

DMA 控制器概述

STM32 具有两个 DMA 控制器:DMA1DMA2

  • DMA1:7 个通道
  • DMA2:5 个通道
  • 总共:12 个可配置的 DMA 通道。

DMA 通道

每个 DMA 通道管理一个或多个外设的内存访问请求。

DMA 通道通过专用硬件 DMA 请求与外设进行通信,也支持软件触发器。

每个 DMA 通道具有独立的配置功能,包括数据传输方向、内存和外设的数据大小等。

每个通道都能够独立配置,可以连接到外设(如 USART、SPI、ADC、DAC 等)进行数据传输。

DMA 请求优先级

DMA 通道之间的优先级是可编程的,有 4 个优先级级别:非常高、高、中、低。

当多个请求的优先级相等时,优先级由硬件决定(例如请求1优先于请求2)。

支持的传输类型

DMA 支持以下几种数据传输模式:

  • 内存到内存:可以直接在内存之间传输数据。
  • 外设到内存:将外设(例如 USART、ADC)的数据传输到内存。
  • 内存到外设:将内存中的数据传输到外设(例如 DAC、USART)。
  • 外设到外设:外设之间的数据传输。

数据传输大小

DMA 支持独立的源和目标数据传输大小,常见的大小单位包括字节、半字、字等。

数据源和目标地址必须按数据大小进行对齐。

循环缓冲区

支持循环缓冲区管理,适用于需要连续读取/写入数据的场景。

事件标志和中断

DMA 控制器有三个主要的事件标志:

  1. DMA 半传输完成(表示数据块的一部分已传输完毕)
  2. DMA 传输完成(表示数据传输完成)
  3. DMA 传输错误(表示传输过程中发生了错误)

这些事件标志会通过单个中断请求统一处理,简化中断管理。

数据传输的访问目标

DMA 可以访问各种外设和内存区域:

  • 闪存SRAMAPB1APB2AHB 外设。

数据传输的可编程数据传输数量最大为 65536

数据传输的触发

硬件触发:通过外设的事件触发 DMA 数据传输。

软件触发:可以通过软件请求启动 DMA 传输。

DMA模块框图

dmamkkt

DMA处理

在发生一个事件后,外设向DMA控制器发送一个请求信号。DMA控制器根据通道的优先权处理请求。当DMA控制器开始访问发出请求的外设时,DMA控制器立即发送给它一个应答信号。当从DMA控制器得到应答信号时,外设立即释放它的请求。一旦外设释放了这个请求,DMA控制器同时撤销应答信号。如果有更多的请求时,外设可以启动下一个周期。

总之,每次DMA传送由3个操作组成:

  • 从外设数据寄存器或者从当前外设/存储器地址寄存器指示的存储器地址取数据,第一次传输时的开始地址是DMACPARX或DMACARx存指定的外设基地址或存储单元。
  • 存数据到外设数据寄存器或者当前外设/存储器地址寄存器指示的存储器地址,第一次传输时的开始地址是DMACPARX或DMACMARx存器指定的外设基地址或存储器单元。
  • 执行一次DMACNDTRx寄存器的递减操作,该寄存器包含未完成的操作数目。

DMA 请求表

DMA1qqb

DMA2qqb.png

实现

https://github.com/TooUpper/SensorDrive