본문 바로가기
임베디드 관련/STM32

여러 UART, DMA 기반 센서 수신 구조로 문제 해결

by minhyeok.lee 2025. 5. 16.
반응형

여러 UART 수신 문제 해결: Interrupt에서 DMA 기반 센서 수신 구조로 변경


📌 문제 개요

  • 3개의 센서에서 각기 다른 UART 포트를 통해 거리 데이터를 수신
  • 각 센서에서 전송되는 데이터는 고정 크기이며, 패킷 단위로 수신 필요
  • 초기에는 UART 인터럽트 기반 수신을 구현했지만, 다음과 같은 문제 발생
    • UART 인터럽트 방식으로는 3개 패킷이 모두 수신되지 않거나,
      1~2개만 수신되는 경우가 빈번
    • 패킷 수신 시점과 구조체 조립 간의 타이밍 오차, 인터럽트 지연 문제

✅ 개선 방식: DMA 기반 UART 수신 전환

  • 각 UART 포트에 대해 HAL_UART_Receive_DMA()를 사용해 지정된 크기만큼 패킷 단위 수신 설정
  • DMA 수신 완료 시 HAL_UART_RxCpltCallback()에서 각 패킷을 처리

장점

  • 타이밍 이슈 없이 3개 센서 모두 안정적으로 수신 가능
  • CPU 부하 감소, 정확한 패킷 단위 수신 보장

⚠️ 문제 발생: 링버퍼 수집 시 DMA 버퍼 오염

  • UART 수신 구조체 혹은 DMA 버퍼에 잘못된 데이터가 들어오면, 이후에도 계속 오류 상태 유지
  • 잘못된 start 바이트 또는 checksum 불일치가 반복적으로 로그 출력됨
  • [W][Main] [Snsor1] Invalid packet: start=0xEF, checksum=00 ≠ 00

🔧 해결 방법: DMA 수신 버퍼 초기화

  • 오염된 패킷이 감지되면 해당 UART 수신을 중단하고 재시작하여 버퍼를 초기화함
// 잘못된 패킷 수신 시
HAL_UART_AbortReceive(huart);  // DMA 수신 중단
HAL_UART_Receive_DMA(huart, (uint8_t*)pckt, sizeof(uwb_pckt));  // 재시작
  • 이후 정상 수신 루프로 복구되어 오염이 반복되지 않음

✅ 결론

항목 내용
UART 방식 기존 인터럽트 방식 → DMA 방식으로 전환
수신 안정성 DMA 방식으로 3개 센서 모두 안정 수신
버그 원인 DMA 링버퍼 오염 시 재수신 실패 반복
해결 방법 HAL_UART_AbortReceive() + HAL_UART_Receive_DMA() 재설정
최종 결과 모든 UWB 센서가 신뢰성 있게 데이터 전송됨
반응형

댓글