반응형
여러 UART 수신 문제 해결: Interrupt에서 DMA 기반 센서 수신 구조로 변경
📌 문제 개요
- 3개의 센서에서 각기 다른 UART 포트를 통해 거리 데이터를 수신
- 각 센서에서 전송되는 데이터는 고정 크기이며, 패킷 단위로 수신 필요
- 초기에는 UART 인터럽트 기반 수신을 구현했지만, 다음과 같은 문제 발생
- UART 인터럽트 방식으로는 3개 패킷이 모두 수신되지 않거나,
1~2개만 수신되는 경우가 빈번함 - 패킷 수신 시점과 구조체 조립 간의 타이밍 오차, 인터럽트 지연 문제
- UART 인터럽트 방식으로는 3개 패킷이 모두 수신되지 않거나,
✅ 개선 방식: 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 센서가 신뢰성 있게 데이터 전송됨 |
반응형
'임베디드 관련 > STM32' 카테고리의 다른 글
[STM32] 시간 결정성/비결정성 혹은 하드/소프트 실시간 분리 (0) | 2025.05.25 |
---|---|
[STM32] 인터럽트를 DMA로 바꾸어야 하는 경우 (0) | 2025.05.17 |
STM32 Power Mode 총 정리 (0) | 2025.05.14 |
[STM32] MacOS에서 ST-LINK V3 연결 에러 (2) | 2025.05.11 |
STM32 주변 장치 정리 (0) | 2025.05.10 |
댓글