STM32CubeMX串口+DMA接收不定长数据

STM32CubeMX HAL库串口+DMA+空闲中断接收不定长数据

1.修改CubeMX生成的串口初始化函数

void MX_USART1_UART_Init(void)
{

huart1.Instance = USART1;
huart1.Init.BaudRate = 19200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
_Error_Handler(FILE, LINE);
}

__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //使能空闲中断
HAL_UART_Receive_DMA(&huart1, RxDMABuf_1, RXBUF_1_SIZE); //启动DMA接收

}
该函数在usart.c文件下。要更改的就是增加最后两行,其中RxDMABuf_1 是数据接收缓存,RXBUF_1_SIZE 是DMA一帧接收的最大字节数。

2.修改CubeMX生成的串口中断函数

void USART1_IRQHandler(void)
{
HAL_UART_IRQHandler(&huart1);

UART_IDLE_Deal(&huart1); //自定义空闲中断处理函数

}
该函数在stm32xxx_it.c文件下。增加UART_IDLE_Callback自定义空闲中断处理函数

3.定义UART_IDLE_Deal空闲中断处理函数

void UART_IDLE_Deal(UART_HandleTypeDef *huart)
{
unsigned int temp;
if( __HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) != RESET) //判断是否空闲中断
{
__HAL_UART_CLEAR_IDLEFLAG(huart);
temp = huart->Instance->SR;
temp = huart->Instance->DR;
HAL_UART_DMAStop(huart);

	if(huart->Instance == USART1)
	{
		//计算DMA接收的长度,也就是接收完一帧的长度
		DMA_Usart1_RxSize = RXBUF_1_SIZE - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx); 
		if(DMA_Usart1_RxSize > 0 )
		{
			memcpy(RxBuf_1, RxDMABuf_1, DMA_Usart1_RxSize);
			RxBufSize_1 = DMA_Usart1_RxSize;
			memset(RxDMABuf_1, 0, sizeof(RxDMABuf_1));
		}
		HAL_UART_Receive_DMA(&huart1, RxDMABuf_1, RXBUF_1_SIZE); //启动下一次接收
	}
}

}
这个函数我定义在了usart.c文件下。功能主要就是接收完一帧数据后将数据拷贝出来,以免下次接收后被覆盖。

4.定义串口接收函数

unsigned char Uart_GetData(UART_HandleTypeDef *huart, unsigned char *buf)
{
unsigned char Size = 0;
if(huart->Instance == USART1)
{
if(RxBufSize_1 > 0)
{
Size = RxBufSize_1;
RxBuf_1[RxBufSize_1] = 0;
memcpy(buf, RxBuf_1, RxBufSize_1);
RxBufSize_1 = 0;
}
}
return Size;
}
该函数供主程序调用。

stm32cubemx是一个用于生成STM32微控制器初始化代码的工具,而FreeRTOS是一个实时操作系统,串口DMA(直接存储器访问)是一种在数据传输时减少CPU负荷和提高效率的方式。当使用STM32CubeMX结合FreeRTOS来接收不定数据时,可以按照以下步骤进行操作。 首先,在CubeMX中配置串口DMA的初始化参数,使其支持不定数据接收。可以选择需要的串口和对应的DMA通道,配置串口的波特率、数据位和停止位等参数。然后,配置DMA以支持循环传输和变化度的数据接收。 其次,生成初始化代码并在FreeRTOS中集成。CubeMX可以生成针对FreeRTOS的初始化代码,将配置好的串口DMA初始化函数添加到FreeRTOS任务中,并在任务中实现数据接收的逻辑。可以利用FreeRTOS提供的任务管理和事件控制功能,让串口DMA在后台接收数据,同时不影响其他任务的运行。 最后,根据实际需求处理不定数据。在串口DMA接收数据后,根据数据度进行相应的处理,可以通过消息队列或者信号量将数据传递给其他任务进行后续处理,也可以在接收完成后发送一个事件信号通知其他任务进行处理。需要根据具体需求来设计数据处理的流程,确保数据能够被准确地接收和处理。 总之,在使用STM32CubeMX和FreeRTOS进行串口DMA接收不定数据时,需要合理配置串口DMA参数,并在FreeRTOS任务中实现数据接收和处理的逻辑,以实现高效、稳定地数据传输和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yu_weiguo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值