DMA,全称为:Direct MemoryAccess,即直接存储器访问。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,能使CPU的效率大为提高。
STM32F4最多有2个DMA控制器(DMA1和DMA2),共16个数据流(每个控制器8个),每一个DMA控制器都用于管理一个或多个外设的存储器访问请求。每个数据流总共可以有多达8个通道(或称请求)。每个数据流通道都有一个仲裁器,用于处理DMA请求间的优先级。
STM32F4有两个DMA控制器,DMA1和DMA2,本章,我们仅针对DMA2进行介绍。STM32F4的DMA控制器框图如图28.1.1所示:
DMA控制器执行直接存储器传输:因为采用AHB主总线,它可以控制AHB总线矩阵来启动AHB事务。它可以执行下列事务:
1,外设到存储器的传输
2,存储器到外设的传输
3,存储器到存储器的传输这里特别注意一下,存储器到存储器需要外设接口可以访问存储器,而仅DMA2的外设接口可以访问存储器,所以仅DMA2控制器支持存储器到存储器的传输,DMA1不支持。
图28.1.1中数据流的多通道选择,是通过DMA_SxCR寄存器控制的,如图28.1.2所示:
从上图可以看出,DMA_SxCR控制数据流到底使用哪一个通道,每个数据流有8个通道可供选择,每次只能选择其中一个通道进行DMA传输。接下来,我们看看DMA2的各数据流通道映射表,如表28.1.1所示:
上表就列出了DMA2所有可能的选择情况,来总共64种组合,比如本章我们要实现串口1的DMA发送,即USART1_TX,就必须选择DMA2的数据流7,通道4,来进行DMA传输。这里注意一下,有的外设(比如USART1_RX)可能有多个通道可以选择,大家随意选择一个就可以了。
接下来,我们介绍一下DMA设置相关的几个寄存器。
第一个是DMA中断状态寄存器,该寄存器总共有2个:DMA_LISR和DMA_HISR,每个寄存器管理4数据流(总共8个),DMA_LISR寄存器用于管理数据流0~3,而DMA_HISR用于管理数据流4~7。这两个寄存器各位描述都完全一模一样,只是管理的数据流不一样。
这里,我们仅以DMA_LISR寄存器为例进行介绍,DMA_LISR各位描述如图28.1.3所示:
如果开启了