【STM32 通用】基于HAL库的串口DMA空闲中断接收+串口DMA发送

1. CubeMx配置

1.1 串口常规配置

image
image

1.2 串口DMA配置

image

1.3 打开串口中断

image

2. 串口空闲中断DMA接收-程序

2.1 串口初始化编写

void usart_rx_init(void)
{
    /* 打开串口DMA空闲中断接收 */
    HAL_UARTEx_ReceiveToIdle_DMA(&huart1, usart1_rx_DMA_buffer, sizeof(usart1_rx_DMA_buffer));  
    /* 关闭串口半传输中断 */
    __HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT);  
}

2.2 关键程序编写

1、先外部定义串口接收和发送DMA结构体(官方配置并没有外部定义)

extern DMA_HandleTypeDef hdma_usart1_rx;
extern DMA_HandleTypeDef hdma_usart1_tx;

2、定义一个接收数组一个发送数组和一个转存数组

#define USART_LEN 20
uint8_t usart1_rx_DMA_buffer[USART_LEN];
uint8_t usart1_tx_DMA_buffer[USART_LEN];
uint8_t Rx[USART_LEN];

3、串口空闲中断(事件)回调函数编写

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	if(huart->Instance == USART1) {
        /* 转存数据 */
		for(uint16_t i = 0; i < USART_LEN; i++) {
			Rx[i] = usart1_rx_DMA_buffer[i];
		}
        /* 将接收到的数据发送回去 */
		HAL_UART_Transmit_DMA(&huart1, Rx, sizeof(Rx));
		/* 清除缓冲数据(重要!) */
		memset(usart1_rx_DMA_buffer, 0, sizeof(usart1_rx_DMA_buffer));
        /* 打开串口DMA空闲中断接收 */
		HAL_UARTEx_ReceiveToIdle_DMA(&huart1, usart1_rx_DMA_buffer, sizeof(usart1_rx_DMA_buffer));
        /* 关闭串口半传输中断 */
		__HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT);
	}
}

4、LCD显示串口接收数据

char text[20];
void lcd_show(void)
{
	sprintf(text, "Rx:%c%c%c%c%c%c%c%c%c%c%c%c",Rx[0],Rx[1],Rx[2],Rx[3],Rx[4],Rx[5],Rx[6],Rx[7],Rx[8],Rx[9],Rx[10],Rx[11]);
	LCD_DisplayStringLine(Line2, (uint8_t*)text);
}

3. 现象

3.1 串口调试助手显示

image

3.2 LCD显示

image

博客导航

博客导航

posted @ 2025-04-06 02:29  膝盖中箭卫兵  阅读(3264)  评论(0)    收藏  举报
ORCID iD icon https://orcid.org/0000-0001-5102-772X