[STM32] UART DMA 이슈

2023. 5. 23. 20:11개발로그/STM32

반응형

개요

STM32-NUCLEO-F401RE 기반으로 UART DMA 설정 방법을 설명 한다.

 

CubeMX 환경

CubeMX UART2 환경

 

샘플 코드 및 이슈

아래와 같이 UART로 RX 데이터를 수신하면 HAL_UARTEx_RxEventCallback이 호출되고, 해당 Callback이 UART2로 부터 발생 되었으면 ConsoleUartRxEventCallBack이라는 Custom 함수를 호출하도록 구현 하였습니다.

void ConsoleUartRxEventCallBack(uint8_t *data, uint16_t size)
{
	if( TwRingBufferFreeSpace(&CONSOLE_RX_RING_BUFF_OBJ) < size)
	{
		TRACE_WARN("Buffer Overflow. Need Flow Control");
	}
	else
	{
		TwRingBufferWrite(&CONSOLE_RX_RING_BUFF_OBJ, data, size);
	}
}

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	if(huart->Instance == USART2)
	{
		ConsoleUartRxEventCallBack((uint8_t *)DMA_RX_BUFF, Size);

		/* start the DMA again */
		HAL_UARTEx_ReceiveToIdle_DMA(&huart2, (uint8_t *) DMA_RX_BUFF, sizeof(DMA_RX_BUFF));
		__HAL_DMA_DISABLE_IT(&hdma_usart2_rx, DMA_IT_HT);
	}
}

 

이때, Serial Terminal(Putty or Teraterm)에서 Key 입력으로 Uart Data를 1byte씩 보내는 경우, HAL_UARTEx_RxEventCallback의 Size 파라미터가 1로 수신 되는게 아닌 이전 데이터까지 포함되어 증가되는 문제가 있었습니다.

 

예를 들어 

  • 1st Key 입력 시
    • HAL_UARTEx_RxEventCallback Size 값 : 1
  • 2nd Key 입력 시
    • HAL_UARTEx_RxEventCallback Size 값 : 2
  • 3rd Key 입력 시
    • HAL_UARTEx_RxEventCallback Size 값 : 3

 

해결 방법

정확히 DMA Circular Mode 사용 시, 어떤 메커니즘 때문에 HAL_UARTEx_RxEventCallback 의 Size가 초기화 되지 않는 것인지 조금 더 스터디가 필요 할거 같습니다.

 

우선은 아래와 같이 DMA Normal 모드로 설정해서 사용하니 해당 기능은 문제 없이 동작 하였으나, Burst한 데이터를 송신 했을 때 데이터 손실 없이 처리 할 수 있는지 확인이 필요 할 거 같네요.

 

 

참고 자료

https://community.st.com/s/question/0D53W00001yklkASAQ/issues-using-haluartexreceivetoidledma-and-haluartexrxeventcallback

 

Issues using HAL_UARTEx_ReceiveToIdle_DMA(...) and HAL_UARTEx_RxEventCallback(...)

 

community.st.com

 

 

반응형