FirmGod

UART 보율 계산기

목표 보율에 맞는 UART 분주값과 실제 보율, 오차를 계산합니다. 정확히 떨어지는 클럭 주파수와 레지스터 값도 함께 보여 줍니다.

The common case, including 16550-compatible parts. The divisor is a plain integer.

코어 클럭이 아니라 UART에 들어가는 클럭입니다.

클럭 프리셋:
분주값9f_clk / (16 × 9)
실제 보율111,111.1요청 115,200
오차-3.55%
비트 시간9.00 µs8N1 프레임: 90.0 µs

오차가 너무 큽니다. 상대도 정확하지 않다면 프레이밍 오류가 납니다.

레지스터 값

Divisor9baud = f_clk / (16 × 9)
DLL / DLM0x09 / 0x00Low and high divisor latch, for 16550-style parts

나누어떨어지는 클럭

오차 없이 115,200 baud에 도달합니다. 어중간해 보이는 주파수의 크리스털을 파는 이유가 바로 이것입니다 — 11.0592 MHz는 115200 × 96입니다.

16 MHz에서의 모든 표준 속도

행을 누르면 목표로 설정됩니다. 레지스터가 낼 수 없는 속도는 따로 표시됩니다.

보율분주값실제오차
1,2008331,200.5+0.04%
2,4004172,398.1-0.08%
4,8002084,807.7+0.16%
9,6001049,615.4+0.16%
19,2005219,230.8+0.16%
38,4002638,461.5+0.16%
57,6001758,823.5+2.12%
115,2009111,111.1-3.55%
230,4004250,000+8.51%
460,8002500,000+8.51%
921,60011,000,000+8.51%
1,000,00011,000,000정확
2,000,00011,000,000-50.00%
3,000,00011,000,000-66.67%

UART에는 클럭 선이 없습니다

SPI나 I²C와 달리 UART는 클럭을 함께 보내지 않습니다. 양쪽이 각자의 클럭으로 같은 속도를 만들어 내야 하고, 동기를 맞출 기회는 프레임마다 시작 비트 한 번뿐입니다.

그래서 보율이 조금 어긋나면 프레임이 진행되는 동안 오차가 누적됩니다. 앞쪽 비트는 제대로 읽히다가 뒤쪽에서 어긋나기 시작하고, 증상은 글자가 통째로 깨지는 것이 아니라 가끔씩 한 글자만 이상해지는 형태로 나타납니다.

얼마나 어긋나도 되나

8N1 프레임은 시작 비트 1 + 데이터 8 + 정지 1로 10비트입니다. 마지막 비트를 샘플링하는 시점까지 누적된 오차가 반 비트를 넘으면 잘못 읽습니다. 산술적으로는 5%지만 샘플링 위치와 노이즈를 감안해 양쪽 합쳐 2% 이하를 권합니다.

중요한 것은 그 예산이 두 장치가 나눠 쓰는 값이라는 점입니다. 상대가 USB-시리얼 변환기처럼 정확하다면 이쪽이 2%를 다 써도 되지만, 양쪽 다 세라믹 레조네이터라면 각자 1% 안에 들어야 합니다.

11.0592MHz라는 이상한 숫자

8비트 마이크로컨트롤러 회로도에서 자주 보이는 값입니다. 딱 떨어지는 12MHz나 16MHz를 두고 왜 이런 숫자를 쓰는지 의아하지만, 이유는 하나입니다 — 흔한 보율들로 정확히 나누어떨어집니다.

16MHz에서 115200 보율을 만들면 오차가 남습니다. 11.0592MHz에서는 0입니다. 회로를 설계하는 단계라면 클럭을 고르는 것만으로 이후의 보율 고민이 사라집니다. 이 계산기가 오차 0인 클럭 후보를 따로 보여 주는 이유입니다.

오버샘플링

수신기는 한 비트를 여러 번 샘플링해 다수결로 값을 정합니다. 기본은 16배이고, 비트의 가운데 세 번을 읽어 판단하는 부품이 많습니다.

8배로 낮추면 같은 클럭에서 두 배 빠른 보율을 낼 수 있습니다. 대신 샘플링 위치의 여유가 절반으로 줄어 허용 오차도 좁아지고 노이즈에 약해집니다. 속도가 꼭 필요한 경우가 아니면 16을 유지하세요.

소수 분주

정수로만 나누면 만들 수 있는 보율이 듬성듬성해집니다. 그래서 STM32 계열은 분주값을 정수부와 소수부로 나눠 저장합니다. 소수부가 4비트면 1/16 단위로 조절할 수 있어 오차가 크게 줄어듭니다.

부품마다 소수부 비트 수와 레지스터 배치가 다릅니다. 이 계산기는 선택한 계열의 규칙으로 값을 내므로, 다른 부품에 그대로 옮겨 쓰면 맞지 않습니다.

보율이 맞는데도 안 될 때

오차가 0인데 통신이 안 된다면 다른 곳을 보세요. 패리티와 정지 비트 설정, TX와 RX가 서로 바뀌었는지, 레벨이 맞는지 — 3.3V 장치에 RS-232 레벨을 물리면 아무것도 통하지 않습니다.

타이머 분주를 다루고 있다면 타이머 프리스케일러 계산기가 같은 방식으로 후보를 보여 줍니다.

자주 묻는 질문

보율을 맞췄는데 글자가 깨집니다.

오차를 먼저 보세요. UART는 클럭을 공유하지 않고 시작 비트에서만 동기를 맞추므로, 한 프레임(보통 10비트)이 끝날 때까지 누적된 오차가 반 비트를 넘으면 깨집니다. 양쪽 오차의 합이 2%를 넘으면 위험하고, 3%를 넘으면 거의 확실히 실패합니다. 한쪽이 정확하면 다른 쪽이 조금 더 여유를 가질 수 있습니다.

오차는 몇 퍼센트까지 괜찮은가요?

양쪽 합쳐 2% 이하를 권합니다. 10비트 프레임에서 마지막 비트를 샘플링할 때까지 누적되는 오차가 반 비트, 즉 5%를 넘으면 안 되는데, 샘플링 위치의 여유와 노이즈를 감안해 절반 이하로 잡는 것이 일반적입니다. USB-시리얼 변환기처럼 상대가 정확한 경우라면 2%까지 써도 대개 동작합니다.

오차가 0인 조합을 찾으려면?

클럭을 바꾸는 것이 가장 확실합니다. 11.0592MHz 같은 어중간한 수정 발진기가 널리 쓰이는 이유가 그것입니다 — 이 값은 흔한 보율들로 정확히 나누어떨어집니다. 이 계산기는 목표 보율을 오차 없이 만드는 클럭 후보를 함께 보여 줍니다. 회로를 설계하는 단계라면 여기서 고르는 편이 나중의 고민을 없앱니다.

오버샘플링 8과 16이 무엇이 다른가요?

한 비트를 몇 번 샘플링하는지입니다. 16이 기본이고 노이즈에 강합니다. 8로 낮추면 같은 클럭에서 두 배 빠른 보율을 낼 수 있지만 샘플링 위치의 여유가 줄어 오차 허용치가 좁아집니다. 고속이 꼭 필요한 경우가 아니면 16을 쓰세요.

분주값에 소수 부분이 있는 이유는?

STM32 같은 부품은 정수부와 소수부를 나눠 저장해 더 촘촘한 보율을 만듭니다. 소수부는 보통 4비트라 1/16 단위입니다. 이 덕분에 정수 분주만으로는 못 맞추는 보율도 오차를 크게 줄일 수 있습니다. 부품마다 소수부 비트 수가 달라 이 계산기는 선택한 계열의 규칙을 따릅니다.