STM32 HAL 库, 配置串口DMA接收及空闲中断

1、 使用CUBEMX 配置自动生成代码:

①添加串口的DMA 通道

②使用串口全局中断:

其他的配置就不详细说了。

生成代码后, 打开工程在串口初始化函数中添加代码:

/* USART1 init function */ void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } ------------------添加----------------------------

//使能串口空闲中断

__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE); //DMA 接收地址设置 HAL_UART_Receive_DMA(&huart1,uart1RxBuf,RX_SIZE); }

添加空闲中断处理函数:

void UART_RxIdleCallback(UART_HandleTypeDef *huart) { if(__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE)){ __HAL_UART_CLEAR_IDLEFLAG(huart); HAL_UART_DMAStop(huart); //hdma_usart2_rx.Instance->CNDTR = BUFFER_SIZE; //rxSize = RX_SIZE-hdma_usart2_rx.Instance->CNDTR; //printf("uart2 receive CNT: %d ",rxSize); printf("data:%s ",uart1RxBuf); memset(uart1RxBuf,0,sizeof(uart1RxBuf)); HAL_UART_Receive_DMA(huart,uart1RxBuf,RX_SIZE); } }

uart1RxBuf 为DMA 接收缓存数组

在 USART1_IRQHandler(void) 中调用该函数。

经验分享 程序员 微信小程序 职场和发展