DMA(直接内存访问) 是一种强大的功能,用于实现内存与外设之间以及内存与内存之间的高速数据传输。通过 DMA,数据可以快速地移动,而无需 CPU 的干预,这样可以让 CPU 专注于其他任务,从而提高系统效率。
DMA 控制器概述
STM32 具有两个 DMA 控制器:DMA1 和 DMA2。
- 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 控制器有三个主要的事件标志:
- DMA 半传输完成(表示数据块的一部分已传输完毕)
- DMA 传输完成(表示数据传输完成)
- DMA 传输错误(表示传输过程中发生了错误)
这些事件标志会通过单个中断请求统一处理,简化中断管理。
数据传输的访问目标
DMA 可以访问各种外设和内存区域:
- 闪存、SRAM、APB1、APB2 和 AHB 外设。
数据传输的可编程数据传输数量最大为 65536。
数据传输的触发
硬件触发:通过外设的事件触发 DMA 数据传输。
软件触发:可以通过软件请求启动 DMA 传输。
DMA模块框图
DMA处理
在发生一个事件后,外设向DMA控制器发送一个请求信号。DMA控制器根据通道的优先权处理请求。当DMA控制器开始访问发出请求的外设时,DMA控制器立即发送给它一个应答信号。当从DMA控制器得到应答信号时,外设立即释放它的请求。一旦外设释放了这个请求,DMA控制器同时撤销应答信号。如果有更多的请求时,外设可以启动下一个周期。
总之,每次DMA传送由3个操作组成:
- 从外设数据寄存器或者从当前外设/存储器地址寄存器指示的存储器地址取数据,第一次传输时的开始地址是DMACPARX或DMACARx存指定的外设基地址或存储单元。
- 存数据到外设数据寄存器或者当前外设/存储器地址寄存器指示的存储器地址,第一次传输时的开始地址是DMACPARX或DMACMARx存器指定的外设基地址或存储器单元。
- 执行一次DMACNDTRx寄存器的递减操作,该寄存器包含未完成的操作数目。