HAL_UART_Receive_IT 사용 시 주의점

2019. 6. 29. 23:13임베디드/32F429IDISCOVERY

UART 수신 인터럽트를 사용하기 위해선 반드시 HAL_UART_Receive_IT 함수를 사용해야만 한다

결국 수신이 들어간다면 USARTx_IRQHandler를 호출하게 될 것이고, 또 안에서는 Callback 함수를 호출하게 된다

 

그런데 주의할 점은 Callback 함수는 HAL_UART_Receive_IT의 세 번째인자인 size 바이트만 수신해야만 호출된다. 즉, 한 바이트씩 들어갈 때마다 USARTx_IRQHandler는 호출이 되지만 실행되어야할 Callback 함수까지는 이어지지 못한다

 

예) 10바이트 버퍼를 잡고, Callback에서는 PG13을 toggle하고, IRQ(한 바이트 수신)에서는 PG14를 toggle하는 소스코드

 

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_13);
HAL_UART_Receive_IT(&huart1, rxbuf, 10);
}

 

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */

  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
  HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_14);
  /* USER CODE END USART1_IRQn 1 */
}

 

정리: https://cafe.naver.com/stm32study/1240