当前位置: 首页 > 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);//开启接收功能

总结

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

http://www.lryc.cn/news/299939.html

相关文章:

  • Pycharm配置运行selenium教程
  • 银河麒麟V10开机后黑屏解决方法
  • 【Git版本控制 02】分支管理
  • 基金分类
  • kali系统概述、nmap扫描应用、john破解密码、抓包概述、以太网帧结构、抓包应用、wireshark应用、nginx安全加固、Linux系统加固
  • Spring Cloud 路由和消息传递 (HTTP 路由)
  • 【PyQt】12-滑块、计数控件
  • 【牛客面试必刷TOP101】Day21.BM11 链表相加(二)和BM12 单链表的排序
  • 疑似针对安全研究人员的窃密与勒索
  • Mamba-UNet:用于医学图像分割的类似UNet的纯视觉Mamba网络
  • 2024/2/14
  • 跟廖雪峰老师学习Git(持续更新)
  • 2024,欢迎来到性价比时代
  • 【国产MCU】-CH32V307-通用定时器(GPTM)-输入捕获模式测量脉冲
  • sqlserver char,nchar varchar nvarchar的区别
  • FT2232调试记录(2)
  • 网络学习:数据链路层VLAN原理和配置
  • Docker的常见命令以及命令别名
  • 2024.02.14作业
  • SpringMVC原理(设计原理+启动原理+工作原理)
  • Java+SpringBoot构建智能捐赠管理平台
  • ubuntu远程桌面配置以及常见问题
  • 数据结构:并查集讲解
  • Stable Diffusion主流UI详细介绍
  • webpack5 常用插件使用
  • 利用Python和pandas库进行股票技术分析:移动平均线和MACD指标
  • whisperspeech 英文TTS的实现
  • P1000 超级玛丽游戏(洛谷)
  • 数据卷的常见命令,如何创建Nginx容器,修改nginx容器内的html目录下的index.html文件
  • CFS三层靶机