DMA(Direct Memory Access)直接内存访问,也是数据高速传输通道。DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。
两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。
7.1 DMA框图
1.DMA请求
如果外设要想通过DMA来传输数据,必须先给DMA控制器发送DMA请求,DMA收到请求信号之后,控制器会给外设一个应答信号,当外色号应答之后且DMA控制器收到应答信号之后,就会启动DMA的传输,直到传输完毕。
2.通道
DMA有 DMA1 和 DMA2 两个控制器, DMA1 有 7 个通道, DMA2 有 5 个通道,不同的 DMA 控制器的通道对应着不同的外设请求。 虽然每个通道可以接收多个外设的请求,但是同一时间只能接收一个,不能同时接收多个。
3.仲裁器
当发生多个 DMA 通道请求时,这个就由仲裁器也管理。仲裁器管理 DMA 通道请求分为两个阶段。第一阶段属于软件阶段,,有 4 个等级:非常高、高、中和低四个优先级。第二阶段属于硬件阶段,如果2个请求有相同的软件优先级,则较低编号的通道比较高编号的通道有较高的优先权,编号越低优先权越高。 DMA1 控制器拥有高于 DMA2 控制器的优先级。
7.2 DMA主要特性
12个独立的可配置的通道(请求):DMA1有7个通道,DMA2有5个通道
每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发,这些功能通过软件来配置
在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1)
独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐
支持循环的缓冲器管理
每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这三个事件标志逻辑或成为一个单独的中断请求
存储器和存储器之间的传输
外设和存储器、存储器和外设之间的传输
内存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标
可编程的数据传输数目:最大为65535
7.3 DMA处理和通道配置
DMA处理过程
1.在发生一个事件后,外设向DMA控制器发送一个请求信号
2 .DMA控制器根据通道的优先权处理请求
3 .DMA控制器立即发送给外设一个应答信号
4 .外设释放请求 DMA控制器同时撤销应答信号
通道配置过程
- 在DMA_CPARx寄存器中设置外设寄存器的地址。发生外设数据传输请求时,这个地址将是数据传输的源或目标
- 在DMA_CMARx寄存器中设置数据存储器的地址。发生外设数据传输请求时,传输的数据将从这个地址读出或写入这个地址
- 在DMA_CNDTRx寄存器中设置数据存储器的数据量。在每个数据传输后,这个数值递减
- 在DMA_CCRx寄存器的PL[1:0]位中设置通道的优先级
- 在DMA_CCRx寄存器中设置数据传输的方向、循环方式、外设和存储器的增量模式、外设和存储器的数据宽度、传输一半产生中断或传输完成产生中断
- 设置DMA_CCRx寄存器的ENABLE位,启动该通道