/// MCU · 펌웨어
UART 보레이트 오차 계산기
UART 는 클럭 선이 없어서 양쪽이 같은 속도로 비트를 센다고 믿고 통신한다. MCU 는 자기 클럭을 정수로 나눠 보레이트를 만들기 때문에 정확히 맞지 않는 경우가 많다. 그 오차가 얼마인지, 괜찮은지 본다.
STM32: 해당 USART 의 APB 클럭
실제 보레이트 · 오차
-
푸는 순서
이 클럭에서 자주 쓰는 보레이트 전부
| 보레이트 | 분주값 | 실제 | 오차 | 판단 |
|---|
공식과 근거
STM32 (16배): BRR = 반올림(fck / baud) · 실제 = fck / BRR
STM32 (8배): USARTDIV = 반올림(2 × fck / baud), BRR 아래 4비트 = USARTDIV[3:0] ≫ 1 · 실제 = 2 × fck / USARTDIV
AVR: UBRR = 반올림(fosc / (16 × baud)) − 1 · 실제 = fosc / (16 × (UBRR + 1)) (U2X=1 이면 16 대신 8)
오차 % = (실제 − 목표) / 목표 × 100
근거: STM32 레퍼런스 매뉴얼 USART 장(보레이트 생성 · 수신기 허용 오차 표), ATmega328P 데이터시트 USART 장(보레이트 설정 표).
어디까지 괜찮나
받는 쪽이 견딜 수 있는 어긋남은 제조사 매뉴얼에 「수신기 허용 오차」로 나오고, 설정에 따라 대략 3~4% 수준이다. 이건 보내는 쪽과 받는 쪽 오차를 합친 값이라 한쪽 MCU 만 볼 때는 넉넉히 잡는다.
| 한쪽 오차 | 판단 |
|---|---|
| ±1% 안쪽 | 안전 — 상대가 조금 틀어져도 버틴다 |
| ±1~2% | 대부분 되지만 상대 쪽 오차 · 케이블 · 온도에 따라 가끔 깨질 수 있다 |
| ±2% 넘음 | 위험 — 클럭 · 보레이트 조합을 바꾼다 |
흔한 실수
RC 내부 발진기로 높은 보레이트 — 내부 발진기는 온도 · 전압에 따라 1~2% 쯤 흔들린다. 계산 오차가 0% 여도 실제로는 틀어진다. 높은 보레이트 · 긴 통신이면 크리스털을 쓴다.
16 MHz 아두이노에서 115200 — U2X=0 이면 오차가 약 −3.5% 로 꽤 크다(아두이노 기본 라이브러리는 U2X=1 을 써서 +2.1%). 그래서 같은 보드라도 57600 이나 250000 이 더 깨끗한 경우가 있다.
클럭을 바꾸고 BRR 은 그대로 — 저전력 모드에서 클럭을 낮추거나 PLL 설정을 바꾸면 보레이트도 함께 바뀐다. 클럭을 바꾸는 코드 옆에서 UART 초기화를 다시 한다.
자주 묻는 것
왜 크리스털이 11.0592 MHz 같은 이상한 값인가
11.0592 MHz · 14.7456 MHz · 18.432 MHz 는 9600 · 115200 같은 표준 보레이트로 딱 나누어떨어지는 값이라 오차가 0% 가 된다. 표에 넣어 보면 확인할 수 있다.
오버샘플링 8배는 언제 쓰나
클럭에 비해 보레이트가 아주 높을 때(예: 수 Mbps) 쓴다. 더 높은 속도를 낼 수 있는 대신 잡음과 클럭 어긋남에 덜 너그럽다.