前言:DMA简单来说就是一个数据转运器,用于将外设与存储器之间的和存储器与存储器之间的数据进行高速转运。主要应用场景在于当AD转换数据时,使用扫描模式,此时就需要DMA来将数据搬运,不然AD转换出的下一个数据会将前一个数据给覆盖掉。
一、DMA的简介
DMA有12个独立的可配置的通道,其中DMA1有7个,DMA2有5个。每个通道都支持软件触发和硬件触发。软件触发一般用于单片机内部各寄存器之间的数据传输,其方式为一次性将所有数据转运完成。硬件触发一般用于外设与内部寄存器之间的数据传输,因为外设采集数据有时效性,必须等待采集完成一次之后再转运,如此反复。
二、DMA的内部结构与基本原理
该图左上角为控制器相当于CPU,右边的Flash,SRAM,还有一堆的寄存器都是数据转运的对象。可以看到左边有DMA1和DMA2两个单元,里面有对应的通道。AHB从设备就是DMA自己的寄存器,用于对DMA进行配置。其中Flash是只读寄存器,不能对其写入数据。
DMA工作流程:在发生一个事件后,外设向
DMA
控制器发送一个请求信号。
DMA
控制器根据通道的优先权处理请求。当DMA
控制器开始访问发出请求的外设时,
DMA
控制器立即发送给它一个应答信号。当从DMA
控制器得到应答信号时,外设立即释放它的请求。一旦外设释放了这个请求,
DMA
控制器同时撤销应答信号。如果有更多的请求时,外设可以启动下一个周期。
三、存储器简介
ROM为掉电不丢失的寄存器。RAM为随机寄存器,掉电丢失。
程序寄存器Flash为烧录的代码的存储位置。内核外设寄存器存的是NVIC这类。
四、DMA具体配置与模式
数据手册上写到:
下面是配置
DMA
通道
x
的过程
(x
代表通道号
)
:
1.
在
DMA_CPARx
寄存器中设置外设寄存器的地址。发生外设数据传输请求时,这个地址将
是数据传输的源或目标。
2.
在
DMA_CMARx
寄存器中设置数据存储器的地址。发生外设数据传输请求时,传输的数
据将从这个地址读出或写入这个地址。
3.
在
DMA_CNDTRx
寄存器中设置要传输的数据量。在每个数据传输后,这个数值递减。
4.
在
DMA_CCRx
寄存器的
PL[1:0]
位中设置通道的优先级。
5.
在
DMA_CCRx
寄存器中设置数据传输的方向、循环模式、外设和存储器的增量模式、外
设和存储器的数据宽度、传输一半产生中断或传输完成产生中断。
6.
设置
DMA_CCRx
寄存器的
ENABLE
位,启动该通道。
一旦启动了
DMA
通道,它既可响应连到该通道上的外设的
DMA
请求。
模式:
循环模式:循环模式用于处理循环缓冲区和连续的数据传输
(
如
ADC
的扫描模式
)
。
存储器到存储器模式:DMA
通道的操作可以在没有外设请求的情况下进行,这种操作就是存储器到存储器模式。
图片来源:江协科技
其中的指定重装寄存器用于实现循环模式,当传输计数器的传输数减到0时,自动重装器就会重新将计数次数初始化,达到一个循环的效果。
五、具体的硬件触发通道