目录
DMA简介
软件触发:存储器到存储器的数据转运 例如flash转到SRAM中
硬件触发:外设到存储器的数据转运,ADC完成AD转换后,触发一次,转运一次
存储器映像
DMA框图
cpu和存储器构成
Flash是主闪存,SRAM是运行内存,各个外设可看出寄存器
总线矩阵左端是主动单元,拥有存储器的访问权,右边为被动单元,只能被左边的主动单元读写
Dcode访问Flash,系统总线访问其他
内部多通道可完成数据转运,仲裁器用于调度各个通道,防止发生冲突,AHB从设备用于配置DMA参数,DMA请求用于硬件触发DMA的数据转运
DMA基本结构图
传输方向:外设寄存器<——>存储器
Flash ——>SRAM
SRAM <——> SRAM (Flash只读)
起始地址:决定从哪来到哪去
数据宽度:指定一次转运要按多大的数据宽度来进行(Byte、Halfword、Word)
地址是否自增:意思是地址转运后,是否要将地址转到下个地址
传输计数器:自减,控制DMA转运次数
自动重装器:减到0后,自增的地址回到初始位
触发:决定DMA在什么时机进行转运
M2M:决定硬件触发还是软件触发,1时软件触发(连续触发, 多用于存储器到存储器情况),以最快速度连续不断的触发DMA,不能和自动重装同时用,给0时硬件触发(ADC、定时器、串口)在硬件达到一定条件时,给信号DMA转运
开关控制:DMA_Cmd使能
DMA转运条件
1、开关控制使能状态
2、传输计数器大于0
3、M2M触发源必须有信号
DMA请求
EN=0时不工作, EN=1时工作
M2M选择是硬件触发还是软件触发
每个硬件对应的通道不同,软件触发任意选择
经过通道后进入优先权判断,通道越小优先级越高,也可以自定义
数据宽度与对齐
源端宽度=目标宽度:正常传递
源端宽度<目标宽度:高位补0
源端宽度>目标宽度:舍弃高位
数据转运+DMA
项目目标:将SRAM数组 DataA[传递到 SRAM数组 DataB
步骤:
1、配置外设以及存储器的起始地址(首地址)、数据宽度(8字节)、地址是否自增(自增)
2、方向参数:外设寄存器--->存储器
3、传输计数器:7
4、不需要自动重装
5、软件触发
6、给DMA使能
ADC扫描模式+DMA
项目目标:7个通道一次进行AD转换,结果都放到ADC_DR数据寄存器中,在每个单独的通道转换完成后,进行DMA数据转运,并且目的地址自增
步骤:
1、配置外设以及存储器的起始地址(外设:ADC_DR地址,存储器:定义一个ADValue地址)、数据宽度(16字节)、地址是否自增(外设不自增,存储器自增)
2、方向参数:外设寄存器--->存储器
3、传输计数器:7
4、是否自动重装看ADC扫描模式
5、ADC的硬件触发
6、给DMA使能