1. DMA简介
DMA(Direct Memory Access)直接存储器存取
DMA可以提供外设和存储器 或者存储器和存储器 之间的高速数据传输
无需CPU介入,节省了CPU的资源
存储器到存储器 的数据转运,我们一般使用软件触发。
外设到存储器的数据转运,我们一般使用硬件触发。
2. STM32的存储器
下表列出了STM32具有的存储器,以及存储器的地址及用途:
ROM掉电不丢失;
RAM掉电丢失;
| 类型 | 起始地址 | 存储器 | 用途 |
|---|---|---|---|
| ROM | 0x0800 0000 | 程序存储器Flash | 存储C语言编译后的程序代码 |
| ROM | 0x1FFF F000 | 系统存储器 | 存储BootLoader,用于串口下载 |
| ROM | 0x1FFF F800 | 选项字节 | 存储一些独立于程序代码的配置参数 |
| RAM | 0x2000 0000 | 运行内存SRAM | 存储运行过程中的临时变量 |
| RAM | 0x4000 0000 | 外设寄存器 | 存储各个外设的配置参数 |
| RAM | 0xE000 0000 | 内核外设寄存器 | 存储内核各个外设的配置参数 |
3. DMA框图
方向部分就是DMA运行区域:
存储器和存储器 以及外设到存储器
既然需要转运数据,就需要如下的三个参数:
1: 起始地址
2:数据宽度
3:地址是否自增
对于地址是否自增:
比如通过串口接收数据,进行数据转运,此时,地址选择不自增,数据会不断的填入这个地址,我们只需要进行转运即可。
传输计数器:
用来确定转运多少次数据;
当传输计数器降低至0后,会通过自动重装器来重置计数器。
触发方式:
触发方式提供图中的M2M来决定;
当M2M置1,此时软件触发DMA转运
当M2M置0,此时为硬件触发,提供外设的标志位来进行触发。

4. DMA请求来源
上述介绍了两种触发方式,此部分就是具体的DMA通道,对应的触发源:
由图中可得:
DMA可以转运SPI,IIC,UART的数据;
以及定时器TIM信号触发DMA转运。
右侧的硬件优先级,通过仲裁器来判断其运行的先后顺序。

5. DMA数据宽度转运原则
按照下图所示:
当读小宽度写大宽度,此时高位补0;
当读大宽度写小宽度,此时只保留低位;

6. DMA实例
6.1 固定数组数据转运
若有两组数据,如下表所示,那么,地址需要自增,将对应位置的数据转运到对应的位置:

6.2 AD扫描模式+ DMA数据转运
因为是扫描模式,且每次的AD采样结果都会将其存储在DR寄存器,所以,外设地址不自增,目标地址自增,此时可以将数据传输到对应的数组中:
