自学内容网 自学内容网

STM32F1学习——DMA直接存储器存取

一、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


原文地址:https://blog.csdn.net/qq_55958175/article/details/145066525

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!