HAL库DMA+空闲中断接受串口无法接收到数据

HAL库DMA+空闲中断接受

今天遇到了一个问题,关于DMA+空闲中断的问题,串口无法接收到内容
具体代码如下

  HAL_UARTEx_ReceiveToIdle_DMA(&huart1,s_buff, RXDMASIZE);
  //此函数放在初始化出来打开空闲中断
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
	if(huart->Instance == USART1){
//		HAL_UART_DMAStop(huart);//若接收为Circle模式,则需要取消注释,我用的normal模式
/*下面是空闲中断想要实现的功能
		uint8_t buff[8];
		memset(buff,s_buff,sizeof(buff));
		memset(s_buff,0,sizeof(s_buff));
		DataTrans(buff);
功能到这里结束*/
		HAL_UARTEx_ReceiveToIdle_DMA(&huart1,s_buff, RXDMASIZE);
		//再次打开空闲中断
	}
}

这样设置就完成了,但是却遇到了问题,每一次进入到中断处理函数时,进入的不是下面中断

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t 

而是

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)

我调试进入到中断处理函数进行查看时发现他会进入到如下if语句当中
在这里插入图片描述
也就是发生了溢出错误,导致处理函数直接就调用了错误回调函数,想要验证的同学可以自己写一个错误回调函数的串口调试看看。以下是我写的,进入错误回调函数会给我发送一个"error"。

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1){

			HAL_UART_Transmit(&huart1,"error",5,0xff);
	//		printf("x:%d,y:%d",value[0],value[1]);
			if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_ORE))//溢出标志
			{
			  uint32_t temp = USART1->SR;
			  temp = USART1->DR;
			}
			HAL_UARTEx_ReceiveToIdle_DMA(&huart1,s_buff, RXDMASIZE);
	}
}

后来发现是MX的问题生成代码的问题。
在这里插入图片描述
在初始化时,MX_DMA_Init();放在了DMA接收所使用的串口(我这里时串口1)初始化的前面,导致DMA无法确定外设发送的数据存到哪里,因此无法读取串口接收缓冲器里的内容,当数据接收区或者FIFO区有数据或者满时,又有新数据进来,会导致发生溢出错误,一旦发生溢出错误,RX 移位寄存区虽然能有新数据不断的覆盖,但是数据不会到达RXR或FIFO(现象是:RXNE在ORE置位时不会被置位),导致程序中不能读到新的数据。

详细可以参照大佬这篇文章的的注意事项
链接: 参考文章

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: hal_uartex_rxeventcallback是一个回调函数,用于处理UART接收事件。当UART接收数据时,该函数将被调用,并且可以在函数中处理接收到的数据。该函数通常由HAL库提供,并且可以根据需要进行自定义。 ### 回答2: hal_uartex_rxeventcallback函数是一个UART接收完成回调函数,在Hal库中被使用。在应用程序中使用这个回调函数,可以在UART接收数据完成时触发自定义的处理函数,进行一些自定义的操作。 在使用这个函数时,首先需要先初始化UART配置,包括波特率、数据位、奇偶校验位等等。然后,需要指定这个回调函数,也就是hal_uartex_rxeventcallback函数,作为UART接收完成时的回调函数。 当UART接收完成时,就会调用这个回调函数,函数会将接收到的数据传递给应用程序,并提示应用程序数据已经接收完成。应用程序可以在这个回调函数中进行一些自定义的处理,比如解析数据、存储数据等等。 这个函数的类型定义如下: typedef void (*hal_uart_rx_complte_cb_t)(void *arg, uint8_t *data, uint16_t size); 其中,arg是一个指针类型的参数,可以用来传递一些额外的信息。data参数是一个指向接收数据缓冲区的指针,size参数是接收到的数据的大小。应用程序可以在这个回调函数中根据data和size参数进行一些处理。 总之,hal_uartex_rxeventcallback函数是一个非常有用的回调函数,在HAL库中被广泛使用。通过指定这个回调函数,应用程序可以在UART接收数据完成时进行一些自定义的处理,非常灵活和方便。 ### 回答3: hal_uartex_rxeventcallback是HAL底层库中的一个回调函数,它主要用于当使用HAL库实现串口接收数据时,捕获到数据后的回调函数。该函数需要用户自己进行实现并注册到HAL库中,以便在有串口接收数据时进行调用。 在实现该回调函数时,通常需要注意以下几点: 1. 数据接收方式:HAL库支持多种串口接收数据的方式,如中断模式、DMA模式等。hal_uartex_rxeventcallback需要根据用户选择的接收方式来编写相应的代码逻辑。 2. 数据处理方式:一旦接收串口数据hal_uartex_rxeventcallback需要将数据进行处理并存储。不同的应用场景需要实现不同的数据处理方式,比如实现数据解析、存储到缓存区等。 3. 数据处理速度:在处理数据时,需要考虑到数据接收速度和处理速度之间的平衡。如果处理速度过慢,可能会丢失部分数据;如果处理速度过快,会导致CPU资源浪费。因此,需要根据实际应用场景调整数据处理速度。 总的来说,hal_uartex_rxeventcallback是HAL库中实现串口接收数据的关键回调函数之一,它在串口数据处理应用中具有广泛的应用。让用户可以灵活自由地定制自己所需的数据接收和处理逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值