1.1 DMA简介
DMA,全称是Direct MemoryAccess,中文意思为直接存储器访问。DMA可用于实现外设与存储器之间或者存储器与存储器之间数据传输的高效性。之所以称为高效,是因为DMA传输数据移动过程无需CPU直接操作,这样节省的CPU资源就可供其它操作使用。从硬件层面来理解,DMA就好像是RAM与I/0设备间数据传输的通路,外设与存储器之间或者存储器与存储器之间可以直接在这条通路上进行数据传输。这里说的外设一般指外设的数据寄存器,比如ADC、SPI、I2C、DCMI等外设的数据寄存器,存储器一般是指片内SRAM、外部存储器、片内Flash等。STM32F1最多有2个DMA控制器(DMA仅存在大容量产品中)DMA1有7个通道。DMA2有5个通道。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。
1.2DMA结构框图
DMA 控制器独立于内核,属于一个单独的外设,结构比较简单:
(1)标号1:DMA请求
如果外设要想通过 DMA 来传输数据,必须先给 DMA 控制器发送 DMA请求, DMA收到请求信号之后,控制器会给外设一个应答信号,当外设应答后日 DMA 控制器收到应答信号之后,就会启动 DMA 的传输,直到传输完毕。
根据前面介绍我们知道,DMA含有DMA1和DMA2两个控制器,其中DMA1含有7个通道,DMA2含有5个通道,不同的DMA控制器的通道对应着不同的縑坋奋聳呋鶉氡观设请求,如图:
(2)标号2:DAM通道
DMA 具有12个独立可编程的通道,其中DMA1有7个通道,DMA2有5个通道,每个通道对应不同的外设的DMA请求。虽然每个通道可以接收多个外设的请求,但是同一时间只能接收一个,不能同时接收多个。
(3)标号3:仲裁器
当发生多个-DMA 通道请求时,就意味着有先后响应处理的顺序问题这个就由仲裁器也管理。仲裁器管理DMA通道请求分为两个阶段。第-阶段属于软件阶段,可以在DMACCRx寄存器中设置,有4个等级:非常高、高、中和低四个优先级。第二阶段属于硬件阶段,如果两个或以上的 DMA 通道请求设置的优先级一样,则他们优先级取决于通道编号编号越低优先权越高,比如通道0高于通道1。在大容量产品和互联型产品中,DMA1控制器拥有高于DMA2控制器的优先级。
1.3DMA数据配置
(1)外设到存储器
当我们使用从外设到存储器传输时,以ADC采集为例。DMA外设寄存器的地址对应的就是ADC数据寄存器的地址,DMA存储器的地址就是我们自定义的变量(用来接收存储AD采集的数据)的地址。方向我们设置外设为源地址。
(2)存储器到外设
当我们使用从存储器到外设传输时,以串口向电脑端发送数据为例。DMA外设寄存器的地址对应的就是串口数据寄存器的地址,DMA存储器的地址就是我们自定义的变量(相当于一个缓冲区,用来存储通过串口发送到电脑的数据)的地址。方向我们设置外设为目标地址。
(3)存储器到存储器当我们使用从存储器到存储器传输时,以内部FLASH内部SRAM复制数据为例。DMA外设寄存器的地址对应的就是内部FLASH(我们这里把内部FALSH当作一个外设来看)的地址,DMA存储器的地址就是我们自定义的变量(相当于一个缓冲区,用来存储来自内部FLASH的数据)的地址。方向我们设置外设(即内部FLASH)为源地址。跟上面两个不一样的是,这里需要把DMACCR位14:MEM2MEM:存储器到存储器模式配置为1,启动 M2M 模式。