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);//开启接收功能

总结

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

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

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

相关文章

2024.2.14

二维数组实现杨辉三角形 #include<stdio.h> #include<string.h> int main(int argc, const char *argv[]) {int n;scanf("%d",&n);int a[n][n];for(int i0;i<n;i){for(int j0;j<i;j){if(j0||ij){ a[i][j]1;}else{a[i][j]a[i-1][j]a[i-1][j-…

Netty应用(九) 之 编解码器概念 Netty常见的编解码器

目录 22.编解码器 22.1 编解码的概念 22.2 netty中的编解码 22.3 序列化 23.编解码器在使用过程中的两部分核心内容 23.1 序列化协议&#xff08;编码格式&#xff09;&#xff08;传输数据的格式&#xff09; 23.1.1 Java默认的序列化与反序列化 23.1.2 XML的序列化与反…

函数求导法则【高数笔记】

【分类】 1. 四则运算求导 2. 复合运算求导 3. 整体思想求导 #整体思想求导本质是运用复合运算求导&#xff0c;只不过是对复合运算求导的一种精炼 #无论是具体函数还是抽象函数求导&#xff0c;方法是一致的 【四则运算求导】 加&#xff0c;减&#xff0c;乘&#xff0c;除&a…

代码随想录算法训练营第四十九天(动态规划篇)| 474. 一和零, 完全背包理论基础

474. 一和零 题目链接&#xff1a;https://leetcode.cn/problems/ones-and-zeroes/submissions/501607337/ 思路 之前的背包问题中&#xff0c;我们对背包的限制是容量&#xff0c;即每个背包装的物品的重量和不超过给定容量&#xff0c;这道题的限制是0和1的个数&#xff0…

寒假 day13

1.请编程实现二维数组的杨慧三角 #include<stdio.h> #include<string.h> int main(int argc, const char *argv[]) { int n,i,j;printf("please enter n:");scanf("%d",&n);int arr[n][n];for(i0;i<n;i){for(j0;j<i;j){if(j0 || ij…

【51单片机】LCD1602(江科大)

1.LCD1602介绍 LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字符 显示容量:162个字符,每个字符为5*7点阵 2.引脚及应用电路 3.内部结构框图 屏幕: 字模库:类似于数码管的数…

HTML 超文本标记语言

超文本标记语言 HTML 在一个客户程序主窗口上显示出的万维网文档称为页面 (page)。 页面制作的标准语言&#xff1a;HTML。 超文本标记语言 HTML (HyperText Markup Language) 是一种制作万维网页面的标准语言&#xff0c;它消除了不同计算机之间信息交流的障碍&#xff0c…

“掌握温度,感知湿度,一触即知!”DHT11温湿度传感器,为您的生活增添一份关怀与精准。#非标协议【下】

“掌握温度&#xff0c;感知湿度&#xff0c;一触即知&#xff01;”DHT11温湿度传感器&#xff0c;为您的生活增添一份关怀与精准。#非标协议【下】 前言预备知识1.DHT11温湿度传感器初识1.1产品概述1.2与51单片机接线1.3数据传送逻辑和数据格式 2.发送时序检测DHT11温湿度传感…

2.14 指针练习

1、选择题 1.1、若有下面的变量定义&#xff0c;以下语句中合法的是&#xff08; A &#xff09;。 int i&#xff0c;a[10]&#xff0c;*p&#xff1b; A&#xff09; pa2; B&#xff09; pa[5]; C&#xff09; pa[2]2; D&#xff09; p&(i2); 解析&am…

数据库管理-第150期 Oracle Vector DB AI-02(20240212)

数据库管理150期 2024-02-12 数据库管理-第150期 Oracle Vector DB & AI-02&#xff08;20240212&#xff09;1 LLM2 LLM面临的挑战3 RAG4 向量数据库LLM总结 数据库管理-第150期 Oracle Vector DB & AI-02&#xff08;20240212&#xff09; 作者&#xff1a;胖头鱼的鱼…

备战蓝桥杯---动态规划(入门1)

先补充一下背包问题&#xff1a; 于是&#xff0c;我们把每一组当成一个物品&#xff0c;f[k][v]表示前k组花费v的最大值。 转移方程还是max(f[k-1][v],f[k-1][v-c[i]]w[i]) 伪代码&#xff08;注意循环顺序&#xff09;&#xff1a; for 所有组&#xff1a; for vmax.....0…

Wireshark不显示Thrift协议

使用Wireshark对thrift协议进行抓包&#xff0c;但是只显示了传输层的tcp协议&#xff1a; "右键" -> "Decode As" 选择thrift的tcp端口 将“当前”修改为Thrift&#xff0c;然后点击“确定” 设置后&#xff0c;可以发现Wireshark里面显示的协议从Tcp变…

基于Keras和LSTM单参数预测中兴通讯股票走势,结果震惊,含代码数据集

1.前言 昨天用分类算法预测大A各个股票的第二天行情&#xff0c;预测结果出现了千股下跌的场景&#xff0c;结果着实让我震惊&#xff0c;预测结果如下图&#xff0c;有没有可能预测第二天究竟涨了多少或者跌了多少呢&#xff1f;毕竟短线交易见好就收呢&#xff1f; 通过查找…

【教学类-47-01】20240206UIBOT+IDM下载儿童古诗+修改文件名

背景需求&#xff1a; 去年12月&#xff0c;我去了其他幼儿园参观&#xff0c;这是一个传统文化德育教育特色的学校&#xff0c;在“古典集市”展示活动中&#xff0c;小班中班大班孩子共同现场念诵《元日》《静夜思》包含了演唱版本和儿歌念诵版本。 我马上也要当班主任了&a…

C#中implicit和explicit

理解: 使用等号代替构造函数调用的效果以类似重载操作符的形式定义用于类型转换的函数前者类型转换时候直接写等号赋值语法,后者要额外加目标类型的强制转换stirng str -> object o -> int a 可以 int a (int)(str as object)转换通过编译,但没有转换逻辑所以运行会报错…

I.MX6U C语言运行环境构建及驱动开发格式

1.设置处理器模式 设置6ULL处于SVC模式下。设置下CPSR寄存器的bit4-0,也就是M[4:0]为100110x13.。读写状态寄存器需要用到MRS和MSR指令。MRS将CPSR寄存器数据读出到通用寄存器里面&#xff0c;MSR指令将通用寄存器的值写入到CPSR寄存器里面去。 2.设置SP指针 SP可以指向内部…

【数据结构】二叉树的顺序结构及链式结构

目录 1.树的概念及结构 1.1树的概念 1.2树的相关概念 ​编辑 1.3树的表示 1.4树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树概念及结构 2.1二叉树的概念 2.2现实中的二叉树 ​编辑 2.3特殊的二叉树 2.4二叉树的性质 2.5二叉树的存储结…

LabVIEW伺服阀动静态测试系统

LabVIEW伺服阀动静态测试系统 基于LabVIEW开发了一套伺服阀动静态测试系统&#xff0c;提高伺服阀在电液伺服控制系统中的性能测试精度和效率。通过设计合理的液压系统、电控系统及软件系统&#xff0c;实现了伺服阀的动态和静态特性测试&#xff0c;采用流量-压力双闭环稳态控…

Pandas 对带有 Multi-column(多列名称) 的数据排序并写入 Excel 中

Pandas 从Excel 中读取带有 Multi-column的数据 正文 正文 我们使用如下方式写入数据&#xff1a; import pandas as pd import numpy as npdf pd.DataFrame(np.array([[10, 2, 0], [6, 1, 3], [8, 10, 7], [1, 3, 7]]), columns[[Number, Name, Name, ], [col 1, col 2, co…

计算机网络之一

目录 1.因特网概述 1.1网络、互连网&#xff08;互联网&#xff09;和因特网 1.2.因特网发展的三个阶段 1.3基于ISP的三层架构的因特网 1.4.因特网的组成 2.三种交换方式 2.1电路交换 2.2分组交换 1.因特网概述 1.1网络、互连网&#xff08;互联网&#xff09;和因特网…