STM32 HAL库串口+DMA接收不定长数据

2023-05-16

        在串口通信中,很多时候我们需要的是接收一帧不确定长度的数据,而不是单个字节或者固定长度,这时我们就需要利用STM32的空闲中断(IDLE)来实现不定长数据的接收,首先我们打开STM32Cumebx建立一个工程,配置管脚图:

这里我们采用三线SWD下载方式,加一个LED灯交替闪烁,串口中断+DMA来接收不定长数据,串口采用默认配置,打开串口中断,采用DMA方式进行发送和接收:

然后保存工程生成代码。

生成代码后先定义以下变量:


uint8_t  rx_buffer[100];                             
char     BUFFER_SIZE=100;   

然后在主函数中加入串口接收回调函数:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	HAL_UART_DMAStop(&huart1);  
	uint8_t data_length  = BUFFER_SIZE - hdma_usart1_rx.Instance->CNDTR; 
	HAL_UART_Transmit(&huart1,rx_buffer,data_length,200);
	data_length = 0;
	HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);
}

我用的Firmware Package 版本是STM32Cube FW_L4 V1.13.0,需要在库函数stm32l4xx_hal_uart.c中的第2366行加入如下代码段


	if(((isrflags & USART_ISR_IDLE)!= RESET) &&((cr1its & USART_CR1_IDLEIE)!=RESET))
	{ 
		//clear IDLE flag
			__HAL_UART_CLEAR_IDLEFLAG(huart);
		
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
    huart->RxCpltCallback(huart);
#else
    HAL_UART_RxCpltCallback(huart);
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */
		return;
	}

这段代码的位置如下图所示:

主函数中我们自己添加的代码:

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
        //这是我们自己添加的代码,让LED灯循环闪烁。
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
		HAL_Delay(200);
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
		HAL_Delay(200);
		
  }
  /* USER CODE END 3 */
}

当然我们的主函数没有意义,实际功能是在串口回调函数中实现的,目的就是把接收到的数据重新返回给串口助手,效果图如下:

可以看到   当我们给单片机发送一帧数据时,单片机会把同样的数据返回给我们。

注意:在串口初始化程序中我们一定要添加以下两行代码:

  /* USER CODE BEGIN USART1_Init 2 */
	__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
	HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);
  /* USER CODE END USART1_Init 2 */

并且在串口回调函数中,接收完一帧数据后,需要重新打开串口的DMA接收。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 HAL库串口+DMA接收不定长数据 的相关文章

  • ipscan端口扫描工具

    ip端口扫描工具的英文名字是ipscan 是一款搜索局域网机器的绿色小软件 IPScan在静态IP地址环境下或者DHCP环境下 都提供完善的IP地址管理 用户也可以使用IPScanProbe自带的DHCP服务器 它能提供更高的安全和灵活的D
  • IPFS,HDFS以及http对比笔记

    分布式系统 分布式系统发展至今已有数十年 xff0c 那么分布式系统到底是什么 xff1f 实际上分布式系统并没有标准的定义 分布式系统一般的呈现方式是将硬件或软件分布在不同的网络计算机 xff0c 彼此间通过消息传递进行通信及协调 xff
  • chatgpt注意点

    1 ip地址不能是国内 2 浏览器无痕模式 xff08 浏览器不挑 xff09 3 国外的手机号激活sms 激活 20230213目前还可以注册
  • ASP.NET 连接MySQL数据库 详细步骤

    ASP NET默认的数据库是MS SQL Server xff0c 微软的数据库产品 事实上 xff0c 如果不计成本因素的话 xff0c Windows Server 43 IIS 43 MS SQL Server 43 ASP NET是
  • Apache Skywalking介绍

    Apache Skywalking介绍 1 基本介绍 Apache Skywalking是一款APM工具 xff08 Application Performance Management 应用性能管理 xff09 2 安装部署 官网地址 x
  • 常用的法律检索类网站

    1 中国裁判文书网 xff1a http wenshu court gov cn xff0c 共公布全国各级法院生效裁判文书1 2亿篇 xff0c 可以检索 查看 下载裁判文书 2 中国司法案例网 xff1a http anli court
  • 重要代码备份

    文书 xff1a button 61 document getElementsByClassName 34 a xzBox 34 for let i 61 0 i lt 61 14 i 43 43 setTimeout 61 gt butt
  • 在 Visio 绘图中剪裁线条和形状

    编辑绘图或图表 在 34 开始 34 选项卡上 xff0c 单击 34 编辑 34 组中 34 选择 34 xff0c 然后单击 列表中的 34 全 选 34 单击 34 开发工具 34 选项卡 在 34 形状设计 34 组中 xff0c
  • 定时器/计数器介绍

    第一次在学习定时器的时候模模糊糊 xff0c 在做过一些题目之后对定时器有了更新的理解 xff0c 现在整理一下 xff0c 做笔记使用 目录 一 基础知识 定时器的作用 xff1a 定时器的实质 xff1a 定时器的工作原理 xff1a
  • Win10下安装Framework 3.5

    不同于 VC 43 43 运行库 xff0c NET Framework 是支持向下兼容的 xff0c 即 xff1a NET Framework 4 8 向下兼容至 4 0 NET Framework 3 5 SP1 向下兼容至 2 0
  • linux串口通信

    linux下串口通信与管理 linux下的串口与windows有一些区别 xff0c 下面将介绍一下linux下串口通信管理 查看是否支持USB串口 xff1a lsmod grep usbserial 如果没有信息 xff1a sudo
  • UP-magic的口袋机arm挂载u盘

    查看U盘信息 fdisk l mount t vfat dev mmcblk0p1 mnt sdcard 挂载U盘 mount命令格式 xff1a mount 参数 设备名称 挂载点 其他参数 mount t vfat dev sdb1 m
  • dell t630服务器风扇控制笔记记录(耗时一天)

    1 打开虚拟控制台得用IE xff1b 2 Dell PowerEdge T640 加装显卡之后风扇狂转问题解决 知乎 感谢知乎Billy xff0c 操作步骤 xff1a 1 查看iDrac版本 xff0c 必须在3 30 30 30及以
  • 安装autogpt中出现的问题及安装autogpt的小白教程

    ImportError DLL load failed while importing numpy ops The specified module could not be found 解决方案 xff1a Latest supporte
  • UBUNTU下NFS配置(用于嵌入式开发)

    1 NFS简介 NFS xff08 Network File System xff09 即网络文件系统 xff0c 是FreeBSD支持的文件系统中的一种 xff0c 它允许网络中的计算机之间共享资源 在NFS的应用中 xff0c 本地NF
  • Ubuntu 18.04 下 uhd+gnuradio 安装指南

    sudo apt get y install git swig cmake doxygen build essential libboost all dev libtool libusb 1 0 0 libusb 1 0 0 dev lib
  • 跨网的数据交换解决方案

    一 什么是跨网 跨网是指在互联网与局域网之间不能直接连通的网络 这些局域网可以是保密性较高的单独的局域网 xff0c 也可以是公安网 军网等 二 为什么要跨网传输 以公安网为例 xff0c 公安网对数据安全的要求较高 xff0c 所以不与互
  • urllib2.urlopen超时问题

    原帖地址 xff1a http hi baidu com yss1983 item 933fbe45a09c43e01381da06 问题描述 xff1a 没有设置timeout参数 xff0c 结果在网络环境不好的情况下 xff0c 时常
  • iOS Objective-C 正则表达式指南

    1 语法 2 模式 2 1 Search 43 NSString getDomainOfEmailAddress NSString email NSString re 61 64 34 lt 61 64 A Za z0 9 43 A Za
  • C语言学习(五)链表的格式与操作示例

    链表是为克服数组的缺点 xff0c 在内存空间中离散存储 xff0c 但需要一个指针记住下一个结点的地址 xff0c 以便可以将链表结点连接起来 链表与数组的比较 xff1a 数组 优点 xff1a 存取速度快 缺点 xff1a 插入和删除

随机推荐