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

ops/2025/1/16 3:51:48/

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


http://www.ppmy.cn/ops/150456.html

相关文章

开源AI微调指南:入门级简单训练,初探AI之路

112,如何让 113? 简单的微调你的 AI, 微调前的效果,怎么调教它都是 112. 要对其进行微调(比如训练113),可以按以下步骤进行。 确保你已经安装了以下工具和库: ollamallama3.2Pyt…

基于WebRTC实现音视频通话

客户端采用 WebRTC 技术(推流),通讯用 websocket。 WebRTC 像是一个面试过程: 第一步:发起方(拨打电话者)点击拨打电话时,获取本地媒体流并推流给接收方同时捕获接收方推过来的流&a…

计算机网络之---SSL/TLS协议

SSL/TLS协议 **SSL(Secure Sockets Layer)和TLS(Transport Layer Security)**是加密协议,用于确保通过不安全的网络(如互联网)传输的数据的安全性和隐私。它们通过提供数据加密、身份验证和数据…

jsx语法中el-table-v2中cellRender如何使用动态绑定

答案::attribute"xx"改为attribute{xx} 改写: const columns ref([{ key: index, dataKey: index, title: t(setting.index), width: 100 },{ key: no, dataKey: no, title: t(setting.key), width: 100 },{ key: name, dataKey: name, tit…

【update 更新数据语法合集】.NET开源ORM框架 SqlSugar 系列

系列文章目录 🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀 文章目录 系列文章目录前言 🍃一、实体对象更新1.1 单条与批量1.2 不更新某列1.3 只更新某列1.4 NULL列不更新1.5 无主键/指定列…

机器学习 - 如何选择函数集合?

一、关于机器学习的基本过程 对一个预测任务,输入特征向量为 𝒙,输出标签为 𝑦,我们选择一个函数集合 F,通过学习算法 𝒜 和一组训练样本 𝒟,从 F 中学习到函数 &#x…

C#中 string.Equals 和 == 区别

在 C# 中,string.Equals方法和运算符都可用于比较字符串,但它们在某些方面存在区别,主要如下: **string.Equals方法:**是一个实例方法,用于比较两个字符串对象的内容是否相等,比较时会根据字符…

phpstorm jetbrain 配置review code

禁用Unused CSS selector 步骤: 在 PhpStorm 中,点击顶部菜单 File > Settings(Windows/Linux)或 PhpStorm > Preferences(macOS)。在 Inspections 界面左侧的搜索框中输入 CSS。展开 CSS 部分&…