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

STM32 cubemx配置DMA+空闲中断接收不定长数据

文章目录

  • 前言
  • 一、串口空闲中断
  • 二、DMA+空闲中断接收不定长数据实现思路
  • 三、STM32Cubemx配置DMA+空闲中断接收不定长数据
  • 四、代码编写
  • 总结


前言

本篇文章给大家讲解一下DMA+串口空闲中断接收串口不定长数据,之前我们也是讲解过串口接收不定长数据的,那么本篇文章的话将使用DMA来接收不定长数据。

一、串口空闲中断

串口空闲中断是指在串口接收到数据后,在数据的传输结束之后,在一段连续的空闲时间内没有接收到新数据时触发的中断。具体来说,串口空闲中断会在以下情况下触发:

1.数据传输结束: 当串口接收到一个完整的数据帧后,包括起始位、数据位、校验位和停止位,数据的传输结束。

2.连续空闲时间: 在数据传输结束后,如果在一段连续的时间内(通常是一个字节的时间,即字符间的时间间隔),串口没有接收到新的数据,那么就会产生空闲中断。

串口空闲中断的触发时机提供了一个机会来检测数据帧的接收是否完整,并且在数据帧之间的间隙中执行一些必要的操作,比如处理接收到的数据、清理缓冲区或者进行其他后续处理。这种机制在串口通信中非常重要,可以确保数据的准确传输和处理。

二、DMA+空闲中断接收不定长数据实现思路

使用DMA(Direct Memory Access,直接内存访问)结合串口空闲中断可以实现串口接收不定长数据的主要原因是提高了数据接收的效率和灵活性。

在传统的串口接收数据方式中,通常是通过串口中断来实现数据接收。但是当接收大量数据或者需要处理高速数据时,使用中断方式会导致CPU频繁地响应中断,影响系统的实时性和效率。

而使用DMA可以将串口接收到的数据直接存储到内存中,减轻了CPU的负担,提高了系统的性能。DMA能够在不需要CPU干预的情况下,直接在外设和内存之间传输数据,大大提高了数据传输的效率。

串口空闲中断则可以用来标志一帧数据的接收完成。当串口接收到一帧完整的数据后,传输结束,串口会进入空闲状态。利用空闲中断可以确定一帧数据的长度,从而在DMA接收完一帧数据后,触发空闲中断,处理接收到的数据,清理缓冲区,并准备接收下一帧数据。

结合DMA和串口空闲中断,可以实现高效地接收不定长数据。DMA负责高速数据的传输,减少了CPU的负载,而串口空闲中断用于标志数据帧的接收完成,提供了灵活性和准确性。这种组合使得系统能够高效地处理不定长数据的接收,同时保证了系统的实时性和性能。

三、STM32Cubemx配置DMA+空闲中断接收不定长数据

添加DMA接收的功能:

DMA接收是把外设发来的数据保存到内存中来,所以是Peripheral To Memory。
其他STM32Cubemx的配置大家可以看上一篇文章:DMA发送
在这里插入图片描述

四、代码编写

1.首先需要先使能 串口接收空闲中断函数

函数原型:

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

函数参数:

huart:指向 UART_HandleTypeDef 结构体的指针,用于指定要配置的串口。
pData:指向存储接收数据的缓冲区的指针。
Size:要接收的数据的字节数。

函数返回值:

返回 HAL_StatusTypeDef 类型的值,表示函数执行的状态。可能的返回值包括 HAL_OK(成功)和其他错误代码,如 HAL_ERROR。

函数作用:

这个函数用于配置串口接收,使其能够在接收到数据后等待空闲中断(IDLE interrupt)来标志数据帧的接收完成。
一旦串口接收到完整的数据帧,即收到停止位后,等待一段连续的空闲时间,即在一个字节的时间内没有接收到新数据,串口会产生空闲中断(IDLE interrupt),从而触发回调函数或中断服务例程,标志着一帧数据的接收完成。

函数调用流程:

在调用该函数后,串口会开始接收数据,并等待空闲中断的触发。
一旦接收到完整的数据帧,并且在一段连续的空闲时间内没有接收到新数据,串口会触发空闲中断。
在空闲中断触发后,可以在空闲中断的回调函数或者中断服务例程中进行数据处理,如拷贝接收到的数据到指定的缓冲区,并进一步处理或者通知应用程序。

2.编写中断回调函数

当触发串口空闲中断时会调用到void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)。这个回调函数。

3.完整代码编写

在这个代码中我们在串口助手中发送LED ON和LED OFF来控制LED灯的打开和关闭。LED ON和LED OFF为不同长度的数据,使用普通的串口接收方法来接收这个长度不定的数据是比较复杂的,现在我们可以使用DMA+空闲中断接收来解决这个问题。

uint8_t Rx_data[100] = {0};//保存接收到的数据//空闲中断回调函数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{if(huart->Instance == USART1){if(strstr(Rx_data, "LED ON") != NULL){HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);}else if(strstr(Rx_data, "LED OFF") != NULL){HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);}HAL_UARTEx_ReceiveToIdle_IT(&huart1, Rx_data, 100);}		
}//接收到100字节会调用接收完成中断回调函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1){HAL_UARTEx_ReceiveToIdle_IT(&huart1, Rx_data, 100);}
}HAL_UARTEx_ReceiveToIdle_IT(&huart1, Rx_data, 100);//开启接收功能

总结

本篇文章就讲解到这里,大家也可以自己写代码实际操作一下。

相关文章:

STM32 cubemx配置DMA+空闲中断接收不定长数据

文章目录 前言一、串口空闲中断二、DMA空闲中断接收不定长数据实现思路三、STM32Cubemx配置DMA空闲中断接收不定长数据四、代码编写总结 前言 本篇文章给大家讲解一下DMA串口空闲中断接收串口不定长数据,之前我们也是讲解过串口接收不定长数据的,那么本…...

Pycharm配置运行selenium教程

一、下载chrome浏览器和同版本的chromedriver chrome测试版版本120.0.6099.109 链接:https://pan.baidu.com/s/1pvFqL0WN8OkqPmURAs83kg?pwdvtsh 提取码:vtsh chromedriver版本120.0.6099.109 链接:https://pan.baidu.com/s/16fWWkrlD5C3J…...

银河麒麟V10开机后黑屏解决方法

情况描述: 单位的国产化电脑采用银河麒麟V10系统,在使用了近两个月时间后,开机到加载桌面那一步无法加载图形化桌面。 原理讲解 Linux本是纯命令行形式的系统,银河麒麟基于Linux中的Ubuntu LTS内核开发,其图形化的品牌…...

【Git版本控制 02】分支管理

目录 一、创建分支 二、切换分支 三、合并分支 四、删除分支 五、合并冲突 六、分支策略 七、bug分支 一、创建分支 # 当前仓库只有 master 一个主分支 # 可通过 git branch 是进行分支管理的命令,可通过不同参数对分支进行查看、创建、删除(base) [rootloc…...

基金分类

一、按基金运作方式分类 (一)封闭式基金 是基金份额总额在期限内固定不变,在期限内不可申购和赎回。 (二)开放式基金 是基金份额总额不固定,在期限内可以申购和赎回。 这里的开放式基金特指传统的开放式基…...

kali系统概述、nmap扫描应用、john破解密码、抓包概述、以太网帧结构、抓包应用、wireshark应用、nginx安全加固、Linux系统加固

目录 kali nmap扫描 使用john破解密码 抓包 封装与解封装 网络层数据包结构 TCP头部结构​编辑 UDP头部结构 实施抓包 安全加固 nginx安全 防止缓冲区溢出 Linux加固 kali 实际上它就是一个预安装了很多安全工具的Debian Linux [rootmyhost ~]# kali resetkali …...

Spring Cloud 路由和消息传递 (HTTP 路由)

Spring Cloud 路由 Spring Cloud 路由是指将请求路由到特定服务的机制。Spring Cloud 提供了多种路由机制,包括: Ribbon: 一个基于 HTTP 和 TCP 的客户端负载均衡工具,提供软负载均衡、故障转移等功能。Feign: 一个声明式的 HTTP 客户端&am…...

【PyQt】12-滑块、计数控件

文章目录 前言一、滑块控件 QSlider运行结果 二、计数器控件 QSpinBox运行结果 总结 前言 1、滑块控件 2、计数控件 一、滑块控件 QSlider #Author :susocool #Creattime:2024/2/15 #FileName:28-滑块控件 #Description: 通过滑块选择字体大小 import sys from PyQ…...

【牛客面试必刷TOP101】Day21.BM11 链表相加(二)和BM12 单链表的排序

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:牛客面试必刷TOP101 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!&…...

疑似针对安全研究人员的窃密与勒索

前言 笔者在某国外开源样本沙箱平台闲逛的时候,发现了一个有趣的样本,该样本伪装成安全研究人员经常使用的某个渗透测试工具的破解版压缩包,对安全研究人员进行窃密与勒索双重攻击,这种双重攻击的方式也是勒索病毒黑客组织常用的…...

Mamba-UNet:用于医学图像分割的类似UNet的纯视觉Mamba网络

摘要 在医学图像分析的最新进展中,卷积神经网络(CNN)和视觉转换器(ViT)都取得了显著的基准成绩。前者通过其卷积操作在捕获局部特征方面表现出色,而后者则通过利用自注意力机制实现了出色的全局上下文理解。然而,这两种架构在有效建模医学图像中的长距离依赖关系时都存…...

2024/2/14

1.1、若有下面的变量定义,以下语句中合法的是( A )。 int i,a[10],*p; A) pa2; B) pa[5]; C) pa[2]2; D) p&(i2); 1.2、有以下程序 …...

跟廖雪峰老师学习Git(持续更新)

Git简介 创建版本库 第一步,创建一个新目录 第二步,通过git init变成Git可以管理的仓库 把文件添加到文本库,不要使用Windows自带的记事本! 我用的是VS code 创建readme.txt 放入库中 commit可以一次提交很多文件&#xff0…...

2024,欢迎来到性价比时代

「不是XX买不起,而是YY更有性价比。」——翻开过去一年的商业消费史,这句话几乎可以贯穿始终。年轻消费者们追求性价比的眼光一旦定型,一些品牌过去被品质生活、消费升级包装出来的华丽外壳,很容易一击就碎。 胜出的「性价比之王…...

【国产MCU】-CH32V307-通用定时器(GPTM)-输入捕获模式测量脉冲

通用定时器(GPTM)-输入捕获模式测量脉冲 文章目录 通用定时器(GPTM)-输入捕获模式测量脉冲1、通用定时器(GPTM)介绍2、输入捕获模式3、驱动API介绍4、定时器输入捕获示例CH32V307的通用定时器模块包含一个16 位可自动重装的定时器(TIM2、TIM3、TIM4和TIM5),用于测量脉…...

sqlserver char,nchar varchar nvarchar的区别

在 SQL Server 中,char、nchar、varchar 和 nvarchar 是用于存储文本数据的数据类型。它们之间的区别主要在于它们所使用的字符集和存储空间方面。 char:(中文占2个字节,英文1个) char 是一种固定长度的字符数据类型&a…...

FT2232调试记录(2)

FT2232调试记录 (1)获取当前连接的FTDI设备通道个数:(2)获取当前连接的设备通道的信息:(3)配置SPI的通道:(4)如何设置GPIO:(5)DEMO测试: FT2232调…...

网络学习:数据链路层VLAN原理和配置

一、简介: VLAN又称为虚拟局域网,它是用来将使用路由器的网络分割成多个虚拟局域网,起到隔离广播域的作用,一个VLAN通常对应一个IP网段,不同VLAN通常规划到不同IP网段。划分VLAN可以提高网络的通讯质量和安全性。 二、…...

Docker的常见命令以及命令别名

常见命令 命令说明docker pull拉取镜像docker push推送镜像到DockerRegistrydocker images查看本地镜像docker rmi删除本地镜像docker run创建并允许容器docker stop停止指定容器docker start启动指定容器docker restart重新启动容器docker rm删除指定容器docker ps查看容器do…...

2024.02.14作业

1. 请编程实现二维数组的杨辉三角 #include <stdio.h> #include <stdlib.h> #include <string.h>int main() {int n;scanf("%d", &n);int a[n][n];memset(a, 0, sizeof(a));a[0][0] 1;for (int i 1; i < n; i){for (int j 0; j < i …...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解

一、前言 在HarmonyOS 5的应用开发模型中&#xff0c;featureAbility是旧版FA模型&#xff08;Feature Ability&#xff09;的用法&#xff0c;Stage模型已采用全新的应用架构&#xff0c;推荐使用组件化的上下文获取方式&#xff0c;而非依赖featureAbility。 FA大概是API7之…...

归并排序:分治思想的高效排序

目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法&#xff0c;由约翰冯诺伊曼在1945年提出。其核心思想包括&#xff1a; 分割(Divide)&#xff1a;将待排序数组递归地分成两个子…...

渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用

阻止除自定义标签之外的所有标签 先输入一些标签测试&#xff0c;说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时&#xff08;如通过点击或键盘导航&…...

FTXUI::Dom 模块

DOM 模块定义了分层的 FTXUI::Element 树&#xff0c;可用于构建复杂的终端界面&#xff0c;支持响应终端尺寸变化。 namespace ftxui {...// 定义文档 定义布局盒子 Element document vbox({// 设置文本 设置加粗 设置文本颜色text("The window") | bold | color(…...