【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技术,我们可以在嵌入式系统中实现高效可靠的串口通信功能,为各种应用场景提供了更好的支持。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习疆界:探索基本原理与算法,揭秘应用力量,展望未来发展与智能交互的新纪元

目录 什么是深度学习 深度学习的基本原理和算法 深度学习的应用实例 深度学习的挑战和未来发展方向 挑战 未来发展方向 深度学习与机器学习的关系 深度学习与人类的智能交互 什么是深度学习 深度学习是一种基于神经网络的机器学习方法,旨在模仿人类大脑分析…

WEB APIs(1)

变量声明const(修饰常量) const优先,如react,基本const, 对于引用数据类型,可用const声明,因为储存的是地址 何为APIs 可以使用js操作HTML和浏览器 分类:DOM(文档对象…

Rust - 切片Slice

Slice类型 Slice数据类型没有所有权,slice允许我们引用集合中一段连续的元素序列而不用引用整个集合。字符串slice(string slice) 是String中 一部分值的引用。如下述代码示例,不是对整个String的引用而是对部分String的引用: fn main() {l…

代码随想录算法训练营Day27|回溯算法·组合总和、组合总和II、分割回文串

组合总和 class Solution{ private:vector<vector<int>>result;vector<int>path;void backtracking(vector<int>& candidates,int target,int sum,int startIndex){if(sum > target){return;}if(sum target){result.push_back(path);return;}…

Python之:如何使用双重for循环输出九九乘法表?

文章目录 前言源代码 前言 如何用for双重循环输出九九乘法表&#xff1f;教程来咯&#xff01; 源代码 代码如下&#xff1a; for i in range(1, 10):for j in range(1, i1):print(f{j}{i}{i*j}\t, end)print()你学会了吗&#xff1f;效果如下&#xff1a; 想看详解&#…

【贪心算法】代码随想录算法训练营第三十二天 |122.买卖股票的最佳时机II,55.跳跃游戏,45.跳跃游戏II(待补充)

122.买卖股票的最佳时机II&#xff08;未观看&#xff0c;动态待补充&#xff09; 1、题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 2、文章讲解&#xff1a;代码随想录 3、题目&#xff1a; 给定一个数组&#xff0c;它的…

猫头虎分享已解决Bug || DNS解析问题(DNS Resolution Issue):DNSLookupFailure, DNSResolveError

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

谈谈Lombok的坑

Lombok 是一个 Java 库&#xff0c;通过注解的方式在编译时自动为类生成 getter、setter、equals、hashCode 等方法&#xff0c;以简化代码和提高开发效率。本文主要谈谈代码简化背后的代价。 引入Lombok之前是怎么做的 IDE中添加getter/setter, toString等代码&#xff1a; …

springboot190基于springboot框架的工作流程管理系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

.target勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

导言&#xff1a; 网络安全威胁如勒索病毒已经成为企业和个人数据安全的重大挑战之一。.target勒索病毒作为其中的一种&#xff0c;以其高度复杂的加密算法和迅速变化的攻击手法备受关注。本文将深入介绍.target勒索病毒的特点&#xff0c;探讨如何有效地恢复被加密的数据文件…

【学网攻】 第(28)节 -- OSPF虚链路

系列文章目录 目录 系列文章目录 文章目录 前言 一、什么是OSPF虚链路&#xff1f; 二、实验 1.引入 实验目标 实验背景 技术原理 实验步骤 实验设备 实验拓扑图 实验配置 扩展 实验拓扑图 实验配置 实验验证 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻…

【从Python基础到深度学习】4. Linux常用命令(进阶)

接上篇 【从Python基础到深度学习】4. Linux 常用命令-CSDN博客 1.文件查找 - find 命令 find [搜索路径] [搜索条件] [操作]1.1 常用选项和参数 -name&#xff1a;按文件名搜索。 find 命令的 -name 选项可以接受通配符来匹配文件名。通配符可以帮助你更灵活地搜索文件名&a…