9. DMA
9.1 介绍
Direct memory access(DMA) 直接存储器访问。
这两个DMA控制器总共有16个流(每个控制器8个),每个流用于管理来自一个或多个外围设备的内存访问请求。每个流总共可以有8个通道(请求)。每个都有一个仲裁器来处理DMA请求之间的优先级。
9.2 特点
DMA的主要特性是:
- 双AHB主总线架构,一个专用于内存访问,一个专用于内存访问专用于外围访问
- AHB slave programming 接口只支持32位访问
- 每个DMA控制器有8个流,每个流最多有8个通道(请求)
- 每个流的4字节深度的32位先入先出内存缓冲区(FIFOs)用于FIFO模式或直接模式
-
FIFO模式:软件可选1/4,1/2或3/4之间的FIFO大小
- 直接模式: 每个DMA请求立即启动一个from/to内存的传输。当它被配置为直接模式(FIFO被禁用),在内存向外设模式下传输数据时,DMA仅将一个数据从内存预加载到内部FIFO,以确保在外设触发DMA请求时立即进行数据传输。
-
- 每个流可以由硬件配置为:
- 支持外设到内存,内存到外设,内存到内存的常规通道
- 在内存端也支持双缓冲的双缓冲通道
- 这8个流中的每一个都连接到专用的硬件DMA通道(请求)
- DMA流请求之间的优先级是软件可编程的(4级:非常高,高,中,低),请求0优先级高于请求1,以此类推
- 每个流还支持软件触发当用于内存到内存的传输传输时(只有DMA2控制器支持)
- 每个流请求可以在多达8个可能的通道请求中进行选择。这选择是软件可配置的,并允许多个外设初始化DMA请求
- 要传输的数据的数量可以由DMA控制器或外设控制
- DMA流控制器:要传输的数据项的数量是软件可编程的从1到65535
- 外设流控制器:要传输的数据项的数量是未知的,并受控于在传输结束时源或目标外设通过硬件的发出结束信号的控制。
- 独立的源和目标传输宽度(字节、半字、字):源和目标的数据宽度不相等,DMA自动打包/解包必要的传输以优化带宽。此功能仅在FIFO模式下可用。
- 对于源和目标的递增或非递增寻址
- 支持4、8或16拍的递增突发传输。爆发的大小可由软件配置,通常等于外设FIFO大小的一半
- 每个流都支持循环缓冲区管理
- 每一个流都有5种事件标志(DMA传输一半,DMA传输完成,DMA传输错误,DMA FIFO错误,直接模式错误)以逻辑或的形式组合在一个中断请求中
9.3 DMA功能介绍
9.3.1 一般说明
9.3.2 DMA事务
DMA事务由给定数量的数据传输序列组成。要传输的数据项的数量和它们的宽度(8位、16位或32位)是软件可编程的。
每次DMA传输都包含三个操作:
- 加载。从外设数据寄存器或内存中的某个位置进行的加载,通过DMA_SxPAR或DMA_SxM0AR寄存器进行寻址
- 存储。加载到外设数据寄存器或内存中的某个位置的数据的存储,通过DMA_SxPAR或DMA_SxM0AR寄存器寻址
- 自减。DMA_SxNDTR寄存器自减,其中包含仍然需要执行的事务
DMA事务完成后,外设向DMA控制器发送请求信号。DMA控制器根据通道优先级为请求提供服务。只要DMA控制器访问外设,DMA控制器就会发送给外设一个确认信号。外设一旦收到来自DMA控制器的确认信号就会释放它的请求。一旦请求被外设取消,DMA控制器释放应答信号。如果有更多的请求,则外设可以启动下一个事务。
9.3.3 通道选择
每个流都与一个DMA请求相关联,可以从8个可能的DMA请求中选择一个通道请求。选择由DMA_SxCR中的CHSEL[2:0]位控制。
来自外设的8个请求(TIM、ADC、SPI、I2C等)是独立连接的每个通道。
DMA请求映射的示例见下表。
9.3.4 仲裁
仲裁程序根据8个DMA流请求各自的优先级管理它们AHB主端口(内存和外设端口)并启动外设/内存访问序列。
优先级管理分为两个阶段:
- 软件:每个流的优先级可以在DMA_SxCR寄存器中配置。有四个级别:
- 非常高的优先级
- 高优先级
- 中优先级
- 低优先级
- 硬件:如果两个请求具有相同的软件优先级,则流具有较低的数字优先于具有较高数字的流。例如,流2优先于流4。
9.3.5 DMA 流
每个DMA流可配置为:
- 常规类型事务:内存到外围设备、外围到内存或内存到内存传输
- 双缓冲区类型事务:使用两个内存指针进行双缓冲区传输内存(当DMA读写一个缓冲区时,应用程序可以读写另一个缓冲区)。
要传输的数据量(最多为65535)是可编程的,并与连接到外围AHB端口的请求DMA传输的外围设备的源宽度有关。包含要传输的数据项数量的寄存器在每个事务完成之后递减。
9.3.6 源、目的和传输模式
源和目标传输都可以处理整个外围设备和内存4gb区域,地址从0x0000 0000到0xFFFF FFFF。
该方向使用DMA_SxCR寄存器中的DIR[1:0]位配置并提供三种可能:内存到外设、外围到内存或内存到内存的传输。表24描述了相应的源地址和目标地址:
当数据宽度(以DMA_SxCR寄存器中的PSIZE或MSIZE位进行编程)是半字或一个字时,写入DMA_SxPAR或DMA_SxM0AR/M1AR寄存器中外设地址或内存地址也必须半字或一个字对齐地址边界。
Peripheral-to-memory mode
图24描述了这种模式。
当启用此模式时(通过在DMA_SxCR寄存器中设置位EN),每次一个外设请求发生时,流会启动一个从源的传输以填充FIFO。
当FIFO达到阈值水平时,FIFO的内容被排干并存储到目标中。
当外设请求传输结束(在外设流控制器的情况下)或当DMA_SxCR寄存器的EN位被软件清除时,DMA_SxNDTR寄存器为0,传输停止。
在直接模式下(当DMA_SxFCR寄存器中的DMDIS值为' 0 '时),阈值FIFO级别不可用:每次从外围设备到FIFO的数据传输完成后,相应的数据立即排干并存储到目的地。
只有当流赢得仲裁时,该流才能访问AHB源或目的端口。此仲裁按照DMA_SxCR寄存器中的PL[1:0]位为每个流定义的优先级执行。
Memory-to-peripheral mode
图25描述了这种模式。
当启用此模式时(通过在DMA_SxCR寄存器中设置EN位),流立即启动从源的传输到完全填充FIFO。
每次发生外围设备请求时,FIFO的内容都会被提取并存储到其中的目的地。
当FIFO的级别低于或等于预定义的阈值级别,FIFO将被内存中的数据重新加载满。
当外设请求传输结束(在外设流控制器的情况下)或当DMA_SxCR寄存器的EN位被软件清除时,DMA_SxNDTR寄存器为0,传输停止。
在直接模式下(当DMA_SxFCR寄存器中的DMDIS值为'0'时),阈值没有使用先进先出级别。一旦流被启用,DMA预加载第一个数据到转移到内部FIFO。
在直接模式下(当DMA_SxFCR寄存器中的DMDIS值为' 0 '时),阈值FIFO级别不可用:每次从外围设备到FIFO的数据传输完成后,相应的数据立即排干并存储到目的地。
只有当流赢得仲裁时,该流才能访问AHB源或目的端口。此仲裁按照DMA_SxCR寄存器中的PL[1:0]位为每个流定义的优先级执行。
未完。