江科大STM32入门:DMA传输数据

DMA

简介
  • DMA (Direct Memory Access)直接存储器存取
  • DMA可以提供外设和存储器存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源
  • 12个独立可配置的通道: DMA1 (7个通道),DMA2 (5个通道),每个通道都支持软件触发( 存储器间的**)** 和特定的硬件触发( 外设到存储器间**)。**
存储器映像
  • **计算机组成部分:**运算器,控制器,存储器,输入输出设备
  • CPU:运算器,控制器
  • 存储器:主要是存储器的内容和地址
  • ROM:只读存储器,掉电不丢失数据
  • RAM:随机存储器,掉电丢失数据

其中系统存储器数据为厂家固定的启动加载程序,不修改。选项字节,在下载的时候可以不刷新其内容,保持不变,主要存的是flash读写保护、看门狗等配置。

原理
DMA框图

看成CPU+存储器两大部分

寄存器: 是一种特殊存储器,一方面可以和存储器一样读写内容,另一方面,寄存器每一位背后都连接了一根导线,可以用于控制外设的状态。因此寄存器是连接软件和硬件的桥梁 。软件读写寄存器从而控制硬件执行。即外设是寄存器,寄存器就是存储器

如上图可看到DMA有三个,以太网DMA是自带的不用理会,剩下的DMA1和DMA2只要配置转移数据的源地址和目标地址就可以各自独立的工作了。其中有个仲裁器 ,这是因为虽然多个通道可以独立转运数据,但是DMA总线只有一条,因此只能分时复用这一条DMA总线,如果产生了冲突会使用仲裁器。另外再总线矩阵里也有一个仲裁器,如果DMA和CPU同时访问目标,总线矩阵中的仲裁器会根据一定的规则来协调 DMA 和 CPU 对总线的访问**,** 防止冲突,此时仲裁器执行循环调度,以保证CPU至少可以得到一定的系统总线(存储器或外设)带宽

AHB从设备: DMA作为外设的寄存器,其连接在AHB总线上。所以DMA即是总线矩阵的主动单元,可以读写各种存储器,也是AHB总线上的被动单元,CPU通过这一条路线,就可以对DMA进行参数配置了。

DMA请求: 由触发源(外设)发起,即DMA的硬件触发源。收到请求后之后DMA就可以进行数据转运了。

其中Flash是ROM,只读存储器的一种,如果通过CPU或者DMA都是只能读取,不能写入,因此不能用作DMA目的地址。想要写入需要配置这个Flash接口控制器,对Flash进行写入,流程比较麻烦。SRAM可以随意读写,外设寄存器需要参考手册描述,一般数据寄存器可以正常读写。

DMA基本结构

注意三个参数:起始地址,数据宽度,自增

外设存储器地址可以是别的,也可以是自身相对的地址。

当传输计数器等于0时,且没有启动重装时,无论是否触发,DMA是不会运转的。此时只能先关闭DMA(必须),再对传输计数器写入一个大于0的值。

DMA请求

即DMA出发部分

图中EN位表示通道是否工作,M2M=选择软件/硬件触发。

软件触发是任意的,而每个通道的硬件触发源不同需要特定的硬件通道,需要注意。

数据宽度与对齐

**作用:**每个数据转运的站点都有数据宽度的参数描述,如果宽度一样,就正常处理,如果不一样就会使用到如下表格。

即,当数据宽度不统一时候,(小转大)可以在高位补0/(大转小)把多出来的高位舍弃掉不写入。传输数目是搬了4个数据,B1、B2等是数据,其/前面的是地址。

数据转运操作描述

**传输方向:**存储器------存储器

|---------------------------------------------------------------------------------|------------------------------------------------------------------------|
| | 转运规定的次数7后,传输计数器自减到0,DMA停止,转运完成。 转运是复制转运,DataA[x]的数据并不会消失,会一直有数据。 |

**传输方向:**外设------存储器

触发一次AD,7个通道依次进行转换,再每个通道转换完成后,进行一次DMA数据转运,并且目的地址自行自增,这样就不会覆盖了。

DMA配置: 外设地址写ADC_DR寄存器地址,不自增,存储器地址可以自行创建数组来使用(注意数据寄存器的宽度 ,设置为一致),并且设置自增 。转运计数器为7,代表转运次数

计数器是否重装,可以看ADC配置,**如果是单次扫描,DMA的传输计数器可以不自动重装,如果是连续扫描,那DMA就可以使用自动重装,**在ADC启动下一轮转换的时候,DMA也启动下一轮转运。

ADC_DR的值是在ADC单个通道转换完成后才会有效,因此DMA转运时机,需要和ADC单个通道转换完成同步。所以DMA的触发选择要选ADC的硬件触发

因为ADC转换完成后没有任何标志位,也不会触发中断,所以不好判断某个通道转换完成的时机。根据视频老师的实践,虽然单个ADC通道 转换完成后不产生标志位和中断,但是应该会产生DMA请求去触发DMA搬运。ADC+DMA 很好的弥补了ADC数据覆盖的缺陷。