一、串口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】