STM32HAL库 串口空闲中断+DMA实现串口接收不定长数据

首先,使用CubeMX配置STM32

STM32HAL库 串口空闲中断+DMA实现串口接收不定长数据_第1张图片

串口二用来接收数据,串口一打印输出,使能中断和DMA。

STM32HAL库 串口空闲中断+DMA实现串口接收不定长数据_第2张图片

在串口二的初始化里添加空闲中断的使能:

static void MX_USART2_UART_Init(void)
{

  /* USER CODE BEGIN USART2_Init 0 */

  /* USER CODE END USART2_Init 0 */

  /* USER CODE BEGIN USART2_Init 1 */

  /* USER CODE END USART2_Init 1 */
  huart2.Instance = USART2;
  huart2.Init.BaudRate = 9600;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART2_Init 2 */
	__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
  /* USER CODE END USART2_Init 2 */

}

在stm32f1xx_it.c文件下编写中断函数:

/**
  * @brief This function handles USART2 global interrupt.
  */
void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */

  /* USER CODE END USART2_IRQn 0 */
  HAL_UART_IRQHandler(&huart2);
  /* USER CODE BEGIN USART2_IRQn 1 */
	printf("Rec:%s", RxBuffer); //串口一打印输出
	__HAL_UART_CLEAR_IDLEFLAG(&huart2);//清楚串口二空闲中断的标志位

	__HAL_DMA_DISABLE(&hdma_usart2_rx); //关闭DMA
	DMA1_Channel6->CNDTR = 0xFA;  //复位DMA指针
	__HAL_DMA_ENABLE(&hdma_usart2_rx); //使能DMA
	memset(RxBuffer, 0 ,128); //清除数组

  /* USER CODE END USART2_IRQn 1 */
}

这样就ok啦 具体的我也懒得写了orz

你可能感兴趣的:(STM32工程中遇到的一些问题)