CubeMX 串口DMA

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

使用cubemx配置串口DMA接收,使用串口3。


提示:以下是本篇文章正文内容,下面案例可供参考

一、基本配置 

1.启动串口3,波特率115200

2.开启中断

3.添加串口3 接收DMA通道

 

二、使用步骤

1.main.c

主函数定义:

#define BUFFERSIZE 255//可以接收的最大字符个数
uint8_t Rx_len_Huart3;//串口3接收长度
uint8_t ReceiveBuff_Huart3[BUFFERSIZE]; //串口3接收缓冲区

2.stm32f1xx_it.c

(1)先导入主函数创建的变量

#define BUFFERSIZE 255	//可接收的最大数据量
extern uint8_t Rx_len_Huart3;//串口3接收长度
extern uint8_t ReceiveBuff_Huart3[BUFFERSIZE]; //串口3接收缓冲区

(2)编写串口中断函数

void USART3_IRQHandler(void) 
{
    /* USER CODE BEGIN USART3_IRQn 0 */

    /* USER CODE END USART3_IRQn 0 */
    HAL_UART_IRQHandler(&huart3);
    /* USER CODE BEGIN USART3_IRQn 1 */
    uint32_t temp;//获取DMA当前还有多少未填充
    if (USART3 == huart3.Instance)//判断是否为串口3中断
    {
        if (RESET != __HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE))//如果为串口1空闲
        {
            __HAL_UART_CLEAR_IDLEFLAG(&huart3);//清除中断标志
            HAL_UART_DMAStop(&huart3);//停止DMA接收
            temp = __HAL_DMA_GET_COUNTER(&hdma_usart3_rx);//获取DMA当前还有多少未填充
            Rx_len_Huart3 = BUFFERSIZE - temp; //计算串口接收到的数据个数
            /*************************************************************************/
            //在这里处理接收数据,数据将会保存在ReceiveBuff_Huart3数组中
            //
            //
            //
            /*************************************************************************/
            /*************************************************************************/
            //重新开启下一次接收
            Rx_len_Huart3 = 0;//接收数据长度清零
            HAL_UART_Receive_DMA(&huart3, ReceiveBuff_Huart3, BUFFERSIZE);//开启下一次接收
        }
    }
    /* USER CODE END USART3_IRQn 1 */
}

(3)例:接收串口IMU发送的数据并进行数据读取

void USART3_IRQHandler(void)
{
  /* USER CODE BEGIN USART3_IRQn 0 */

  /* USER CODE END USART3_IRQn 0 */
  HAL_UART_IRQHandler(&huart3);
  /* USER CODE BEGIN USART3_IRQn 1 */
	uint32_t temp;//计算串口接收到的数据个数
	uint8_t sum=0,i=0; //数据检验
	int16_t DATA[7];   //处理接收数据数组
	if(USART3 == huart3.Instance)//判断是否为串口1中断
	{
		if(RESET != __HAL_UART_GET_FLAG(&huart3,UART_FLAG_IDLE))//如果为串口1空闲
		{
			__HAL_UART_CLEAR_IDLEFLAG(&huart3);//清除中断标志
			HAL_UART_DMAStop(&huart3);//停止DMA接收
			temp  = __HAL_DMA_GET_COUNTER(&hdma_usart3_rx);//获取DMA当前还有多少未填充
			Rx_len_Huart3 =  BUFFERSIZE - temp; //计算串口接收到的数据个数
			                    
              /*************************************************************************/
                //接收数据处理
				for(sum=0,i=0;i<(ReceiveBuff_Huart3[3]+4);i++)//rgb_data[3]=15
				sum+=ReceiveBuff_Huart3[i];
				if(sum==ReceiveBuff_Huart3[i])//校验和判断
				{
					 DATA[0]=(ReceiveBuff_Huart3[4]<<8)  | ReceiveBuff_Huart3[5];
					 DATA[1]=(ReceiveBuff_Huart3[6]<<8)  | ReceiveBuff_Huart3[7];
					 DATA[2]=(ReceiveBuff_Huart3[8]<<8)  | ReceiveBuff_Huart3[9];
					 DATA[3]=(ReceiveBuff_Huart3[10]<<8) | ReceiveBuff_Huart3[11];
					 DATA[4]=(ReceiveBuff_Huart3[12]<<8) | ReceiveBuff_Huart3[13];
					 DATA[5]=(ReceiveBuff_Huart3[14]<<8) | ReceiveBuff_Huart3[15];
					 DATA[6]=(ReceiveBuff_Huart3[16]<<8) | ReceiveBuff_Huart3[17];
					 YAW= (float)((uint16_t)DATA[0])/100;
					 ROLL=(float)DATA[1]/100;
					 PITCH=  (float)(DATA[2])/100;
					 Q4[0]= (float)DATA[3]/10000;
					 Q4[1]= (float)DATA[4]/10000;
					 Q4[2]= (float)DATA[5]/10000;
					 Q4[3]= (float)DATA[6]/10000;
				}	
              /*************************************************************************/	
            //重新开启下一次接收
			Rx_len_Huart3=0;//接收数据长度清零
			HAL_UART_Receive_DMA(&huart3,ReceiveBuff_Huart3,BUFFERSIZE);//开启下一次接收
		}	
	}
  /* USER CODE END USART3_IRQn 1 */
}

三、启动串口DMA中断使能

在主函数中初始化

//串口三
	__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);//使能串口3 IDLE中断 
	/*第二个参数目前为数组 如果为变量需要加取地址符*/
	HAL_UART_Receive_DMA(&huart3,ReceiveBuff_Huart3,BUFFERSIZE);//使能接收 

总结

获取从串口IMU模块发送的数据,使用DMA中断,并在接收中断中进行数据处理

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值