目录
概述
直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。
每个DMA通道专门用来管理来自于一个或多个外设对存储器访问的请求,还有一个仲裁器来协调各个DMA请求的优先权。
DMA主要特性
- 支持循环的缓冲器管理 。
- 每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求。
- 存储器和存储器间的传输。
- 外设和存储器、存储器和外设之间的传输。
- 闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标。
- 可编程的数据传输数目,最大为65535。
图 1DMA框图
配置步骤
1、开启DMA模块时钟,开启要使用DMA通道的外设的时钟;
2、按照配置外设的一般步骤配置外设,包括相关IO的配置,外设工作方式的配置等;
3、调用外设的DMA配置命令函数配置外设是接收数据通道还是发送数据通道使用DMA;
4、配置相应的DMA通道,在STM32中不同的DMA通道支持的外设通道不同,所以要查阅STM32的参考手册,确定要配置的DMA通道,配置过程如下:
4.1、配置DMA通道的工作方式,比如外设地址,内存地址,传输的数据宽度和数据量等等;
4.2、配置DMA通道的中断以及中断处理函数。
使用DMA时需要注意的问题
1、不同的DMA通道支持的外设不同,例如SPI1的DMA通道是DMA1_Channel3,而SPI2的DMA通道是DMA1_Channel5。
2、DMA使用场景一般是,传输的数据量和传输的时间确定。例如使用SPI或者串口发送字节数确定的数据,而通过中断方式接受数据的场景不适合DMA,例如使用中断的方式通过串口接收数据时,因为每次有数据到来的时候,串口中断都会打断CPU的运行,CPU要介入处理且一般情况下不知道发送方发送的数据量是多少,所以不好配置DMA。