欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > 5.1串口DMA与接收不定长数据

5.1串口DMA与接收不定长数据

2025/10/24 3:31:31 来源:https://blog.csdn.net/m0_57852920/article/details/142863441  浏览:    关键词:5.1串口DMA与接收不定长数据

串口DMA与接收不定长数据

DMA作用:在寄存器与内存之间搬运数据。

使用DMA步骤

1.创建DMA通道

从源地址的数据搬运到目标地址,等全部搬运完成,再通过中断提醒我们

例如,在串口的发送端和接收端创建两条DMA通道,就可以让DMA帮着在串口的寄存器与内存变量间搬运数据。

在DMA Settings中添加两条通道用于USART2接收和发送

在这里插入图片描述

2.使用DMA进行发送和接收

发送函数
HAL_UART_Transmit_DMA(huart,pData,Size);

参数说明同HAL_UART_Transmit_IT();

接收函数
HAL_UART_Receive_DMA(huart,pData,Size);

参数说明同HAL_UART_Receive_IT();

即使使用的DMA,其实还是有中断参与其中的,例如RxCpltCallback函数还是由中断触发,但不是由于串口中断触发,而是DMA的传输完成中断

如何接收不定长数据,依靠串口空闲中断,此中断的触发条件与接收的字节数无关,只有串口上无后续字节输入,串口接收从忙碌转为空闲时才会触发,即串口空闲中断发生时,就是一帧数据包接收完成了

串口空闲中断函数

HAL_UARTEx_ReceiveToIdle(huart,pData,Size);
HAL_UARTEx_ReceiveToIdle_IT(huart,pData,Size);
HAL_UARTEx_ReceiveToIdle_DMA(huart,pData,Size);

Ex代表扩展,Idle代表空闲中断

  • 此参数中的Size 指的是,一次能接受的最大数据长度

此函数的完成回调函数不再是HAL_UART_ReCpltCallBack()方法了,而是

__weak void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{/* Prevent unused argument(s) compilation warning */UNUSED(huart);UNUSED(Size);/* NOTE : This function should not be modified, when the callback is needed,the HAL_UARTEx_RxEventCallback can be implemented in the user file.*/
}

在mian.c中重新声明

在这里插入图片描述

值得注意的是:HAL_UARTEx_ReceiveToIdle_DMA() 在接收数据量达到我们设置的最大值一半的时候,也会调用HAL_UARTEx_RxEventCallback(),对于一般的场景可以关闭“DMA传输过半中断”

DMA传输过半中断语句:

__HAL_DMA_DISABLE_IT(&hdma_usart2_rx,DMA_IT_HT);

之后就可以发送不定长数据了

输过半中断语句:

__HAL_DMA_DISABLE_IT(&hdma_usart2_rx,DMA_IT_HT);

之后就可以发送不定长数据了

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词