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数据覆盖的缺陷。