当前位置: 首页 > news >正文

STM32基于LL库的USART+DMA使用

时隔两年半再次更新LL库,本次带来USART + DMA 实现接收不定长。

1、开发思路

使用USART + DMA接收不定长的功能的思路是:借助USART的空闲中断、DMA发送完成中断

打开F103的手册可得知,USART的空闲中断触发条件是在接收完成后触发,如下图:
在这里插入图片描述

2、新建工程

  1. 配置工程属性
    在这里插入图片描述
  2. 选择外部时钟源
    在这里插入图片描述
  3. 时钟倍频
    在这里插入图片描述
  4. 使能USART

这里选择的是USART1、模式为异步、打开中断,相关参数配置选择默认
在这里插入图片描述
在这里插入图片描述
开启TX DMA、RX DMA,二者都设置成单次模式
在这里插入图片描述
5. 生成代码
在这里插入图片描述
点击 GENERATE CODE 会在设定的路径成功生成代码,选择打开工程

代码编写

在编写代码之前需要先知道以下几个函数:

__STATIC_INLINE void LL_USART_ClearFlag_IDLE(USART_TypeDef *USARTx); //清除USART空闲中断标志
__STATIC_INLINE void LL_USART_EnableIT_IDLE(USART_TypeDef *USARTx);  //使能USART空闲中断__STATIC_INLINE void LL_USART_EnableDMAReq_TX(USART_TypeDef *USARTx);  //使能USART DMA发送
__STATIC_INLINE void LL_USART_EnableDMAReq_RX(USART_TypeDef *USARTx);  //使能USART DMA接收__STATIC_INLINE void LL_DMA_ClearFlag_TC4(DMA_TypeDef *DMAx);  //清除DMA 通道4 传输完成标志
__STATIC_INLINE void LL_DMA_ClearFlag_TC5(DMA_TypeDef *DMAx);  //清除DMA 通道5 传输完成标志
__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC4(DMA_TypeDef *DMAx); //判断是否是通道4传输完成标志
__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC5(DMA_TypeDef *DMAx); //判断是否是通道5传输完成标志__STATIC_INLINE void LL_DMA_EnableIT_TC(DMA_TypeDef *DMAx, uint32_t Channel); //使能指定DMA 通道传输完成中断__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_IDLE(const USART_TypeDef *USARTx); //判断是否是空闲中断标志or空闲标志__STATIC_INLINE uint32_t LL_USART_DMA_GetRegAddr(const USART_TypeDef *USARTx); //得到指定的USART DR寄存器地址//设置DMA 通道的外设数据寄存器地址,对于例程来说也即是USART1->DR的地址
__STATIC_INLINE void LL_DMA_SetPeriphAddress(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t PeriphAddress);
//设置DMA 通道的MEMORY地址
__STATIC_INLINE void LL_DMA_SetMemoryAddress(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t MemoryAddress);
//设置DMA传输数据大小
__STATIC_INLINE void LL_DMA_SetDataLength(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t NbData);
//启动DMA传输
__STATIC_INLINE void LL_DMA_EnableChannel(DMA_TypeDef *DMAx, uint32_t Channel);
//停止DMA传输
__STATIC_INLINE void LL_DMA_DisableChannel(DMA_TypeDef *DMAx, uint32_t Channel);
//得到DMA传输数据个数
__STATIC_INLINE uint32_t LL_DMA_GetDataLength(DMA_TypeDef *DMAx, uint32_t Channel);

CubeMx生成的代码有些寄存器没有使能,我们不能直接使用,需要我们自己使能相关寄存器

  1. 使能相关中断
    打开usart.c源文件,我们在函数MX_USART1_UART_Init() 中,开启DMA传输完成中断:
    在这里插入图片描述
    紧接着使能USART空闲中断、使能USART采用DMA传输数据:
    在这里插入图片描述
  2. 编写USART DMA RX、USART DMA TX函数
    下面的函数在main.c中。
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint8_t receive[2048];void uart_rx_dma_config()
{//rxLL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_5, (uint32_t)LL_USART_DMA_GetRegAddr(USART1));LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_5, (uint32_t)receive);LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_5, 2048);LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_5);
}void uart_tx_dma_config(uint8_t *buf, uint32_t len)
{LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_4, (uint32_t)LL_USART_DMA_GetRegAddr(USART1));LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_4, (uint32_t)buf);LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_4, len);LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_4);
}
/* USER CODE END 0 */
  1. 编写中断函数
    DMA中断中,只需判断是否是 传输完成中断,如果是清除标志即可。
/*** @brief This function handles DMA1 channel4 global interrupt.*/
void DMA1_Channel4_IRQHandler(void)
{/* USER CODE BEGIN DMA1_Channel4_IRQn 0 */if (LL_DMA_IsActiveFlag_TC4(DMA1)) {LL_DMA_ClearFlag_TC4(DMA1);}/* USER CODE END DMA1_Channel4_IRQn 0 *//* USER CODE BEGIN DMA1_Channel4_IRQn 1 *//* USER CODE END DMA1_Channel4_IRQn 1 */
}
/*** @brief This function handles DMA1 channel5 global interrupt.*/
void DMA1_Channel5_IRQHandler(void)
{/* USER CODE BEGIN DMA1_Channel5_IRQn 0 */if (LL_DMA_IsActiveFlag_TC5(DMA1)) {LL_DMA_ClearFlag_TC5(DMA1);}/* USER CODE END DMA1_Channel5_IRQn 0 *//* USER CODE BEGIN DMA1_Channel5_IRQn 1 *//* USER CODE END DMA1_Channel5_IRQn 1 */
}

在USART中断中,判断是否是空闲中断。在前面说过USART空闲中断的触发的条件是在USART接收完成后触发。
因此,检测到USART空闲中断,就意为着USART接收完成,此时得到DMA接收通道接收到的数据长度,然后通过DMA发送通道发送出去即可。代码如下:

/*** @brief This function handles USART1 global interrupt.*/
void USART1_IRQHandler(void)
{/* USER CODE BEGIN USART1_IRQn 0 */uint32_t len;extern uint8_t receive[2048];extern void uart_rx_dma_config();extern void uart_tx_dma_config(uint8_t *buf, uint32_t len);/* 判断USART1是否空闲 */if (SET == LL_USART_IsActiveFlag_IDLE(USART1)) {LL_USART_ClearFlag_IDLE(USART1);LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_5);LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_4);len = 2048 - LL_DMA_GetDataLength(DMA1, LL_DMA_CHANNEL_5);uart_tx_dma_config(receive, len);uart_rx_dma_config();}/* USER CODE END USART1_IRQn 0 *//* USER CODE BEGIN USART1_IRQn 1 *//* USER CODE END USART1_IRQn 1 */
}
  1. 开始编写main函数
    在这里插入图片描述
    紧接着在while(1) 之前将字符串str通过DMA发送出去,并开启DMA接收通道。
    在这里插入图片描述

  2. 下载程序,并打开串口助手进行测试
    测试结果如下:
    在这里插入图片描述

相关文章:

STM32基于LL库的USART+DMA使用

时隔两年半再次更新LL库,本次带来USART DMA 实现接收不定长。 1、开发思路 使用USART DMA接收不定长的功能的思路是:借助USART的空闲中断、DMA发送完成中断。 打开F103的手册可得知,USART的空闲中断触发条件是在接收完成后触发&#xff0…...

设计模式06-结构型模式1(适配器/桥接/组合模式/Java)

#1024程序员节|征文# 4.1 适配器模式 结构型模式(Structural Pattern)的主要目的就是将不同的类和对象组合在一起,形成更大或者更复杂的结构体。结构性模式的分类: ​ 类结构型模式关心类的组合,由多个类…...

【损害和风险评估&坑洼】路面坑洼检测系统源码&数据集全套:改进yolo11-DCNV3

改进yolo11-DLKA等200全套创新点大全:路面坑洼检测系统源码&数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.10.24 注意:由于项目一直在更新迭代,上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或者视频可…...

GenAI 生态系统现状:不止大语言模型和向量数据库

自 20 个月前 ChatGPT 革命性的推出以来,生成式人工智能(GenAI)领域经历了显著的发展和创新。最初,大语言模型(LLMs)和向量数据库吸引了最多的关注。然而,GenAI 生态系统远不止这两个部分&#…...

gitlab 配置ssh keys

settings -- 终端配置: git config --global user.email "yxthotmail.cm" 配置gitlab 账号邮箱 git config --global user.name "xt.yao" 配置gitlab账号用户名 生成SSH key,输入命令ssh-keygen -t rsa,一直按回车…...

小程序开发实战:PDF转换为图片工具开发

目录 一、开发思路 1.1 申请微信小程序 1.2 编写后端接口 1.3 后端接口部署 1.4 微信小程序前端页面开发 1.5 运行效果 1.6 小程序部署上线 今天给大家分享小程序开发系列,PDF转换为图片工具的开发实战,感兴趣的朋友可以一起来学习一下&#xff01…...

我有两台120kw充电桩一天能赚多少钱

(当前是理想状态下,当然还要看场地费用,还有物业,变压器,等等) ———————————————————— ———————————————————— 要计算两台120kW充电桩能赚多少钱,我们…...

深入了解 Android 中的命名空间:`xmlns:tools` 和其他常见命名空间

在 Android 开发中,xmlns (.xml的namespace)命名空间是一个非常重要的概念。通过引入不同的命名空间,可以使用不同的属性来设计布局、设置工具属性或者支持自定义视图等。除了 xmlns:tools 以外,还有很多常见的命名空间…...

stable-zero123模型构建指南

一、介绍 stabilityai出品,能够对有简单背景的物体进行三维视角图片的生成,简单来说也就是通过调整变换观察的视角生成对应视角的图片。 本项目通过comfyui实现。 二、容器构建说明 1. 部署ComfyUI (1)使用命令克隆ComfyUI g…...

算法题解记录32+++最长连续序列(百题筑基)

你们好,我是蚊子码农,好久不见。由于秋招求职的繁琐事情,我有很长一段时间没更新博客,希望我的粉丝们能够谅解。 秋招我拿到了一些offer,最终决定去一个主要做“网络安全”业务的公司工作,也许明天会更好&a…...

全球知名度最高的华人起名大师颜廷利:世界顶级思想哲学教育家

全国给孩子起名最好的大师颜廷利教授在其最新的哲学探索中,提出了《升命学说》这一前沿理论观点,该理论不仅深刻地回应了古今中外众多哲学流派和思想体系的精髓,还巧妙地融合了实用主义、理想主义以及经验主义的核心理念。通过这一独特的视角…...

Flink Rest API

REST API | Apache Flink Flink官网API 通过curl 或者Rest API工具测试web UI对应的接口返回信息 Flink 提交yarn任务 ./bin/flink run -t yarn-per-job historyServer ../bin/historyserver.sh start...

Zig 语言通用代码生成器:逻辑,冒烟测试版发布二

Zig 语言通用代码生成器:逻辑,冒烟测试版发布二 Zig 语言是一种新的系统编程语言,其生态位类同与 C,是前一段时间大热的 rust 语言的竞品。它某种意义上的确非常像 rust,尤其是在开发过程中无穷无尽抛错的过程&#x…...

mysql 通过GROUP BY 聚合并且拼接去重另个字段

我的需求: 我想知道同一个手机号出现几次,并且手机号出现在哪些地方。下面是要的效果。 源数据: CREATE TABLE bank (id bigint(20) unsigned NOT NULL AUTO_INCREMENT,user_id int(11) NOT NULL DEFAULT 0,tel varchar(255) COLLATE utf8mb4_unicode_…...

Java应用程序的测试覆盖率之设计与实现(一)-- 总体设计

一、背景 作为测试,如何保证开发人员提交上来的代码都被测试覆盖到,是衡量测试质量的一个重要指标。 本系列文章将要说一说,如何搭建一套测试覆盖率的系统。 包括以下内容: jacoco agent采集执行覆盖率数据jacoco climaven集成jacoco:jacoco-maven-pluginant集成jacoco:…...

Unity C#脚本的热更新

以下内容是根据Unity 2020.1.0f1版本进行编写的   目前游戏开发厂商主流还是使用lua框架来进行热更,如xlua,tolua等,也有的小游戏是直接整包更新,这种小游戏的包体很小,代码是用C#写的;还有的游戏就是通过…...

监督学习之逻辑回归

逻辑回归(Logistic Regression) 逻辑回归是一种用于二分类(binary classification)问题的统计模型。尽管其名称中有“回归”二字,但逻辑回归实际上用于分类任务。它的核心思想是通过将线性回归的输出映射到一个概率值…...

深度优先算法(DFS)洛谷P1683-入门

虽然洛谷是有题解的,但是你如果直接看得懂题解,你也不会来看这篇文章.. 这些代码均是我记录自身成长的记录,有写的不好的地方请谅解&#xff01; 先上代码&#xff1a; #include <iostream> #include <vector> #include<iomanip> #include<cstdio&…...

Python数据分析基础

本文介绍了Python在数据分析中的应用&#xff0c;包括数据读取、清洗、处理和分析的基本操作。通过使用Pandas和Numpy库&#xff0c;我们可以高效地处理大量数据&#xff0c;并利用Matplotlib和Seaborn库进行数据可视化。 1. 引言 Python因其简洁的语法和强大的库支持&#x…...

《企业自设2-软件测试》线下课day3: 006扩展虚拟机

1.win11 修改hosts无权限 分别再cmd终端输入以下两行代码&#xff1a; C:\Windows\System32\drivers\etcnotepad hosts 2.先保存快照&#xff01;&#xff01;&#xff01; 3.关闭虚拟机&#xff0c;将内存&#xff0c;CPU进行修改 就是再这个位置修改&#xff1a; 4.运…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...