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

CubeMx配置

串口常规配置


串口DMA配置

打开串口中断

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

串口初始化编写

点击查看代码
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);  
}

关键程序编写

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);
}

现象

串口调试助手显示

LCD显示

博客导航

博客导航

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