STM32串口收发不定长数据HAL库版,使用STM32CubeMX配置参数生成HAL库,利用DMA空闲中断IDLE实现串口收发不定长数据的方法HAL库版,完整源码免费下载

【10本阳台种菜电子书免费领取】

阳台种菜交流微信群,欢迎菜友们加入,有种菜问题直接群里提出,添加 泛米米博客微信:2370202521 (添加记得备注阳台种菜,加后拉你进群,还有10本阳台种菜电子书免费赠送)

微信小程序:跟泛米米一起阳台种菜

添加小程序,手机上一起种菜

分享一个使用使用HAL库实现串口收发不定长数据的方法,芯片为STM32F103C8T6,使用STM32CubeMX配置硬件参数,下面泛米米博客介绍详细方法。

STM32串口收发不定长数据原理:

在一帧数据传输结束后,通信线路会维持高电平,当CPU检测到线路处于空闲状态时,空闲状态标志IDLE将由硬件置1。如果串口控制器CR1中的IDLEIE位为1,将触发空闲中断,也就是IDLE中断,这里实现收发不定长数据就是利用的这个中断。

STM32串口收发不定长数据的目标:

利用串口助手,从PC发送任意长度的字符到STM32F103C8T6核心版串口,收到数据后将原样返回到PC端串口助手。

STM32串口收发不定长数据的设计思路:

1、使能IDLE中断,在串口中断服务程序中添加对IDLE的判断。

2、启动DMA,将接收的数据缓存,当一帧数据发送完成后,线路厨余IDLE空闲状态,会触发IDLE中断,在IDLE中断回调函数里设置接受完成标志。

3、WHILE里检测到接收完成标志后,将接受的一帧数据原样发回,重新启动DMA。


STM32串口收发不定长数据具体步骤:

1、用STM32CubeMX配置参数

STM32串口收发不定长数据HAL库版1.png

这里主要是配置下串口,然后生成项目文件即可。

2、打开项目文件,编写用户代码。

a、添加空闲中断的处理。

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */

  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
	//添加IDLE中断处理
	if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE)!= RESET) //是否发生IDLE
	{
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);  //清除IDLE中断标志
		HAL_UART_IdleCpltCallback(&huart1);   //用户编写的IDLE中断回调函数
		
	}
  /* USER CODE END USART1_IRQn 1 */
}

b、添加用户变量以及宏定义。

/* USER CODE BEGIN PV */

uint8_t RxBuffer[LENGTH];   //接收缓存区
uint8_t RecCount = 0 ;      //接收数据个数
uint8_t RxFlag = 0 ;        //接收完成标志:0表示接收未完成,1表示接收完成

/* USER CODE END PV */

c、添加while代码,判断接受完成标志,将数据发回

/* USER CODE BEGIN 3 */
		if(RxFlag == 1)   //判断数据是否接收完成
		{
			
			RxFlag = 0;     //清除标志位
			//发生空闲中断时,已接收数据个数等于数据总量减去DMA数据流中待接收的数据个数
			RecCount = LENGTH - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
						
			//采用DMA方式将接收的数据原样发回PC
			HAL_UART_Transmit_DMA(&huart1,(uint8_t*)RxBuffer,RecCount);
			
			RecCount = 0;
			
			HAL_UART_Receive_DMA(&huart1,(uint8_t*)RxBuffer,LENGTH);   //启动DMA接收
			
		}
  }
  /* USER CODE END 3 */

d、添加中断回调函数和空闲中断函数

/* USER CODE BEGIN 4 */
//***********接收中断回调函数***************//
//DMA中断将调用接收中断回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart ->Instance == USART1)
	{
		//重新启动DMA接收,准备下一次的数据传输
		HAL_UART_Receive_DMA(&huart1,(uint8_t*)RxBuffer,LENGTH);//使能接收终端
	}
}

//*************空闲中断回调函数********************//
void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart)
{
	RxFlag = 1;    //设置接收完成标志

}

/* USER CODE END 4 */

程序就完成了,然后编译,0错误0警告,下载,测试串口

STM32串口收发不定长数据HAL库版2.png发送任意长度数据,正常返回任意长度数据。

完成。

视频教程:微信扫下面二维码,或者搜视频号“泛米米”即可查看

泛米米视频号二维码.png

完整版源码下载链接(腾讯微云):


https://share.weiyun.com/ddv9i1zK


有问题需要技术支持可以添加泛米米微信:2370202521


关于STM32F103C8T6使用STM32CubeMX配置参数生成HAL库,利用DMA空闲中断IDLE实现串口收发不定长数据的方法,提供源码泛米米博客就介绍到这了。

这篇文章出自 泛米米博客 如需转载请注明出处;

这篇文章的地址:https://fanmimi.com/2021/490.html

本站部分资源收集于网络,纯个人收藏,无商业用途,如有侵权请及时告知!