串口中断的处理
1、查看是否是空闲中断
2、清除中断标志
3、关DMA,计算接收长度
4、开DMA接收

void USART1_IRQHandler(void)
{

	rt_interrupt_enter();		//在中断中一定要调用这对函数,进入中断

	if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) != RT_FALSE)		//获取IDLE标志位 被置1
	{
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);	// 清除串口1的IDLE标志位
		HAL_UART_DMAStop(&huart1);					// 停止DMA传输
		temp  =  __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);	// 获取DMA中未传输的数据个数   
		DMA_USART1.COUNT = RX_SIZE - temp;		// 总计数减去未传输的数据个数,得到已经接收的数据个数
		rt_sem_release(usart1_sem);	//释放信号量,代表串口1接收到数据
	}
	HAL_UART_Receive_DMA(&huart1, (rt_uint8_t *)DMA_USART1.RX_Buffer, RX_SIZE);	//重新打开DMA接收
	HAL_UART_IRQHandler(&huart1);
	rt_interrupt_leave();		//在中断中一定要调用这对函数,离开中断
}

初始化时
1、初始化UART,DMA,打开nvic
2、uart_init最后打开空闲中断,打开DMA接收

__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //使能空闲中断
	HAL_UART_Receive_DMA(&huart1, (rt_uint8_t *)DMA_USART1.RX_Buffer, RX_SIZE);	  //开启DMA接收中断,指定接收的数组和数组大小