DMA这简单的三字母表示DirectMemoryAccess,直译过来就是“直接存储器存取”,其设计目的是提供在外设和存储器之间或者存储器和存储器之间的高速数据传输,而无须MCU的干预,从而节省了MCU宝贵的运行时间,为其它操作提供了充足的时间。
本文引用地址:http://www.eepw.com.cn/article/182406.htm
STM32F103系统MCU的DMA控制器有7个通道,每个通道专门用来管理来自一个或多个硬件外设对存储器的访问请求。该访问请求可以通过硬件触发,也可以通过软件配置来完成软件触发。7个通道请求通过一个仲裁器来协调,它们的优先级可以通过软件编程来设置,但相等的优先级通过固有的硬件决定(请求0优先于请求1)。
DMA控制器是可以完成外设至内存、内存至外设与内存至内存的三方数据直接转移。数据在传输的时候可以选择字节、半字与全字的传输宽度,并模拟打包与拆包过程,支持循环的缓冲器管理。最大的传输数据长度为65536,当然,如果选择全字传输则DMA传输一次传输可多达128K个字节的数据,这个对于嵌入式的MCU来说,可以说是一个天文数字了。
DMA控制器对于数据的处理传输是采用的共享系统数据线执行的,因此,在1个DMA请求发生时要占用至少2个周期的总线时间,考虑到其它原因,2个连续的DMA请求间释放系统时钟至少1个周期,如果对于72Mhz的MCU来说一个周期约为14ns,2个周期也就是28个ns的时间。MCU的计算时间已经进入了纳秒阶段了……
DMA的实现过程只有简单的三步(当然是简单说了):
从外设数据寄存器或者从DMA_CMARx寄存器指定地址的存储器单元执行加载操作。
存数据到外设数据寄存器或者存数据到DMA_CMARx寄存器指定地址的存储器单元。
执行一次DMA_CNDTRx寄存器的递减操作。该寄存器包含未完成的操作数目。
DMA控制器通道的请求映像。DMA通道有7个请求,而这7个请求与所连接的外设可不是随心所欲的选择,因此,对于在同一个通道的DMA请求外设来说,在同一时间只能有一个请求有效,我们先请出来DMA请求映像来,如下图所示:
从上面可以清楚的看到,每个通道都可以用做Memory2memory,而这个功能,笔者认为却是相当重要的。
通讯与传感器是目前发展的两个大发向,而与外设相连的DMA通道是以最快、最省事的方式将数据传给MCU,而我们知道原始数据肯定要进行一步数据的处理,因此,使用DMA的Memory2memory功能可以轻松完成数据“乒乓控制”,从而同时完成数据的采集与处理。通讯时,待发送的数据存储至缓冲器,而DMA的内存至外设,又可以把数据直接送到外设,不用MCU的任何运算与资源,对于数据通讯节省了大师宝贵的时间,也使得工程师们更加把精力关注于数据的处理中。
这么多的优点,STM32并没有多加银子,完全是免费赠送的,以后的项目应用一定使用。免费而高效,何乐而不为呢?