DMA即直接存储器访问,无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,他是通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,可以使得CPU的效率大大提高。
STM32F103有两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。为了保证每个通道协调有序,还有一个仲裁器来协调各个DMA请求的优先权。
如图为STM32F103的12个通道DMA请求预览表
这些通道的优先级可以通过软件和硬件配合设定,软件方面可以通过编程配置寄存器,当配置的优先权相等时,由硬件决定。
软件:每个通道的优先权可以在DMA_CCRx寄存器中设置,有4个等级:
─ 最高优先级─ 高优先级─ 中等优先级─ 低优先级硬件:如果2个请求有相同的软件优先级,则拥有较低编号的通道比拥有较高编号的通道有较高的优先权。举个例子,通道2优先于通道4。
DMA有4种传输模式
存储器和存储器间的传输外设和外设间的传输存储器到外设间的传输外设到存储器间的传输想要使用DMA传输还需要确定这么几点内容:DMA传输的源、目的和长度。可以通过配置如下寄存器,以实现目的。
DMA_CPARx寄存器(DMA_CPARx)(x = 1…7) 设置外设地址,作为数据传输的源或目标。DMA_CMARx寄存器(DMA_CMARx)(x = 1…7)设置存储器地址,作为数据传输的源或目标。DMA_CNDTRx寄存器 设置写入要传输的数据量,即长度。数据传输数量为0至65535。DMA_CCRx寄存器 设置数据传输的方向。 如果要配置存储器到存储器模式。MEM2MEM这一位需要置1 配置源和目的的数据宽度,两边尽量保持一致 MSIZE:存储器数据宽度;PSIZE:外设数据宽度可以在DMA传输过半、传输完成和传输错误时产生中断。为应用的灵活性考虑,通过设置寄存器DMA_ISR(DMA中断状态寄存器)的不同位来打开这些中断