天天看點

STM32HAL庫 序列槽空閑中斷+DMA實作序列槽接收不定長資料

首先,使用CubeMX配置STM32

STM32HAL庫 序列槽空閑中斷+DMA實作序列槽接收不定長資料

序列槽二用來接收資料,序列槽一列印輸出,使能中斷和DMA。

STM32HAL庫 序列槽空閑中斷+DMA實作序列槽接收不定長資料
STM32HAL庫 序列槽空閑中斷+DMA實作序列槽接收不定長資料

在序列槽二的初始化裡添加空閑中斷的使能:

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

繼續閱讀