UART 통신 글자 깨짐 원인: 보드레이트 오차와 클록 설정 완벽 해결

임베디드 펌웨어를 개발하거나 산업용 컨트롤러와 통신을 연동할 때, 시리얼 터미널 창에 알 수 없는 특수문자가 연속해서 출력되는 현상은 엔지니어를 가장 난감하게 만드는 하드웨어 디버깅 병목 중 하나입니다. 대부분의 경우 단순한 케이블 결선 불량이나 터미널 프로그램의 설정 오류로 치부하기 쉽지만, 심층적인 UART 통신 글자 깨짐 원인을 추적해보면 마이크로컨트롤러(MCU) 내부 클록 트리 설정 불일치와 보드레이트 분주 레지스터(BRR)의 누적 양자화 오차라는 구조적 결함에 도달하게 됩니다.

비동기 직렬 통신인 UART는 별도의 동기화 클록 라인 없이 송수신 장치가 각자 약속된 샘플링 주기에 의존하여 비트 스트림을 해석합니다. 따라서 내부 발진기(RC Oscillator)의 온도 드리프트나 시스템 클록 주파수와 타깃 보드레이트 간의 정수 분주비 불일치로 인해 허용 누적 오차 한계를 벗어나면, 프레임 후반부 스톱 비트 지점에서 심각한 프레이밍 에러(Framing Error)가 발생해 데이터 프레임 전체가 깨지는 파국을 맞이하게 됩니다.

UART 통신 글자 깨짐 원인 및 클록 드리프트 프레이밍 에러 분석 다이어그램

UART 통신 글자 깨짐 원인: 비동기 샘플링 메커니즘과 누적 오차의 한계

UART 프로토콜은 시작 비트(Start Bit)의 하강 에지(Falling Edge)를 감지하는 순간 내부 보드레이트 제너레이터의 카운터를 리셋하고, 통상 비트 주기의 8배 또는 16배에 달하는 오버샘플링(Oversampling) 클록을 기동합니다. 16배 오버샘플링 기준 8번째, 9번째, 10번째 클록 틱(Tick)에서 3회 다수결 원리로 비트 레벨을 판정하지만, 송신 측과 수신 측의 클록 주파수가 완벽히 일치하지 않으면 비트가 진행될수록 샘플링 시점이 비트 중앙에서 서서히 가장자리로 밀려납니다.

데이터 비트가 8비트이고 패리티와 스톱 비트를 포함하여 1프레임이 10비트로 구성될 때, 1비트마다 발생하는 $\Delta t$의 타이밍 편차는 10번째 비트인 스톱 비트에 도달했을 때 $10 \times \Delta t$로 누적됩니다. 이 누적 지연이 비트 폭의 절반(±50%)을 초과하여 다음 비트 경계선을 침범하면 수신기는 논리 High 상태여야 할 스톱 비트를 인식하지 못하고 하드웨어 프레이밍 에러 플래그(FE)를 세트하며 글자를 깨진 아스키코드로 방출합니다.

"UART 비동기 통신 시스템의 전체 허용 주파수 편차는 송수신 장치 간의 최대 누적 오차를 기준으로 엄격히 제한됩니다. 8비트 데이터, 무패리티, 1 스톱 비트(8-N-1) 프레임 구조에서 안정적인 통신을 보장하기 위한 송신기와 수신기 간의 총 보드레이트 오차 상한선은 ±4.5%이며, 각 장치 단독 기준으로는 통상 ±2.0% 이내, 산업용 신뢰성 기준으로는 ±1.5% 미만으로 클록 정밀도를 유지해야 합니다."
— Texas Instruments Application Report (SPRA633): UART Frequency Error Tolerance Analysis

TI의 기술 분석 보고서에서 명시하듯, 전체 루프의 오차 한계치가 4.5%에 불과하므로 송신 MCU에서 2.5%의 보드레이트 오차가 발생하고 수신 PC의 USB-to-UART 브릿지 칩셋에서 2.2%의 오차가 더해지는 순간 총 오차율은 4.7%에 도달하여 통신 링크는 완전히 붕괴됩니다.

UART 16배 오버샘플링 타이밍 마진 및 스톱 비트 샘플링 왜곡 다이어그램

내부 RC 발진기 vs 외부 크리스털: 클록 소스별 물리적 안정성 비교

펌웨어 엔지니어들이 보드 초기화 단계에서 가장 흔히 저지르는 실수는 외부 크리스털(HSE) 발진 회로를 생략하고 MCU 내부 고속 RC 발진기(HSI)를 시스템 메인 클록 소스로 사용하는 것입니다. 실리콘 내부 RC 발진기는 주변 온도와 전원 전압 변동에 극도로 취약하여 115200 bps 이상의 고속 전송에서 치명적인 타이밍 결함을 초래합니다.

반면 수정 진동자(Quartz Crystal)는 압전 효과를 바탕으로 수십 ppm 수준의 극단적인 주파수 안정도를 제공하므로, 보드레이트 분주기가 완벽한 정수비로 떨어지지 않더라도 오차의 절댓값이 동작 환경에 의해 왜곡되지 않습니다. 클록 소스 및 전송 속도에 따른 성능 지표를 대조하면 다음과 같습니다.

클록 소스 및 아키텍처초기 주파수 공차온도 드리프트 (-40°C~+85°C)115200 bps 통신 적합성
내부 고속 RC 발진기 (HSI)±1.0% (상온 25°C 공장 출하 시)±2.5% ~ ±5.0% 급격한 드리프트매우 부적합 (고온 발열 시 글자 깨짐)
외부 세라믹 레조네이터±0.5% (약 5,000 ppm)±0.3% 이내 변동조건부 가능 (저속 9600~38400 bps 권장)
표준 수정 진동자 (HSE Crystal)±10 ppm ~ ±30 ppm (0.003%)±20 ppm 이내 극저변동완벽 지원 (최대 921600 bps 고신뢰성)
온도 보상형 발진기 (TCXO)±0.5 ppm ~ ±2 ppm전 대역 무시 가능한 수준초정밀 계측/방산 전용 (원가 상승)

위 비교표에서 보듯, 내부 RC 발진기는 제품 출하 테스트 룸(25°C)에서는 정상 동작하더라도 제어반 내부 온도가 60°C 이상으로 상승하는 현장에서는 주파수가 최대 5%까지 틀어져 통신이 두절됩니다. 따라서 상용 통신 제품에서는 반드시 외부 크리스털 기반 클록 공급 체계를 구축해야 합니다.

STM32 USART 보드레이트 분주 레지스터 BRR 구조 및 소수점 보정 다이어그램

MCU 보드레이트 레지스터(BRR) 분주비 계산 및 분수 보정 원리

STMicroelectronics의 STM32 레퍼런스 매뉴얼(RM0090)에 명시된 보드레이트 발생기 구조를 살펴보면, 주변장치 버스 클록($f_{PCLK}$)을 타깃 보드레이트로 분주하는 공식은 다음과 같이 정의됩니다.

$$\text{USARTDIV} = \frac{f_{PCLK}}{8 \times (2 - \text{OVER8}) \times \text{BaudRate}}$$

여기서 OVER8 비트가 0(16배 오버샘플링)일 때 공식은 $\text{USARTDIV} = \frac{f_{PCLK}}{16 \times \text{BaudRate}}$로 정리됩니다. $\text{USARTDIV}$는 무한소수가 될 수 없으므로, MCU는 상위 12비트에 정수부(Mantissa)를, 하위 4비트에 소수부(Fraction)를 나누어 담는 16비트 레지스터 `USART_BRR`을 채택합니다.

예를 들어 APB1 버스 클록이 $f_{PCLK} = 42\text{ MHz}$인 상태에서 $115200\text{ bps}$를 설정할 때의 계산 과정은 다음과 같습니다:

  • $\text{USARTDIV} = \frac{42{,}000{,}000}{16 \times 115200} \approx 22.786458$
  • 정수부(DIV_Mantissa) = $22$ ($0\text{x}16$)
  • 소수부(DIV_Fraction) = $\text{round}(0.786458 \times 16) = \text{round}(12.583) = 13$ ($0\text{x}0\text{D}$)
  • 최종 레지스터 기입값: `USART_BRR = (22 << 4) | 13 = 0x016D`

이때 실제 하드웨어가 만들어내는 보드레이트는 $\frac{42{,}000{,}000}{16 \times (22 + \frac{13}{16})} = \frac{42{,}000{,}000}{16 \times 22.8125} \approx 115068.49\text{ bps}$가 됩니다. 이로 인해 목표치 $115200$ 대비 발생하는 이론적 오차율은 $\frac{115068.49 - 115200}{115200} \times 100 \approx -0.11\%$로 산출되어 매우 안전한 마진 내에 안착하게 됩니다.

클록 분주 경로 및 보드레이트 발생 흐름
메인 PLL 클록
→
APB 버스 프리스케일러
→
USART_BRR (Mantissa + Fraction)
→
16x 샘플링 에지 검출
* 핵심 주의: APB 프리스케일러 분주비 변경 시 USART 클록 주파수가 동반 변경되므로 시스템 클록 재구성 시 BRR 재계산 필수
임베디드 C 언어 UART 에러 핸들러 및 프레이밍 에러 텔레메트리 펌웨어 코드

실전 펌웨어 에러 핸들러 및 파이썬 오차율 검증 스크립트

통신 장애가 발생했을 때 펌웨어에서 에러 플래그를 단순히 방치하면 수신 데이터 레지스터(DR/RDR)가 잠겨 이후 수신이 영구 중단됩니다. 아래 C/C++ 코드는 STM32 USART 하드웨어 인터럽트 루틴에서 프레이밍 에러(FE), 노이즈 에러(NE), 오버런 에러(ORE)를 즉각 검출하고 플래그를 클리어하여 수신기를 정상화하는 안전 루틴입니다.

#include <stdint.h>
#include <stdbool.h>
#include "stm32f4xx.h"

volatile uint32_t g_uart_framing_err_cnt = 0;
volatile uint32_t g_uart_overrun_err_cnt = 0;

void USART1_IRQHandler(void) {
    uint32_t sr = USART1->SR;
    uint32_t dr = 0;

    // 1. 프레이밍 에러(FE) 감지: 보드레이트 불일치 시 셋업됨
    if (sr & USART_SR_FE) {
        g_uart_framing_err_cnt++;
        // SR 읽기 후 DR 읽기 시퀀스를 통해 하드웨어 FE 플래그 클리어
        dr = USART1->DR;
        (void)dr; // 컴파일러 미사용 변수 경고 억제
    }

    // 2. 오버런 에러(ORE) 감지: 이전 수신 데이터를 읽기 전 다음 데이터 인입
    if (sr & USART_SR_ORE) {
        g_uart_overrun_err_cnt++;
        dr = USART1->DR;
        (void)dr;
    }

    // 3. 정상 수신 데이터 버퍼 처리 (RXNE 플래그 확인)
    if (sr & USART_SR_RXNE) {
        uint8_t received_byte = (uint8_t)(USART1->DR & 0xFF);
        // 사용자 수신 링버퍼(Ring Buffer)로 데이터 푸시
        RingBuffer_Put(received_byte);
    }
}

위 인터럽트 루틴에서 볼 수 있듯, 프레이밍 에러가 발생하면 $SR \rightarrow DR$ 순차 읽기 시퀀스를 실행해야만 하드웨어 시프트 레지스터가 복구됩니다. 이어서 시스템 설계 시 클록 주파수와 타깃 보드레이트를 대조하여 오차율을 자동 검증하는 파이썬 엔지니어링 스크립트는 다음과 같습니다.

# Python 3: MCU 클록 및 UART 보드레이트 분주 오차율 분석기
def calculate_uart_baud_error(pclk_hz, target_baud, over8=0):
    divisor_factor = 8 * (2 - over8)
    
    # 1. 이상적 분주비 실수 연산
    usartdiv_ideal = pclk_hz / (divisor_factor * target_baud)
    mantissa = int(usartdiv_ideal)
    fraction = round((usartdiv_ideal - mantissa) * 16)
    
    # 2. 하드웨어 레지스터 반영 분주비 역연산
    if fraction >= 16:
        mantissa += 1
        fraction = 0
    actual_div = mantissa + (fraction / 16.0)
    actual_baud = pclk_hz / (divisor_factor * actual_div)
    
    # 3. 백분율 오차율 산출
    error_pct = ((actual_baud - target_baud) / target_baud) * 100.0
    
    print(f"[클록: {pclk_hz/1e6:.2f} MHz | 목표: {target_baud} bps (OVER8={over8})]")
    print(f"- 레지스터 기입값: Mantissa={mantissa} (0x{mantissa:X}), Fraction={fraction} (0x{fraction:X})")
    print(f"- 실효 생성 보드레이트: {actual_baud:.2f} bps")
    print(f"- 하드웨어 오차율: {error_pct:+.3f} %")
    
    # 판정 기준 (단독 장치 허용 마진: ±1.5% 이내)
    if abs(error_pct) > 1.5:
        print("[경고] 오차율이 ±1.5%를 초과하여 통신 깨짐 위험이 극도로 높습니다!")
    else:
        print("[통과] 허용 오차 이내로 안정적인 비동기 통신이 가능합니다.")

# 8MHz 내부 RC 클록에서 115200bps 설정 시 오차 검증
calculate_uart_baud_error(pclk_hz=8000000, target_baud=115200, over8=0)

위 파이썬 스크립트를 8MHz RC 발진기 조건으로 구동하면 $\text{USARTDIV} = 4.340$이 도출되며, 소수부 근사 오차로 인해 실효 보드레이트가 115942 bps로 생성되어 약 +0.64%의 오차가 발생함을 수치적으로 입증할 수 있습니다. 여기에 발진기 자체의 온도 편차(+2%)가 중첩되면 허용치 1.5%를 즉각 돌파하여 통신이 붕괴됩니다.

UART 통신 무결성 실무 점검 체크리스트

  • 오실로스코프 실측: 송신 TX 라인의 단일 비트 펄스 폭($1 / \text{Baud}$)을 실측하여 계산값과 오차를 대조한다 (115200 bps 기준 $8.68\mu\text{s}$).
  • 외부 HSE 우선 활성화: 통신 신뢰성이 요구되는 보드는 내부 HSI 대신 반드시 수정 진동자 회로를 장착하고 펌웨어에서 HSE 준비 완료 플래그(HSERDY)를 확인한다.
  • GND 루프 공유 확인: 보드 간 TX/RX 연결 시 상호 간의 접지(GND) 전위차가 발생하지 않도록 기준 접지선을 반드시 직결한다.
  • 패리티 비트 활성화: 노이즈가 심한 산업용 RS-485/RS-232 환경에서는 8-N-1 대신 Even Parity를 활성화하여 패리티 에러(PE)를 트래킹한다.
오실로스코프를 이용한 UART 통신 단일 비트 펄스 폭 및 슬루율 실측 계측 화면

실무 엔지니어링 FAQ

Q1. PC 터미널 프로그램에서 보드레이트를 정확히 맞췄는데도 첫 글자만 깨져서 들어옵니다.

MCU 부팅 직후 GPIO 핀이 플로팅(Floating) 상태에서 풀업 또는 UART 대체 기능(AF)으로 전환될 때 발생하는 전기적 과도 노이즈(Glitch) 때문입니다. 수신 PC의 UART 컨트롤러가 이 글리치를 시작 비트로 오인하여 엉뚱한 데이터를 수신한 것입니다. 해결을 위해 TX 라인에 $10\text{k}\Omega$ 풀업 저항을 물리적으로 배치하고, 펌웨어 초기화 루틴 끝에 5ms의 지연 시간을 둔 후 첫 바이트를 송신해야 합니다.

Q2. 16배 오버샘플링 대신 8배 오버샘플링(OVER8=1)을 활성화하면 어떤 이점이 있습니까?

MCU 주변장치 클록이 낮을 때 더 높은 보드레이트를 구현할 수 있으며 분주비 정밀도가 2배로 상승하여 양자화 오차율을 줄일 수 있습니다. 다만 비트당 샘플링 횟수가 16회에서 8회로 줄어들어 노이즈 내성과 타이밍 지터 허용 마진이 감소하므로 라인 노이즈가 없는 단거리 PCB 내부 통신에서만 사용하는 것이 원칙입니다.

Q3. RS-485 통신 변환기를 거친 후 글자 깨짐이 심해질 때 우선 점검해야 할 항목은 무엇입니까?

트랜시버의 송신 활성화(DE, Driver Enable) 핀의 해제 타이밍입니다. 마지막 바이트의 스톱 비트가 완전히 전송되기 전에 펌웨어에서 DE 핀을 Low로 내려버리면 스톱 비트가 잘려 수신 측에서 프레이밍 에러가 발생합니다. 반드시 UART 전송 완료 플래그(TC, Transmission Complete)가 셋업된 후 DE 핀을 수신 모드로 전환해야 합니다.

공식 기술 규격 및 데이터시트 레퍼런스

함께 보면 좋은 글

📌 안내
이 글은 정보 제공을 목적으로 작성되었으며, 실제 기기·환경·정책에 따라 결과가 다를 수 있습니다. 보다 정확하고 최신인 정보는 아래 공신력 있는 기관의 자료를 함께 참고하시기 바랍니다.

Similar Posts