目录
什么是DMA?
DMA(Direct Memory Access ,直接存储器访问 ) 提供在 外设与内存 、 存储器和存储器 、 外设 与外设之间的高速数据传输使用。它允许不同速度的硬件装置来沟通,而不需要依赖于CPU ,在这个时间中, CPU 对于内存的工作来说就无法使用。
简单描述:
就是一个
数据搬运工
!!
DMA的意义
代替
CPU
搬运数据,为
CPU
减负。
1.
数据搬运的工作比较耗时间;
2.
数据搬运工作时效要求高(有数据来就要搬走);
3.
没啥技术含量(
CPU
节约出来的时间可以处理更重要的事)。
搬运什么数据?
存储器、外设
这里的外设指的是 spi 、 usart 、 iic 、 adc 等基于 APB1 、 APB2 或 AHB时钟的外设,而这里的存储器包括自身的闪存 (flash) 或者内存 (SRAM)以及外设的存储设备都可以作为访问地源或者目的。
三种搬运方式:
- 存储器→存储器(例如:复制某特别大的数据buf)
- 存储器→外设 (例如:将某数据buf写入串口TDR寄存器)
- 外设→存储器 (例如:将串口RDR寄存器写入某数据buf)
存储器→存储器
存储器→外设
外设→存储器
DMA 控制器
STM32F103 有 2 个 DMA 控制器, DMA1 有 7 个通道, DMA2 有 5 个通道。
一个通道每次只能搬运一个外设的数据!!
如果同时有多个外设的
DMA
请求,则按照优先级进
行响应。
DMA1有7个通道:
DMA2有5个通道
DMA及通道的优先级
优先级管理采用软件
+
硬件:
- 软件: 每个通道的优先级可以在DMA_CCRx寄存器中设置,有4个等级
最高级>高级>中级>低级
- 硬件: 如果2个请求,它们的软件优先级相同,则较低编号的通道比较高编号的通道有较高的优先权。
比如:如果软件优先级相同,通道2优先于通道4
DMA传输方式
- DMA_Mode_Normal(正常模式)
一次DMA
数据传输完后,停止
DMA
传送 ,也就是只传输一次
- DMA_Mode_Circular(循环传输模式)
当传输结束时,硬件自动会将传输数据量寄存器进行重装,进行下一轮的数据传输。 也就是 多次传输模式
指针递增模式
外设和存储器指针在每次传输后可以自动向后递增或保持常量。当设置为增量模式时,下一个要传输的地址将是前一个地址加上增量值。