一、DMA直接存储器存取
DMA的全称是 Direct Memory Access 直接存储器存取,他可以提供外设和存储器间或存储器和存储器间的高速数据传输,无需CPU的干预。
STM32有12个DMA通道,由DMA1(7个通道组成)和DMA2(5个通道组成),STM32F103C8t6仅有DMA1。同时每个通道都支持软件触发和特定硬件触发,主要原因是外设的数据有一定的时机性,需要等待特定硬件或软件,此时的数据才能使用。
二、DMA电路结构
1、DMA电路框图
下图是DMA的框图,DMA1有一条专门的总线通道拥有和CPU一样的执行权限,同时总线矩阵上也有控制DMA的一条线路,这条线路是CPU通过系统总线控制DMA使用的。其他外设可以向DMA发送请求,来硬件触发DMA,同时DMA里面拥有一个总裁器主要是判断优先级使用的。
2、DMA基本结构
DMA的基本逻辑是给给定两个寄存器地址,确定传输方向和传输数量,配置自动重装来判断是否是连续模式,同时配置M2M来选择是硬件触发还是软件触发。
同时给定的两个寄存器也有三个配置参数,分别是起始地址,数据的宽度和地址是否自增。
3、硬件触发DMA
在硬件触发DMA的时候需要根据硬件的类型选择相应的DMA通道,同时默认通道数字越小,通道优先级越高,当然您也可以使用软件配置。
三、数据宽度与对齐
8位为一个字节,16位称为半字,32位称字。数据对其的基本方式是,两边位数相同无事发生,宽的传窄的,舍弃高位。窄的传宽的,高位补0。
四、代码
本次实验仅仅使用ADC1的通道1-4,接入四个模拟输入,实现了ADC单次模式下,DMA单次模式的数据转运,因为在主函数中while 1 的软件触发ADC,相当于模拟了循环模式,这只是为了不删除单次模式的代码,如果您想用循环模式,当然可以直接改配置。代码逻辑如下 ① 开启ADC、DMA、GPIO的时钟。②配置ADC的预分频系数。 ③初始化GPIO。④波动数据选择器,选择ADC的通道。⑤配置ADC的模数转换部分。⑥初始化DMA ⑦使能ADC并打开ADC-DMA的通道一的硬件触发,使能DMA。⑧校准ADC
为了节省文章篇幅,代码已经放在github仓库里了。hal库的暂未更新,请耐心等待。
STM32F103c8t6_learning/GPIO_std/STM32f1_ADC_DMA at main · Jiang-kun02/STM32F103c8t6_learning
五、参考
[8-1] DMA直接存储器存取_哔哩哔哩_bilibili
[8-2] DMA数据转运&DMA+AD多通道_哔哩哔哩_bilibili