使用STM32CubeMX ,实现DMA+UART+IDLE来接受一帧数据

本文通过STM32CubeMX详细介绍了如何配置DMA和UART,结合IDLE状态检测,实现串口数据帧的完整接收。在中断服务函数`USART1_IRQHandler(void)`中进行关键处理,并在主程序中设置相关参数。实验结果显示,成功实现了数据帧的接收。完整的程序代码及下载链接可在指定CSDN页面找到。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DMA接收设置前铺垫知识点:
        STM32的IDLE的中断产生条件:在串口无数据接收的情况下,不会产生,当清除IDLE标志位后,必须有接收到第一个数据后,才开始触发,一但接收的数据断流,没有接收到数据,即产生IDLE中断停止。


生成代码后,

oid USART1_IRQHandler(void) 加入源码:

 if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE))
  {
	__HAL_UART_CLEAR_IDLEFLAG(&huart1);
  	HAL_UART_DMAStop(&huart1); 
	  
	 if(USART1_RX_STATE_START == usart1_rx_state)
	 {
		usart1_rx_len = USART1_MAX_RECV_LEN - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);	   
		usart1_rx_state = USART1_RX_STATE_FINISH;
		memcpy(g_usart1_rx_buff,tmp_usart1_rx_buffer,usart1_rx_len);
	 }
	 
	memset((uint8_t *)tmp_usart1_rx_buffer,0,USART1_MAX_RECV_LEN);
	HAL_UART_Receive_DMA(&huart1, tmp_usart1_rx_buffer, USART1_MAX_RECV_LEN);
  }
void MX_USART1_UART_Init(void) 最后加入: 
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);   						//usart1, 使能空闲中断
  HAL_UART_Receive_DMA(&huart1, tmp_usart1_rx_buffer, MAX_RECV_LEN);	//使能DMA接受,将接受到的数据放到tmp_usart1_rx_buffer
加入串口发送:
void USART1_TX(uint8_t *pData, uint16_t Size)
{
	HAL_UART_Transmit(&huart1,pData,Size,1000);
}

主程序里加入:

  if(USART1_RX_STATE_FINISH == usart1_rx_state)  
	{
		USART1_TX(g_usart1_rx_buff,usart1_rx_len);
		usart1_rx_state = USART1_RX_STATE_START;
	}

程序结果:

程序链接地址:

https://download.csdn.net/download/happygrilclh/12368152

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值