提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
使用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中断,并在接收中断中进行数据处理