STM32 cubemx配置USART DMA传输

news2024/11/17 4:42:54

文章目录

  • 前言
  • 一、DMA概念
  • 二、STM32 DMA数据手册分析
  • 3.DMA模式介绍
  • 4.cubemx配置
  • 总结


前言

本篇文章来讲解DMA的概念,并使用DMA来进行串口的数据收发。

一、DMA概念

DMA(Direct Memory Access,直接内存访问)是一种计算机系统的技术,允许外部设备(如硬盘驱动器、网络适配器或图形卡)直接与计算机内存进行数据传输,而不需要CPU的直接参与。这种直接的内存访问可以提高数据传输的效率,并减轻CPU的负担。
在没有DMA的情况下,数据传输通常需要通过CPU来完成,这涉及到CPU的中断处理程序从设备读取数据,然后将数据写入内存,或者从内存读取数据,然后将数据发送到设备。这种方式会消耗CPU的时间和计算资源,限制了系统的性能和吞吐量。
通过DMA技术,外部设备可以直接与系统内存进行数据传输,而不需要CPU的干预。在DMA传输开始之前,系统配置好DMA控制器,并提供一个DMA缓冲区,外部设备可以将数据直接写入到该缓冲区或者从该缓冲区读取数据。当DMA传输完成后,DMA控制器会发出一个中断信号,以通知CPU。

使用DMA的好处包括:

1.提高数据传输速度:由于数据传输不需要CPU的介入,DMA可以以更高的速度进行数据传输,从而提高系统性能和吞吐量。
2.减轻CPU负担:传统的数据传输需要CPU的参与,消耗CPU的时间和计算资源。而使用DMA进行数据传输时,CPU可以专注于其他的计算任务,减轻了CPU的负担。
3.支持大规模数据传输:DMA技术可以支持大规模的数据传输,例如高清视频流、大型文件和网络数据包的处理。

总之,DMA是一种能够提高系统性能和数据传输效率的技术,通过允许外部设备直接与内存进行数据传输,减少了CPU的介入。这在需要高速、大量或连续数据传输的场景中特别有用,如高性能计算、网络通信和存储系统等。

二、STM32 DMA数据手册分析

从DMA的描述来看在STM32 F103这款芯片中有DMA1和DMA2,DMA1有7个通道,DMA2有5个通道。
在这里插入图片描述
DMA架构图:
DMA支持直接和SRMA进行数据的传输,不需要经过CPU,这样就可以让CPU去做其他的事情,提高系统的运行效率。

在这里插入图片描述
使用DMA(Direct Memory Access)进行数据传输时,通常需要经过以下步骤:

1.设置DMA控制器:首先,需要在系统中配置和设置DMA控制器。这包括设置DMA的源地址和目标地址,传输长度,传输方向(从内存到设备或从设备到内存),以及其他相关参数。

2.发送DMA请求:在数据传输之前,需要向DMA控制器发送DMA请求。该请求通常由CPU或设备发起,用于指示DMA控制器执行特定的数据传输操作。

3.DMA传输:一旦DMA请求被接收和识别,DMA控制器将启动数据传输。它将直接从源地址读取数据,并将数据传输到目标地址。在传输过程中,DMA控制器绕过CPU,直接控制内存和设备之间的数据传输,以提高数据传输效率并减轻CPU的负担。

4.中断或完成通知:一旦DMA传输完成,DMA控制器通常会生成一个中断信号或发送一个完成通知,以通知CPU或相关设备传输已经完成。

正常进行数据的发送:

不使用DMA进行串口的数据发送时,CPU需要从SRMA中读取出存储的数据,然后再发送给串口,发送少量数据是不会影响CPU执行其他事情的,假如我想发送10000个数据,那么这个时候就会让CPU处于一直在发送数据的状态,这样就会影响到其他程序的执行。

在这里插入图片描述
根据手册描述DMA和CPU共享总线来执行直接的内存传输。
在这里插入图片描述

DMA可以直接访问到外设和SRMA,那么这样就不需要CPU来进行数据的读取交换了,直接使用DMA就可以解决这个问题,那么这样的话就可以提高系统的运行效率了。
在这里插入图片描述

3.DMA模式介绍

下面我们来看到DMA的两种模式,一种是循环模式,一种是内存到内存的模式。
在这里插入图片描述

DMA的循环模式(Circular Mode):
在循环模式下,DMA传输的数据可以在源和目的地之间循环传输,以连续地进行数据传输操作。这种模式下,一旦DMA传输完成,它会自动重新开始下一轮传输,而无需软件干预。
循环模式对于需要在连续数据块之间进行重复传输的应用非常有用,如音频、视频流等。它可以在不中断DMA传输的情况下循环传输数据,大大提高了数据传输效率和系统性能。

DMA的内存到内存模式(Memory-to-memory Mode):
内存到内存模式允许DMA直接在两个内存区域之间进行数据传输,而无需外设的参与。在这种模式下,DMA通道可以从一个内存位置读取数据,并将数据直接写入另一个内存位置,而不需要CPU的介入。
内存到内存模式非常适用于需要在内存之间快速传输数据的应用场景,例如内存拷贝、内存填充等。通过使用这种模式,DMA可以独立地执行数据传输,减轻CPU的负担,提高传输效率。

总结:DMA的循环模式允许数据在源和目的地之间循环传输,连续进行数据传输操作,并在每次传输完成后自动重新开始下一轮传输。而DMA的内存到内存模式允许DMA直接在两个内存区域之间传输数据,而不需要外设的触发请求,并且能够快速、高效地在内存之间传输数据。这两种模式都有助于提高数据传输效率并减轻CPU的负担,适用于不同的应用场景。

4.cubemx配置

配置一个LED灯观察实验现象:
在这里插入图片描述
配置串口1:
在这里插入图片描述
开启串口中断:
这里不开启串口中断的话无法判断串口是否发送完成一次数据,这样串口就一直处于忙状态导致完成进行下一次的发送。

在这里插入图片描述
DMA通道设置:

TX设置为从内存到外设,因为串口的发送就是把内存中的数据取出来再发给外设,RX设置为从外设到内存,串口发送过来的数据将会保存在内存中。

模式选择Normal,循环模式的话只需要调用一次发送函数就会一直进行数据的发送了。

在这里插入图片描述

具体代码:
这里发送一个非常长的数据,同时让这个LED闪烁,看看串口的发送会不会影响到LED的闪烁,结果是不会的。

uint8_t msg[1024] = "hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello";

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_UART_Transmit_DMA(&huart1, msg, strlen(msg) + 1);
		
		
		HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
		HAL_Delay(100);
  }

总结

本篇文章就讲解到这里,下篇文章我们讲解DMA的具体配置和DMA串口接收不定长数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/812295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue 设置数组

手写获取数据 <el-form-item label"缴纳方"><el-select v-model"form.invoiceCategoryName" placeholder"请选择缴纳方"><el-optionv-for"item in kplmList":key"item.value":label"item.label":v…

求解方程x^2=a的根,不使用库函数直接求解(不动点迭代法)

首先可以将方程两边同时加上x&#xff0c;&#xff0c;这时候两边同时再除以1x&#xff0c;就得到了&#xff0c;变形为。&#xff08;变性后的迭代式不唯一&#xff0c;这里随便选取一个&#xff09; 当x是准确值的时候&#xff0c;两边应该是相等的&#xff0c;如果x是近似值…

数据库连接池的使用

十、数据库连接池的使用 1、c3p0数据库连接池 硬编码&#xff1a; c3p0的帮助文档 c3p0配置文件&#xff1a; 2、dbcp数据库连接池 配置文件&#xff1a; 3、druid 将上面三个做成工具类&#xff1a;

单网卡实现 双IP 双网段(内外网)同时运行

前提是内外网是同一网线连接&#xff08;双网线双网卡的具体可以自己搜索下。理论上都设置静态IP后把外网跃点设置小&#xff0c;内网跃点设置大&#xff0c;关闭自动跃点设置同一个接口跃点数&#xff0c;在通过命令提示符添加内网网址走内网网关就可以了&#xff09;。 需要使…

Mac 定时重启 TouchBar 脚本(缓解闪烁问题)

背景 Mac 笔记本 TouchBar 是真的脆啊&#xff0c;合盖使用一段时间就废了&#xff0c;右侧一直闪烁简直亮瞎眼 &#x1f602; 经过观察&#xff0c;总结出闪烁规律如下&#xff1a; 工作状态&#xff1a;不断操作电脑时&#xff0c;触控栏处于工作状态&#xff0c;几乎不闪…

Git分布式版本控制工具和GitHub(一)--简介

一.Git概述 1.Git简介 【1】什么是Git? Git就是代码版本管理工具。 【2】为什么要使用Git &#xff08;1&#xff09;版本控制 写代码就是不断写BUG的过程&#xff08;当然我们是不会这么说的&#xff09;&#xff0c;很多时候你写了100行代码之后&#xff0c;突然醒悟&…

APP自动化测试-Python+Appium+Pytest+Allure框架实战封装(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 pytest只是单独的…

Spring——更快捷的存储 / 获取Bean对象

文章目录 前言一、存储 Bean 对象类注解为什么有五个类注解使用类注解存储对象配置扫描路径(重中之重)添加注解存储 Bean 对象 方法注解配置扫描路径(重中之重)使用方法注解存储对象 二、获取 Bean 对象Autowired属性注入Setter注入构造方法注入 Resource 总结 前言 本人是一个…

day17-二叉树的迭代遍历

二叉树的迭代遍历 二叉树的递归遍历是比较简单的 前序中序后序 前序遍历 前序遍历代码如下&#xff1a; class Solution { public:vector<int> preorderTraversal(TreeNode* root) {vector<int> res;preorder(root,res);return res;}void preorder(TreeNode* …

进度条 Vue2 +PC端 ,点击页面加载时页面顶部的那个蓝条

提示&#xff1a; <div class"global-loading"> </div> css:less <style lang"less"> .global-loading {background-color: red;height: 10px;position: fixed;z-index: 999;width: 0;animation: grow 2s infinite forwards;}keyframe…

ROS从入门到精通6-8:costmap代价地图插件编写案例(prohibition_layer)

目录 0 专栏介绍1 为什么需要代价地图插件?2 自定义代价地图插件3 仿真测试0 专栏介绍 本专栏旨在通过对ROS的系统学习,掌握ROS底层基本分布式原理,并具有机器人建模和应用ROS进行实际项目的开发和调试的工程能力。 🚀详情:《ROS从入门到精通》 1 为什么需要代价地图插…

PHP: 开发入门macOS系统下的安装和配置

安装Homebrew 安装 ~~友情提示&#xff1a;这个命令对网络有要求&#xff0c;可能需要翻墙或者用你的手机热点试试&#xff0c;或者把DNS换成&#xff08;114.114.114.114 和 8.8.8.8&#xff09; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebr…

tensorRT模型性能测试

目录 前言1. 模型训练1.1 模型1.2 数据集1.3 xml2yolo1.4 yolo2json1.5 json2yolo1.6 训练 2. TRT模型转换2.1 YOLOv5 ONNX导出2.2 YOLOv6 ONNX导出2.3 YOLOv5 engine生成2.4 YOLOv6 engine生成 3. TRT模型测试3.1 YOLOv5 engine mAP测试3.2 YOLOv5 engine 速度测试3.3 YOLOv6 …

代码随香录算法训练营day16 | 104. 二叉树的最大深度,559. N 叉树的最大深度,111. 二叉树的最小深度,222. 完全二叉树的节点个数

目录 104. 二叉树的最大深度 559. N 叉树的最大深度 111. 二叉树的最小深度 222. 完全二叉树的节点个数 104. 二叉树的最大深度 学了回溯之后再来做一下 思路&#xff1a; 二叉树节点的深度&#xff1a;指从根节点到该节点的最长简单路径边的条数或者节点数&#xff08;取…

chatgpt 接口使用(一)

使用api实现功能 参考链接&#xff1a;https://platform.openai.com/examples 安装库&#xff1a; pip3 install openai 例如&#xff1a; import os import openaiopenai.api_key os.getenv("OPENAI_API_KEY") response openai.ChatCompletion.create(model&q…

Flutter:使用url_launcher打开外部浏览器、拨打电话、发送短信、打开第三方app、打开应用商店下载应用

前言 Flutter中的url_launcher是一个用于打开URL的插件。它允许在Flutter应用程序中打开网址、发送电子邮件、拨打电话等操作。使用url_launcher插件&#xff0c;可以轻松地在应用程序中集成各种URL操作。 官方地址 https://pub-web.flutter-io.cn/packages/url_launcher 安…

Oracle 时间多少秒以后 oracle interval 多少分钟之前 Oracle日期1小时后 Java时间多少秒以后 Java日期多少天之前

Oracle 时间多少秒以后 oracle interval 多少分钟之前 Oracle日期1小时后 Java时间多少秒以后 Java日期多少天之前 一、概述 在项目开发中&#xff0c;遇到一个类似于 超时关闭的订单&#xff08;超过1分钟后关闭订单&#xff09; 的需求&#xff0c;在数据的时间写入时&#x…

【Python机器学习】实验06 KNN最近邻算法

文章目录 KNN算法前言 距离度量(1) 欧式距离(2) 曼哈顿距离(Manhattan distance)(3) 切比雪夫距离(Chebyshev distance)(4) 闵可夫斯基距离(Minkowski distance)(5) 汉明距离(Hamming distance)(6) 余弦相似度(Cosine Similarity) KNN算法介绍1 数据的准备2 划分训练数据和测试…

C++11 线程库

1 thread类的简单介绍 在C11之前&#xff0c;涉及到多线程问题&#xff0c;都是和平台相关的&#xff0c;比如windows和linux下各有自己的接口&#xff0c;这使得代码的可移植性比较差。C11中最重要的特性就是对线程进行支持了&#xff0c;使得C在并行编程时不需要依赖第三方库…

利用AI倾听熊猫爱的声音,预测交配成功

大熊猫是世界上最受喜爱的动物之一。原产于中国中部和西南部的山脉&#xff0c;具有独特的黑眼睛和黑白外套的熊于1990年被列入国际自然保护联盟&#xff08;IUCN&#xff09;濒危名单。它们的地位在2016年升级为易危物种&#xff0c;世界自然基金会估计现在大约有1&#xff0c…