目录
一、DMA简介
DMA(Direct Memory Access)直接存储器存取。DMA有对所有寄存器的访问权限,故而可以进行寄存器之间的互相存贮
DMA可以传递寄存器(运行内存SARM和程序存储器Flash)和外设(一般指外设的数据寄存器DR)、寄存器与寄存器之间的高速数据传输,无需CPU干预,节省了CPU资源
12条可配置的通道,DMA1(7条),DMA2(5条),但STM32 f103c8t6只有DMA1的7条通道
每条通道都可以通过软件或者硬件触发,比如想要将Flash中的信息转运到SARM中去,可以使用软件触发,而外设与寄存器之间就需要硬件触发。每个DMA的通道,硬件触发源都是不相同的
二、存储器映像
运算器,控制器,存储器,输入设备和输出设备运算器和控制器合称CPU,存储器重要的是其地址与内容。以下是STM32中的存储器的类型和名称(详情查看STM32f103x8B数据手册)
ROM是只读存储器,掉电不丢失;RAM是随机存储器,掉电丢失
三、DMA的结构图
首先以“总线矩阵”为分隔带,左侧为主动单元,拥有右侧被动单元的访问权,右侧为被动单元;只能被主动单元读写。Cortex-M3是CPU,其余部分为寄存器。
1.主动单元
有DCode和系统总线,DCode是专门访问Flash的,系统总线是用来访问其他存储器的。此外图中还有3条DMA总线,以太网DMA总线忽略不进行学习。此外,DMA1、DMA2各有7、5个通道,可以互不干扰地独自运行,但是DMA总线只有一条,由仲裁器来根据优先级来判断那个通道优先进行转存。在总线矩阵处,也有一个仲裁器,如果DMA与CPU同时访问同一个目标,则优先DMA通行,CPU部分通行。
2.被动单元
右侧包括Flash(主闪存),SRAM(运行内存),以及外设寄存器(也是SRAM存储器的一种,既可以被CPU进行读写,也可以通过连接的导线控制外设电路的状态),AHB从设备(DMA的一部分,同样是存储器),CPU就可以通过该通路实现对DMA的控制。故而DMA就是一种将寄存器中的内容相互传递的工具。
此外ROM是只读存储器,如果DMA目的地址直接写入相关寄存器比如Flash会导致报错
3.DMA请求
硬件触发DMA的通路
四、DMA运营原理
1.数据的转运方向:
外设-->SROM,SROM、Flash-->外设,Flash-->SRAM,SRAM-->SRAM,四种情况,由于Flash是只读存储器,不可以作为写入地址
2.存储器的3个基本信息
起始地址:从哪里来,到哪里去
数据宽度:指定一次转运,要按多大的数据宽度(数据类型)进行
地址是否自增:下一次转运,是否要转运到下一个位置中去(ADC扫描模式需要使用)
3.传输计数器以及自动重装器
传输计数器就是一个自减计数器,设置自减次数作为DMA转运次数,自减完成后就会将自增地址转换为起始地址.
自动重装器判断是否从新计数,启用该重装器,就是开启连续转换,关闭就是单次转换
4.触发源选择
触发有两个来源,分别是软件触发和硬件触发.M2M来决定使用软件触发还是硬件触发,M2M位1时,使用软件触发,位0时硬件触发.这里的软件触发和前面的自动重装器不可以同时使用,软件触发就是为了尽可能快速地完成对传输计数器的置0。软件触发一般用于存储器到存储器的触发,硬件触发一般适用于外设与存储器之间的触发
5.DMA转运启动条件
(1)触发源(M2M)赋值
(2)给传输计数器赋值
(3)DMA_Cmd()函数的启用(对该部件通电)
6.注意事项:
当传输计数器自减位0后,且自动重装器没有给计数器重装值,就需要先断电(DMA_Cmd函数置DISABLE),再给重装器赋值,之后再通通电
五、剩余细节问题
1.EDA1请求映像
EN=0,数据选择器不工作,取1工作;当M2M位取1是,采用软件触发。每个硬件触发源的通道都不同,使用外设触发需要与下图一一对应,对应的,如果是使用软件触发,那么使用哪个通道都一样。
2.数据对齐
当原宽度与目标宽度相等时,则正常转运;当原宽度小于目标宽度时,在高位写入0(如8--16);当原宽度大于目标宽度时,则省略高位
六、实际情况下,DMA的工作原理
1.数据转运+DMA
(1)填写三个基本信息,a.DataA的首地址与DataB的首地址,b.选择自增模式,c.两个都是uint8_t,大小一样
(2)无需自动重装
(3)触发源选择软件触发,E2E选择1;共有7个数据进行传输,传输计数器置7
(4)启动电源
注意:该转运属于复制转运,转运完后,DataA依旧保留有原来的数据
2.ADC扫描模式+DMA
(1)外设地址写入ADC_DR的地址,目的地址写入存储器的地址。ADC_DR和SRAM都是UInt16_t的大小,外设地址不自增(外设只有一个寄存器位,只能保留一个数据),SRAM自增
(2)传输计数器记7次,而是否自动重装,则可以看ADC是循环模式还是单次模式
(3)触发选择,ADC硬件触发,而且ADC_DR是在第一个通道转换完成后才有使用的意义。此外每个通道完成后都会申请一次DMA请求,用来提醒转运
注意:DMA与ADC基本是绑定的情况