【STM32 CubeMX】串口编程DMA

文章目录

  • 前言
  • 一、DMA方式
    • 1.1 DMA是什么
    • 1.2 CubeMX配置DMA
    • 1.3 DMA方式函数使用
      • DMA的发送
      • 接收函数
  • 总结


前言

在嵌入式系统中,串口通信是一项至关重要的功能,它允许单片机与外部设备进行数据交换,如传感器、显示器或其他设备。然而,在高速数据传输的场景下,传统的串口通信方式可能会使CPU过于繁忙,从而影响系统的性能。为了解决这一问题,STM32系列微控制器提供了DMA(直接内存访问)技术,可以在不占用CPU资源的情况下实现高速的数据传输。本文将介绍如何利用STM32 CubeMX配置串口通信并使用DMA进行数据传输。


一、DMA方式

1.1 DMA是什么

想象一下你在单片机中需要把一堆数据从一个地方搬到另一个地方,比如从内存搬到外设(比如串口或者存储器)。传统的方式是由CPU来亲自操持每一个数据的传输,就像你亲自搬运每一件家具一样。

而DMA就像是单片机中的一支专业的搬家队伍。你可以告诉这支队伍从哪里搬到哪里,然后它们就可以自动完成这个任务,而不需要CPU一直牵头指挥。这样,CPU就可以专注于处理其他的事务,而不用为每个数据传输都忙碌起来。

所以,单片机中的DMA就是一种让数据在不需要CPU持续参与的情况下,在内存和外设之间自动传输的技术,使得单片机能更高效地完成一些数据搬运的任务。简而言之,就是让单片机变得更聪明、更省力。

比如下面这个图,如果我们使用普通的发送RAM里面的buf,那么cpu就要一位一位的取buf,放到串口发送寄存器中,那么就非常耗费时间,那么这时DMA就出现了,他可以直接让cpu把RAM里面的buf放到DMA,然后DMA自动把buf放到发送寄存器里,放到寄存器这个过程cpu是不参与的
在这里插入图片描述
他不仅可以发送,还可以把接收的寄存器放到DMA中,然后放到RAM中

1.2 CubeMX配置DMA

在这里插入图片描述
打开我们的串口,选择DMA设置,然后添加一个DMA,其中的DMA Request就是你为了什么而使用DMA,比如为了发送,为了接收都可以设置。

模式的设置:
在这里插入图片描述
模式有两种,一种是Normal,一种是circular
Normal:比如要传输1000字节,传输完了就ok了,不传输了
circular:比如要传输1000字节,传输完了,他会从开头,再传输一次

注意:这里不能打勾在这里插入图片描述
Memory需要打勾

1.3 DMA方式函数使用

DMA的发送

我们可以使用下面这个函数进行发送:

HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);

他的参数为串口对象,要发送的data,要发送的大小。
比如说,我们可以这样:

HAL_UART_Transmit_DMA(&huart1,(uint8_t *)"Hello DMA",sizeof("Hello DMA"));

那么我们可以在串口里看到打印的数据:
在这里插入图片描述
上面这个函数的中断如下:

__weak void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)
__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)

当DMA发送完一半时,调用第一个回调函数
当DMA发送完时,调用第二个回调函数

接收函数

我们可以使用下面这个函数进行接收:

HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

他的参数为串口对象,要接收的buf,要接收的大小。

上面这个函数的中断如下:

__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
__weak void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);

对于纯DMA接收是没有意义的,比如你和外设通信,你调用DMA的接收,你还要去指定你要接收多少字节,可是,每次接收的都是不一样的啊,大小根本指定不了,所以DMA接收要和下节课的IDLE中断一起才有意义


总结

通过本文的介绍,我们学习了如何在STM32 CubeMX中配置串口通信并使用DMA进行数据传输。首先,我们利用CubeMX配置了串口通信的基本参数,包括波特率、数据位数和停止位数等。然后,我们配置了DMA通道,将串口接收和发送的数据直接传输到内存,而不需要CPU的干预。这样一来,系统的CPU资源就可以得到释放,提高了系统的性能和效率。最后,我们可以根据具体的应用场景,编写相应的串口通信代码,实现数据的接收和发送功能。通过合理地利用DMA技术,我们可以在嵌入式系统中实现高效可靠的串口通信功能,为各种应用场景提供了更好的支持。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ //练习 7.13 使用istream构造函数重写第229页的程序。

C Primer(第5版) 练习 7.13 练习 7.13 使用istream构造函数重写第229页的程序。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 /******************************************************************…

太阳光模拟器助力于太阳光对金属铝靶材影响

1. 引言 金属铝靶材是一种被广泛应用于薄膜制备领域的金属材料,具有高纯度、均一性好、结构致密等优点。其制备工艺主要包括冶金法、电化学法、物理气相沉积法等,其中电化学法制备的铝靶材品质最佳,价格也比较实惠。 其中包含: …

【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱2(附带项目源码)

效果演示 文章目录 效果演示系列目录前言拖放、交换物品绘制拖拽物品插槽UI修改Inventory,控制拖放功能 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中&#xf…

Linux桌面

系统信息的截图 登录界面右下角可以切换 Ubuntu on Wayland ,虽然还是测试版,不过体验已经比之前的 Xorg 好多了,最笔记本上使用最影响体验的高分屏适配功能,在 wayland 中也是几乎完美支持的。 卸载 snap 这个 snap 是 Ubuntu …

GEO文章套路,数据下载和批次效应处理

原文链接: SCI文章复现 | GEO文章套路,数据下载和批次效应处理https://mp.weixin.qq.com/s/KBA67EJ7cCK5NDTUzrwJ2Q 一、前言 这是2024年春节后的第一个推送教程,我们也给大家赠送一个福利。将前期的付费教程免费推送给大家。其实&#xff…

springboot集成elk实现日志采集可视化

一、安装ELK 安装ELK组件请参考我这篇博客:windows下安装ELK(踩坑记录)_windows上安装elk教程-CSDN博客 这里不再重复赘述。 二、编写logstash配置 ELK组件均安装好并成功启动,进入到logstash组件下的config文件夹,创建logstash.conf配置…

网络原理-TCP/IP(7)

目录 网络层 路由选择 数据链路层 认识以太网 以太网帧格式 认识MAC地址 对比理解MAC地址和IP地址 认识MTU ARP协议 ARP协议的作用 ARP协议工作流程 重要应用层协议DNS(Domain Name System) DNS背景 NAT技术 NAT IP转换过程 NAPT NAT技术的优缺点 网络层 路由…

JDK8新增的时间

设计更合理,功能更丰富,使用更方便,都是不可变的对象,修改后会返回新的事件对象不会丢失最开始的时间,线程安全,能精确到毫秒、纳秒。 这三个类都有一个静态方法now():获取系统当前时间对应的该…

Java解决下降路径最小和

Java解决下降路径最小和 01 题目 给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。 下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列…

图表示学习 Graph Representation Learning chapter1 引言

图表示学习 Graph Representation Learning chapter1 引言 前言1.1图的定义1.1.1多关系图1.1.2特征信息 1.2机器学习在图中的应用1.2.1 节点分类1.2.2 关系预测1.2.3 聚类和组织检测1.2.4 图分类、回归、聚类 前言 虽然我并不研究图神经网络,但是我认为图高效的表示…

杂谈--spconv导出中onnx的扩展阅读

Onnx 使用 Onnx 介绍 Onnx (Open Neural Network Exchange) 的本质是一种 Protobuf 格式文件,通常看到的 .onnx 文件其实就是通过 Protobuf 序列化储存的文件。onnx-ml.proto 通过 protoc (Protobuf 提供的编译程序) 编译得到 onnx-ml.pb.h 和 onnx-ml.pb.cc 或 on…

创新技巧|迁移到 Google Analytics 4 时如何保存历史 Universal Analytics 数据

Google Universal Analytics 从 2023 年 7 月起停止收集数据(除了付费 GA360 之外)。它被Google Analytics 4取代。为此,不少用户疑惑:是否可以将累积(历史)数据从 Google Analytics Universal 传输到 Goog…

Python爬虫学习

1.1搭建爬虫程序开发环境 爬取未来七天天气预报 from bs4 import BeautifulSoup from bs4 import UnicodeDammit import urllib.request url"http://www.weather.com.cn/weather/101120901.shtml" try:headers{"User-Agent":"Mozilla/5.0 (Windows …

YOLOV8最强操作教程.

YoloV8详细训练教程. 相信各位都知道yolov8发布了,也是U神大作,而且V8还会出论文喔! 2023.1.17 更新 yolov8-grad-cam热力图可视化链接 2023.1.20 更新 YOLOV8改进-添加EIoU,SIoU,AlphaIoU,FocalEIoU 链接 2023.1.30 更新 如果你需要修改或者…

【C->Cpp】由C迈向Cpp(3)

正文开始: 目录 (一)函数重载 (1)函数重载 (2)函数重载实现原理 (二) 引用 (1)引用 (2)语法 i ,别名&am…

HDR 摄影

HDR 摄影,即高动态范围 High Dynamic Range摄影,旨在通过合并不同曝光值的照片来捕捉场景中从最亮到最暗部分的全部细节。 这种技术对于在一个图像中展现广泛的亮度范围特别有用,尤其是在自然光线条件下,如直射日光或阴影区域&…

单片机学习笔记---LED呼吸灯直流电机调速

目录 LED呼吸灯 直流电机调速 模型结构 波形 定时器初始化函数 中断函数 主程序 上一节讲了电机的工作原理,这一节开始代码演示! 我们上一篇说Ton的时间长Toff时间短电机会快,Ton的时间短Toff时间长电机会慢 并且我们还要保证无论Ton和…

『运维备忘录』之 Sed 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大…

【镜头知识】对焦和变焦

前言 变焦 调整某几个镜片的相对位置,从而改变镜片组的焦距,进而改变图像的视场角度。 焦距和视角以及拍摄距离的关系这张图能更好的体现: 视角越窄,也意味着放大的倍数越大! 对焦 物体反射的光线,有很多不…

高B格可视化大屏设计具备的10大特征

简洁明了: 可视化大屏界面应该尽可能简洁明了,突出重点,避免过多的信息和视觉干扰。同时,需要考虑到用户的视觉效果和易用性,使用户能够迅速地获取所需信息。 数据精准: 可视化大屏界面显示的数据应该准确…