[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한 데이터를 송신 했을 때 데이터 손실 없이 처리 할 수 있는지 확인이 필요 할 거 같네요.
참고 자료
반응형
'개발로그 > STM32' 카테고리의 다른 글
[STM32]CubeIDE USE_HAL_UART_REGISTER_CALLBACK 설정 법 (0) | 2023.05.17 |
---|---|
[STM32] UART Baudrate Change 기능 구현 (0) | 2023.05.16 |
[STM32] HAL과 LL 라이브러리 차이 (0) | 2023.05.15 |