八、DMA 直接内存访问(DMA)是用来以提供外设和内存、内存和内存之间的高速数据传输的。数据可以在没有任何CPU干预下通过的DMA进行传输。这使得CPU资源更倾重与其他操作。 DMA控制器基于一个复杂的总线矩阵架构,结合了功能强大的双AHB主总线架构与独立的FIFO,以优化系统带宽。 两个DMA控制器共有16个数据流(stream),每个数据流可以编程与规定的通道中的一个搭配。
DMA的工作模式 1. 单次传输 2. 多次传输(burst):把数据分成多次传输
DMA的工作模式
1. 循环模式:循环模式是可用来处理循环缓冲区和连续的数据流(如ADC扫描模式)。启此功能可以设置DMA_SxCR寄存器的CIRC位启用。
在循环模式,在burst方式下,它必须遵循下面的规则 DMA_SxNDTR 等于 ((Mburst beat) × (Msize)/(Psize))的整数倍。
2. 双缓冲模式:双缓冲模式通过设置在DMA_SxCR寄存器的DBM位启用。 双缓冲模式与单缓冲模式的区别在于它有两个地址,当栓缓冲模式被使能,循环模式会被自动使能,每次传输完成,内存地址将会被交换。当一个内存区域被DMA控制器使用时,另一个可供程序使用。
如果需要改变内存地址,需要遵循以下规则: 当DMA_SxCR 寄存器的CT 位为 0时,DMA_SxM1AR寄存器可以被改变 当DMA_SxCR 寄存器的CT 位为 1时,DMA_SxM0AR寄存器可以被改变
设置步骤: 1. 使能相关时钟。 2. 如果数据流已启用,通过重置在DMA_SxCR寄存器的EN位禁用它,然后读取该位,以确认有没有持续的数据流操作。向该位写0不会立即生效,因为它实际上是在全部转移完成时才被清除的。当EN位读为0,这意味着数据流是准备好,可以进行配置了。因此,任何数据流配置之前,有必要等待EN位被清除。在数据流重新启动前,前一次DMA传输中的状态寄存器(DMA_LISR and DMA_HISR)所有数据流专用的位应该被清除。 3. 在DMA_SxPAR寄存器中设置外设端口寄存器的地址。 4. 在DMA_SxMA0R寄存器中设置内存的地址(在双缓冲模式的情况下,还需在DMA_SxMA1R寄存器中设置内存的地址)。 5. 在DMA_SxNDTR寄存器中设置传输的数据总数,每个外设的事件或每次burst传输之后,这个值是将会递减。 6. 在DMA_SxCR寄存器使用CHSEL[2:0] 选择DMA通道。 7. 如果外设为流量控制器,它支持此功能,设置DMA_SxCR寄存器中PFCTRL的位。 8. 在DMA_SxCR寄存器的PL[1:0]位配置数据流优先级。 9. 配置FIFO(启用或禁用,发送和接收的阀值)。 10. 在DMA_SxCR寄存器中配置数据传输的方向,外设和内存递增/固定的模式,单个或burst传输,外设和存储器的数据宽度,循环模式,双缓冲模式和完成几分之几后中断。 11. 激活设置数据流在DMA_SxCR寄存器的EN位。 12. 使能相关外设寄存器的DMA模式位,启动传输。
程序:
运行结果:
|
|