0%

8-1DMA直接存储器存取

DMA简介

•DMA(Direct Memory Access)直接存储器存取(DMA可以直接读取STM32内部存储器,包括运行内存SRAM、程序存储器Flash、寄存器等)
•DMA可以提供外设(外设的数据寄存器)和存储器(运行内容SRAM和程序存储器Flash)或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源
•12个独立可配置的通道: DMA1(7个通道), DMA2(5个通道)
•每个通道都支持软件触发和特定的硬件触发(存储器到存储器的转运,一般使用软件触发;外设到存储器之间的数据转运,一般使用硬件触发)
•STM32F103C8T6 DMA资源:DMA1(7个通道)

存储器映像

类型起始地址存储器用途
ROM0x0800 0000程序存储器Flash存储C语言编译后的程序代码
0x1FFF F000系统存储器存储BootLoader,用于串口下载
0x1FFF F800选项字节存储一些独立于程序代码的配置参数
RAM0x2000 0000运行内存SRAM存储运行过程中的临时变量
0x4000 0000外设寄存器存储各个外设的配置参数
0xE000 0000内核外设寄存器存储内核各个外设的配置参数

DMA框图

DMA框图

上图,左上角魏Cortex-M3内核,包含CPU和内核外设。
剩下的所有东西,都可以看作是存储器。
Flash是主闪存,SRAM是运行内存,各个外设,都可以看作是寄存器,也是SRAM寄存器。

DMA基本结构

DMA基本结构
DMA的数据转运,可以从外设到存储器,也可以从存储器到外设,具体的方向,使用方向参数进行控制。
还有一直存储器到存储器的转运方式,比如Flash到SRAM或者SRAM到SRAM。由于Flash只读,因此不能进行Flash到Flash或者SRAM到Flash的操作。

传输计数器,用来指定要转运几次。是自减计数器。

自动重装器的作用:当传输计数器减到0之后,是否恢复到最初的值。

DMA的触发源:包括硬件触发和软件触发。具体选择哪个,由M2M这个参数决定。
软件触发:代表连续触发。不能和循环模式一起使用。
硬件触发:触发源可以选择ADC、串口、定时器等等,一般都是与外设有关的转运,这种转运一般需要特定的时机,比如ADC转换完成、串口收到数据、定时时间到等等。

DMA转运的几个条件:
1.开关控制,DMA_Cmd必须使能
2.传输计数器必须大于0
3.触发源,必须有触发信号。触发一次,转运一次,传输计数器自减一次,当传输计数器等于0,且没有自动重装时,这时无论是否触发,DMA都不在转运了。这时需要把DMA_Cmd给Disable,关闭DMA,再给传输计数器写大于0的数字,再DMA_Cmd给Enable,开启DMA。(这里注意:写传输计数器时,必须关闭DMA,再写)

DMA请求

DMA请求
上图是DMA1的请求映像,包括DMA1的7个通道。
每路都有一个选择器,可以选择硬件触发或者软件触发。
EN控制数据选择器是否工作。0不工作,1工作。
左侧是硬件触发源,是外设请求信号,可以看到每个信号的硬件出发源都是不同的。例如:需要ADC1触发,必须选择通道1。(硬件触发是这样,如果是软件触发,就任意选择了)

这7个触发源,进入仲裁器,进行优先级判断,产生最终的DMA1请求。
优先级判断,默认是通道号越小,优先级越高,也可在程序中自行设置。

数据宽度与对齐

数据宽度与对齐
如果外设和存储器的数据宽度一致,那就是正常的一个个转运。
如果数据宽度不一样,根据上表处理。

数据转运+DMA

数据转运+DMA
将SRAM里的数组A转运到另一个数组B中。

配置外设站点和存储器站点的起始地址、数据宽度、地址是否自增三个参数。
本例中:外设地址写数组A的首地址,存储器地址写数组B的首地址。
数据宽度,都设为8。
地址是否自增,由于需要DataA[0]转运到DataB[0]、DataA[1]转运到DataB[1]等,一一对应,因此都需要自增。

方向参数,设置为外设站点到存储器站点。(如果想从DataB到DataA,需要反过来)

需要转运7次,因此传输计数器给7,自动重装暂时不设置。

触发选择部分,选择软件触发。

最后,调用DMA_Cmd,给DMA使能。

ADC扫描模式+DMA

ADC扫描模式+DMA
左侧是ADC扫描模式的执行流程,在这里有7个通道,触发一次后,7个通道依次进行AD转换,转换结果都放在ADC_DR数据寄存器里面。
在每个单独的通道转换完成之后,应该进行DMA数据转运,且对目的地址进行自增,这样数据不会被覆盖。
因此,DMA配置为:
1.外设地址,写ADC_DR这个寄存器的地址。
2.存储器的地址,可以在SRAM中定义一个数组ADValue
3.数据宽度,16位
4.地址自增,外设地址不自增,存储器地址自增。
5.传输方向,外设站点到存储器站点
6.传输计数器,通道有7个,因此计数7次。
7.计数器是否自动重装,看ADC的配置,ADC如果是单次扫描,DMA的传输计数器可以不自动重装,转换一轮就停止。如果ADC是连续扫描的,那DMA可以使用自动重装,ADC启动下一轮时,DMA也启动下一轮转运,ADC和DMA同步工作。
8.触发选择,ADC硬件触发。