STM32 HAL库的USART空闲中断

STM32中启用 UART 的特定中断( __HAL_UART_ENABLE_IT函数)开机立即进入中断问题(HAL UART 的特定中断及__HAL_UART_ENABLE_IT函数的一系列问题 阅读详情

不知道使用HAL库的小伙伴有没有发现在HAL库里面好像没有空闲终端的函数,找了很久只发现一个和接收中断有关的函数HAL_UART_Receive_IT ,但是也不是很符合我的需要的嘛,所以上网查了一下,发现可以不适用HAL库提供的那些函数,只需要还是按照像是在标准库里面做的那样查找对应的标志,清除标志这样子操作。

可以按照一下的步骤来做:

①初始化时使能对应的标志位中断


void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  if(uartHandle->Instance==USART2)
  {
  /* USER CODE BEGIN USART2_MspInit 0 */

  /* USER CODE END USART2_MspInit 0 */
  /** Initializes the peripherals clocks
  */
    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;
    PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
    {
      Error_Handler();
    }

    /* USART2 clock enable */
    __HAL_RCC_USART2_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**USART2 GPIO Configuration
    PA2     ------> USART2_TX
    PA3     ------> USART2_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* USART2 interrupt Init */
    HAL_NVIC_SetPriority(USART2_IRQn, 0, 2);
    HAL_NVIC_EnableIRQ(USART2_IRQn);
  /* USER CODE BEGIN USART2_MspInit 1 */
		//要是能接收和空闲中断
		__HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
		__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
  /* USER CODE END USART2_MspInit 1 */
  }
}

 在有文件里面你可以发现很多这种宏定义的函数,后面的查询中断标志位也是在这里面找的函数

 ②自己编写中断处理函数

我们知道HAL库的中断处理函数是同意调用了一个回调函数,我们可以按照我们自己的写中断处理函数,不适用HAL库的函数,

以下做参考:

void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */
		uint8_t temp;
		if(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_RXNE)!=RESET){
			temp=huart2.Instance->RDR;
			usart_rcv_buff[usart_rcv_length++]=temp;
			__HAL_UART_CLEAR_FLAG(&huart2,UART_FLAG_RXNE);  
		}
		else if(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE)!=RESET){
			temp=huart2.Instance->RDR; 
			usart_rcv_length=0; 
			printf("rcv: %d %d \r", usart_rcv_buff[0], usart_rcv_buff[2]);
			__HAL_UART_CLEAR_IDLEFLAG(&huart2);
		}
  /* USER CODE END USART2_IRQn 0 */
  //HAL_UART_IRQHandler(&huart2);
  /* USER CODE BEGIN USART2_IRQn 1 */

  /* USER CODE END USART2_IRQn 1 */
}

 好了,现在可以处理接收和空闲中断了,快去试试吧!

 

HAL_UART_Receive_IT 和 __HAL_UART_ENABLE_IT( ) 的区别? 使能串口空闲中断的宏定义,在stm32f4xx_hal_uart.h中定义。最近在写基于STM32 CubeMX和Hall程序时,注意到有。状态,则考虑用第一个宏定义,有特别需要的还可以自己编写函数。两种打开USART中断的方法,但好像不太了解两者的区别。的中断,就还是用第二种常用的HAL函数即可。都有中断需求、或者说是整个串口的。HAL函数,使能串口接收中断。 阅读详情

相关推荐

HAL_UART_Receive_IT和__HAL_UART_ENABLE_IT区别

的功能和用法有显著区别,尤其是在中断触发和数据读取逻辑上。,因其更简洁且与HAL的重新初始化流程兼容。在STM32HAL中,

亚洲程序员盟主得博客 2099

HAL开启串口空闲中断

串口接收数据时,开启空闲中断后可在接收完成触发中断,再去做进一步处理,但找了半天没找掉HAL的使能某中断的函数,以及判断是哪个中断触发的函数,原来在stm32f4xx_hal_uart.h中有相关宏定义。 使能中断的宏定义 __HAL_UART_ENABLE_IT(__HANDLE__, __INTERRUPT__) 判断是触发哪个中断的宏定义 __HAL_UART_GET_FLAG(__HANDLE__, __IT__) 清除IDLE的中断标志位的宏定义 __HAL_UAR...

万无引力的博客 5552

hal开启中断关中断_STM32 HALUSART中断接收不定长数据——空闲中断

STM32HALUSART中断接收不定长数据——空闲中断STM32cubeMX软件配置好串口中断,导出工程并打开,定义串口接收缓冲区和接收长度的全局变量:uint8_tRX_data[1000];uint16_tRX_len;在main函数的初始化中开启IDLE中断并首次打开中断接收函数://开启IDLE中断__HAL_UART_ENABLE_IT(&huart1,UART_...

weixin_39884078的博客 2029

STM32HAL___串口数据处理

本文目录前言一、中断方式二、空闲中断+DMA总结 前言 在STM32常用串口协议实现与其它外设交互数据,发送数据简单,但是如何方便快捷的处理通过串口接收到的数据并没那么简单。在STM32中,USART发送接收有三种方式:轮询,中断,DMA。其中轮询的方式过于笨拙,一般本人不会选择这种方式,下文中将从中断方式,IDLE+DMA方式进行介绍,以及如何对循环数组中的数据提取当次接收的数据。 一、中断方式 发送方式: HAL_UART_Transmit(&huart1, (uint8_t*)"test.

boom的博客 3477

stm32--HALDMA+USART+空闲中断不定长收发数据】

这张图就是我上面描述的过程,有细心的小伙伴可能发现了,我这里用的是双向箭头,因为这里的数据传输,也是双向的,殷夫人收到灵珠了,但是她不会用呀,那她也可以通过DMA通道,找我要使用说明书;所以这里数据传输是双向的,因为他只是一个通道,这个通道双方都可以使用。比如,**我现在要配置PA10、PA9,你想想你是要什么功能?这里因为是串口通讯,因此选用USART1_RX,同理,PA9未TX。注意,原理图用到谁,配置谁,不用的不配置,因为会浪费资源。串口可参考我之前写的,这里不过多阐述。对于我的main函数而言,

一杯咖啡,一行代码 3020

STM32 HAL USART DMA 空闲中断:3步实现115200波特率不定长数据接收

本文详细介绍了如何使用STM32 HALUSART结合DMA与空闲中断,通过三个关键步骤实现115200波特率下的高效不定长数据接收。该方案利用DMA提升数据吞吐量,空闲中断精准捕获数据帧边界,适用于物联网、工业传感器等场景,显著降低CPU负载并提高系统稳定性。

weixin_28366475的博客 222

STM32CubeMX配置USART空闲中断+DMA接收不定长数据,5分钟搞定(HAL版)

本文详细介绍了如何使用STM32CubeMX配置USART空闲中断和DMA接收不定长数据的方法,适用于STM32F407等芯片。通过HAL空闲中断+DMA组合方案,实现了高效的数据接收,显著降低CPU占用率,并提供了关键代码实现、避坑指南及性能优化技巧。

weixin_29901799的博客 369

HAL 串口使用笔记

cube配置串口完后 串口进入中断 手动加入 __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);就可以进入中断了 然后呢 ? 中断进去之后应该怎么接收数据? 直接写HAL_UART_Receive_IT(&huart1,u1rx, 6); 不行 u1rx里面没有数据 如果在while之前调用HAL_UART_Receive_IT(&amp...

sqeasww的博客 2048

STM32基于HAL串口接受中断和空闲中断

在通信方面。UART由于全双工通信,可以同时接受数据和发送数据而被广泛使用。而接受数据则又有很多种方法比如根据结束符判断,数据是字符串形式,所以一般串口接受的接受符就是定时器中断,设计"喂狗信号量"也就是串口空闲的时间,在串口接受后的定时器里不断递减,减到零则判断接受完毕,接受数据则喂狗刷新递减时间。(这也是单片机常见的串口接受思路)STM32有很多种方式,前两种在某些情况都很可以用。但是第一种只适用于判断结束符。...

昊月光华的博客 8259

STM32 HAL串口同时收发,接收卡死?

STM32 使用 HAL串口同时收发,使用踩坑史 = =!......by 矜辰所致

不浮夸,不将就,认真对待学知识的我们 1万+

HAL串口中断笔记

UART_Receive_IT(UART_HandleTypeDef *huart)           调用了       HAL_UART_RxCpltCallback(huart); UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma)   调用了       HAL_UART_RxCpltCallback(huart);  UART_Receive_...

zaohang的专栏 1887

HAL下的UASRT的空闲中断

HAL下的UASRT的空闲中断

weixin_51785462的博客 1156

STM32 HAL UART 使用关键思路(无代码,但是很关键)

STM32 中的 UART 允许使用不同的发送 (TX) 和接收 (RX) 模式进行配置,有什么区别和优势?

liuyangqi11的博客 916

HAL(STM32CubeMX)——USART串口配置学习(中断接收/STM32G431RBT6)

UART与USART介绍: USART(universal synchronous asynchronous receiver and transmitte): 通用同步异步收发器 USART是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。 UART(universal asynchronous receiver and transmitter): 通用异步收发器 异步串行通信口(UART)就是我们在嵌入式中常说的串口,它还是一种通用的数据通信议。 区别: USART是指单片机

贾saisai的博客 1万+

中断启用的两种方式

项目层次底层函数,手动配置上层函数,自动管理缓冲区无,需用户自行管理自动管理数据读取用户手动读取DR寄存器自动存入用户定义缓冲区回调机制无需使用回调,自行处理使用回调便利性低,需手动实现逻辑高,使用简单功能方法一 (方法二 (中断开启方式手动调用函数自动调用缓冲区管理手动实现HAL自动管理数据读取方式用户自行读取寄存器自动读取到缓冲区中断服务函数用户手动实现函数处理,回调函数用户实现推荐场景需要精细控制底层通用快速应用使用。

qq_53206057的博客 1361

STM32F107 HAL配置usart 无法进入中断服务函数

STM32F107 HAL配置usart 无法进入中断服务函数 在调试过程中,使用stm32cubemx配置串口后,发现无法进入到中断服务函数: 在void HAL_UART_MspInit(UART_HandleTypeDef* huart) 加入 __HAL_UART_ENABLE_IT(huart,UART_IT_RXNE); 开启接收完成中断,才能进入到中断服务函数。 调用 HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huar

yinchen192的博客 2164

STM32 HAL串口中断控制相关

在移植modbus时需要进行串口接收与发送中断的控制,由于hal封装比较复杂,不便于精细操作。中断管理主要是开启中断、关闭中断和获取中断状态,在文件中也能看到。中断标志位的管理主要有中断标志位的查询与标志位的清除。对于某些较为常用的中断控制与中断标志会有专用的接口函数方便使用。

不是大仙的小先儿 4291

STM32HAL开发】CubeMX配置HAL,不进串口中断的问题

STM32HAL开发】串口中断开发环境在main.c添加代码(1/2)在stm32f4xx_it.c添加代码(2/2)注意附代码 开发环境 cubemx V5.5.0 + MDK Keil V5.29.0.0 + STM32F429NIH 在main.c添加代码(1/2) 在main函数中,初始化uart后执行 ==__HAL_UART_ENABLE_IT(&huart1,UART_...

qq_41100189的博客 8916
上一篇: STM32上的Modbus通信实现字节序问题
下一篇: Ubuntu“快速”安装QT——QT安装过程很慢怎么加快?
Teaant
博客等级 码龄5年 28粉丝 15原创
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值