一、系统总体架构
如果想完全理解DMA的作用,这里先介绍一下STM32的系统架构。
其系统是由四个驱动单元和四个被动单元构成。
四个驱动单元有:ARM Cortex、内核的数据总线和系统总线(它们为单片机的核心部分)、两个DMA(直接存储器访问单元,这两个单元与CPU内核有着同等地位,其作用就是在硬件上绕过CPU,直接在内存与IO口设备间开辟一条数据传输的通路,从而降低CPU开销,提高效率)
四个被动单元:单片机的内存Flash、闪存SRAM、可变的静态存储器控制器FSMC、外设(常用的片载资源),驱动单元和被动单元之间通过总线矩阵以及AHB系统总线进行连接和协调。
单片机的变量其实都存储在一个叫做SRAM的存储器中,为单片机的内存,存储速度极快,而存储变量的这个步骤是由单片机的内核通过总线来操作的。如果存在大量的数据转运将会导致CPU极其宝贵的资源都消耗在数据转移上面,为了解决转移数据占用CPU资源的这个痛点,故DMA就诞生了。
二、DMA的介绍(Direct Memory Access)
DMA的英文直译的意思是直接内存访问,主要作用就是转移数据 ,用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输(通俗的讲就是讲数据从一个地址空间复制到另一个地址空间)。无须内核参与,数据可以通过DMA快速地移动,可以节省CPU的资源来做其他操作(比如使内核腾出手专心操作IO口或响应中断等)。在此举个例子让你们更好理解DMA带来的作用:
比如下面的这个程序是先发送10000个串口数据,然才才能让LED闪烁。即发送数据和LED闪烁无法同时进行。
for(i = 0;i<10000;i++)
{
TXREG = 0xaa;//串口发送0xaa
}
LED = 1;//LED灭0.5s
delay(500);
LED = 0;//LED亮0.5s
delay(500);
但如果我们使用了DMA,就能一边发送串口数据一边让LED闪烁了。 我们需要发送的数据存储于SRAM中,只有在初始配置DMA时才需要总线参与,配置好后就无需内核参与了,DMA自动完成数据的转运,而内核就能专心处理自己的事情。
两个DMA控制器有12个独立可配置通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自 于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。DMA的作用总结就是一句话:给CPU减负。
三、DMA框图
DMA的框图和内核架构图一样,没啥变化。
2.1 DMA请求:
如果STM32的外设想要通过DMA来传输数据,必须先给DMA控制器发送DMA请求,DMA收到请求后,控制器就会给外设一个应答信号,当外设应答后且 DMA 控制器收到应答信号之后,就会启动 DMA 的传输,直到传输完毕。
2.2 DMA通道
通过DMA通道,可以实现存储器到外设或者外设到存储器。上面也介绍了DMA有DMA1和DMA2两个控制器,而DMA1有7个通道,DMA2有5个通道。下图附上各DMA的通道对应的请求(不同DMA控制器的通道对应不同的外设请求,也就是外设确定时,其通道并不是随便选的):