(一)DMA简介
DMA也就是直接存储器存取,DMA可以提供外设(一般为外设的数据寄存器,如ADC的数据寄存器,串口的数据寄存器等等)和储存器(运行内存SRAM和程序存储器Flash)或者存储器和存储器之间的高速数据传输,无需CPU干涉,节省了CPU资源。STM32的DMA有12个可独立配置的通道,包括:DMA1(7个通道),DMA2(5个通道)。每个通道都支持软件触发和特定的硬件触发。STM32F130C8T6的DMA资源只有DMA1(7个通道)。
(二)存储器映像
DMA是在存储器之间进行数据转运的,存储器有两个重要的点,一个是存储器的内容,另一个是存储器的地址。表中就是STM32中所有类型的存储器以及他们被安排的地址。ROM是只读存储器,是一种非易失性,掉电不丢失的存储器。RAM是随机存储器,是一种易失性,掉电丢失的存储器。
(三)DMA框图
图中Flash为主闪存,SRAM为运行内存,部分1中的各个外设,都可以看作寄存器,也是一种SRAM存储器。寄存器是一种特殊的存储器,一方面,CPU可以对寄存器进行读写,就像读写运行内存一样,另一方面,寄存器的每一位背后,都连接了一根导线,这些导线可以用于控制外设电路的状态。由2部分可以看出,DMA1有7个通道,各个通道可以分别设置它们转运数据的源地址和目的地址。在3部分中,有个仲裁器,由于DMA总线只有一条,却有多个通道,所有的通道只能分时复用这一条DMA总线,如果产生了冲突那么就会由仲裁器,根据通道的优先级来决定顺序。
(四)DMA基本结构图
让我们来分析这个图,来看DMA具体是怎么工作的。外设寄存器站点和存储器站点是两大主要数据转运站点。由图可以看出,数据的转运可以从外设到存储器,也可以从存储器到外设,还可以从Flash到SRAM,SRAM到SRAM。
4.1外设和存储器
外设和存储器两个站点,都有3个参数。
a.起始地址,两个站点的起始地址决定了数据从哪里啊来,到哪里去。
b.数据宽度,该参数决定了一次转运要按多大的数据宽度进行,可以选择字节Byte,半字HalfWord和字Word。字节是8位,也就是一次转运一个Uint8_t这么大的数据。半字是16位(Uint16_t),字是36位(Uint32_t)。
c.地址是否自增,当指定一次转运完成后,下一次转运要不要把数据转运到下一个位置,相当于指针,p++。
4.2传输计数器和自动重装器
传输计数器主要用来指定运转次数,传输计数器是一个自减计数器。当减到0之后,之前自增的地址也会恢复到起始地址的位置。如果使用自动重装器,当计数器减到0之后,会立即重装到初始值。
4.3DMA触发控制
触发控制,顾名思义,也就是决定DMA需要在什么时机进行转运。触发源,包括硬件触发和软件触发,具体选择哪个,由,M2M决定,当给M2M位1时,DMA就会选择软件触发(不能和循环模式同时用),一般用于存储器到存储器的转运。当M2M位给0,使用硬件触发,硬件触发源可以选择ADC,串口,定时器等。使用硬件触发的转运,一般都是与外设有关的转运。
4.4开关控制
开关控制也就是DMA_Cmd函数,当给DMA使能后,DMA转运就绪,就可以进行转运了。
DMA转运有几个条件
一,DMA_Cmd必须使能
二,传输计数器必须大于0
三,触发源必须有触发信号,触发一次,转运1次,传输计数器自减一次,当传输计数器等于0,且没有自动重装时,此时无论是否触发,DMA都不会在进行转运了,此时DMA_Cmd,给DISABLE,关闭DMA,再为传输寄存器写入一个大于0的数,在给ENABLE,开启DMA。
注意:写传输计数器时,必须要先关闭DMA再进行。