1. 使用范围:
DMA(直接存储器存取)提供在外设与存储器之间或者存储器和存储器之间的高速数据传输使用。注意这里的外设指的是 32 的外设,比如 spi、usart、iic、adc 等基于 APB1 、APB2 或 AHB 时钟的外设,而这里的存储器包括 32 自身的闪存(flash)或者内存(SRAM)以及外设的存储设备都可以作为访问的源或者目的。注意外部存储设备其自身在这就是外设了,配置时属于外设,不要与配置寄存器的存储设备混淆
 
2. 以目前嵌入式为例,DMA 和 CPU 两者怎么实现分时使用内存:
通常采用以下三种方法:
(1)停止 CPU 访内存;
(2)周期挪用;
(3)DMA 与 CPU 交替访问内存。
 
停止 CPU 访问内存
当外围设备要求传送一批数据时,由 DMA 控制器发一个停止信号给 CPU,要求 CPU 放弃对地址总线、数据总线和有关控制总线的使用权 .DMA 控制器获得总线控制权以后,开始进行数据传送 . 在一批数据传送完毕后,DMA 控制器通知 CPU 可以使用内存,并把总线控制权交还给 CPU. 图(a)是这种传送方式的时间图 . 很显然,在这种 DMA 传送过程中,CPU 基本处于不工作状态或者说保持状态。
 
 
 
优点: 控制简单,它适用于数据传输率很高的设备进行成组传送。
 
缺点: 在 DMA 控制器访内阶段,内存的效能没有充分发挥,相当一部分内存工作周期是空闲的。这是因为,外围设备传送两个数据之间的间隔一般总是大于内存存储周期,即使高速 I/O 设备也是如此。例如,软盘读出一个 8 位二进制数大约需要 32us,而半导体内存的存储周期小于 0.5us,因此许多空闲的存储周期不能被 CPU 利用。
 
周期挪用
当 I/O 设备没有 DMA 请求时,CPU 按程序要求访问内存;一旦 I/O 设备有 DMA 请求,则由 I/O 设备挪用一个或几个内存周期。
 
这种传送方式的时间图如下图(b):
 
 
 
I/O 设备要求 DMA 传送时可能遇到两种情况:
(1)此时 CPU 不需要访内,如 CPU 正在执行乘法指令。由于乘法指令执行时间较长,此时 I/O 访内与 CPU 访内没有冲突,即 I/O 设备挪用一二个内存周期对 CPU 执行程序没有任何影响。
 
(2)I/O 设备要求访内时 CPU 也要求访内,这就产生了访内冲突,在这种情况下 I/O 设备访内优先,因为 I/O 访内有时间要求,前一个 I/O 数据必须在下一个访问请求到来之前存取完毕。显然,在这种情况下 I/O 设备挪用一二个内存周期,意味着 CPU 延缓了对指令的执行,或者更明确地说,在 CPU 执行访内指令的过程中插入 DMA 请求,挪用了一二个内存周期。与停止 CPU 访内的 DMA 方法比较,周期挪用的方法既实现了 I/O 传送,又较好地发挥了内存和 CPU 的效率,是一种广泛采用的方法。但是 I/O 设备每一次周期挪用都有申请总线控制权、建立线控制权和归还总线控制权的过程,所以传送一个字对内存来说要占用一个周期,但对 DMA 控制器来说一般要 2—5 个内存周期(视逻辑线路的延迟而定)。因此,周期挪用的方法适用于 I/O 设备读写周期大于内存存储周期的情况。
 
DMA 与 CPU 交替访问内存
如果 CPU 的工作周期比内存存取周期长很多,此时采用交替访内的方法可以使 DMA 传送和 CPU 同时发挥最高的效率。
 
这种传送方式的时间图如下
 
 
 
此图是 DMA 与 CPU 交替访内的详细时间图 . 假设 CPU 工作周期为 1.2us,内存存取周期小于 0.6us,那么一个 CPU 周期可分为 C1 和 C2 两个分周期,其中 C1 专供 DMA 控制器访内,C2 专供 CPU 访内。
 
这种方式不需要总线使用权的申请、建立和归还过程,总线使用权是通过 C1 和 C2 分时制的。CPU 和 DMA 控制器各自有自己的访内地址寄存器、数据寄存器和读 / 写信号等控制寄存器。在 C1 周期中,如果 DMA 控制器有访内请求,可将地址、数据等信号送到总线上。在 C2 周期中,如 CPU 有访内请求,同样传送地址、数据等信号。事实上,对于总线,这是用 C1,C2 控制的一个多路转换器,这种总线控制权的转移几乎不需要什么时间,所以对 DMA 传送来讲效率是很高的。这种传送方式又称为“透明的 DMA”方式,其来由是这种 DMA 传送对 CPU 来说,如同透明的玻璃一般,没有任何感觉或影响。在透明的 DMA 方式下工作,CPU 既不停止主程序的运行,也不进入等待状态,是一种高效率的工作方式。当然,相应的硬件逻辑也就更加复杂 .
 
的 DMA 控制器和 Cortex?-M3 核心共享系统数据总线,执行直接存储器数据传输。当 CPU 和 DMA 同时访问相同的目标(RAM 或外设)时, DMA 请求会暂停 CPU 访问系统总线达若干个周期,总线仲裁器执行循环调度,以保证 CPU 至少可以得到一半的系统总线(存储器或外设)带宽。
 
也就是说对 32 而言,DMA 即使和 CPU 使用同样的内存空间,32 也会保证 cpu 至少会占用一半以上运行时间。也就是宏观上两者仍是同步的。而当 DMA 和 CPU 使用不同空间时,两者宏观上也是同步的
 
3.STM32 使用 DMA 非循环方式传输完成后重新开启传输:
当通道配置为非循环模式时,传输结束后(即传输计数变为 0)将不再产生 DMA 操作。要开始新的 DMA 传输,需要在关闭 DMA 通道的情况下,在 DMA_CNDTRx 寄存器中重新写入传输数目。
 
即关 DMA->写传输数目 ->开 DMA
 
4. 借用系统提供的库函数或者说 DMA_CNDTRx 寄存器可以查询我们传输的剩余数据,可用在记录当前接收数据百分比的显示。
 
5. 存储器到存储器模式
DMA 通道的操作可以在没有外设请求的情况下进行,这种操作就是存储器到存储器模式。(我们以串口为例,这种外设查看串口使能 DMA 时序可知其会自动向 CPU 提 DMA 请求,而对于比如外设也是存储设备那么他自身不具有自动提 DMA 申请功能,这种就属于存储器到存储器模式,这是 m2m 位需置 1)
 
 
以上图 DMA1 请求映像为例,可知外设(这里指的是比如串口 spi TIM 等 32 自带的外设)都是以硬件自动触发的 DMA 请求,而非自身外设比如加的外部存储设备无硬件自动触发机制就需要通过设置 M2M 位实现软件触发 DMA 请求给 CPU 了当设置了 DMA_CCRx 寄存器中的 MEM2MEM 位之后,在软件设置了 DMA_CCRx 寄存器中的 EN 位启动 DMA 通道时, DMA 传输将马上开始。当 DMA_CNDTRx 寄存器变为 0 时, DMA 传输结束。存储器到存储器模式不能与循环模式同时使用。