一、串口DMA收发
1、串口初始化

2、定义全局变量
#define RXBUFFERSIZE  256
uint8_t rx_buffer[RXBUFFERSIZE];//接收数组
volatile uint8_t rx_len = 0; //接收到的数据长度
volatile uint8_t recv_end_flag = 0; //接收结束标志位 
 
3、开启IDLE中断以及串口DMA接收
  /* USER CODE BEGIN 2 */
	
	__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);    
	HAL_UART_Receive_DMA(&huart1,rx_buffer,RXBUFFERSIZE);	
  /* USER CODE END 2 */ 
 
 
4、stm32f4xx_it.c中补全回调函数
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 */
	uint8_t tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //获取IDLE标志位
	if((tmp_flag != RESET))//通过标志位判断接收是否结束
	{ 
		recv_end_flag = 1; //置1表明接收结束
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位
		HAL_UART_DMAStop(&huart1); 
		uint8_t temp=__HAL_DMA_GET_COUNTER(&hdma_usart1_rx);                 
		rx_len =RXBUFFERSIZE-temp; //计算出数据长度
		HAL_UART_Transmit_DMA(&huart1, rx_buffer,rx_len);//将受到的数据发送出去
		HAL_UART_Receive_DMA(&huart1,rx_buffer,RXBUFFERSIZE);//开启DMA接收,方便下一次接收数据
	}
  /* USER CODE END USART1_IRQn 1 */
}
 
 
5、串口DMA发送
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  HAL_UART_Transmit_DMA(&huart1,(uint8_t *)"Hello\r\n",sizeof("Hello\r\n"));
	  HAL_Delay(1);//等待发送完毕
	  HAL_UART_Transmit_DMA(&huart1,(uint8_t *)"World\r\n",sizeof("World\r\n"));
	  HAL_Delay(500);
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
  }
 
 
原理参见:
串口DMA知识梳理以及在Stm32的应用(HAL库)
STM32 HAL CubeMX 串口IDLE接收空闲中断+DMA
源码提供:
STM32串口接收DMA HAL
二、OLED的显示(DMA)
详见【STM32+HAL】地表最强高刷OLED显示配置【I2C】


















