Скорость UART задаёт делитель частоты тактирования. Он целый, поэтому получить ровно 9600 или 115 200 бит/с удаётся не на любой частоте: реальная скорость отличается от заданной на долю процента или на несколько процентов. Если ошибка больше 2–3 %, приёмник начинает ошибаться в последних битах кадра. Калькулятор считает значение регистра для трёх распространённых семейств, фактическую скорость и ошибку и строит таблицу для всех стандартных скоростей.
Формулы
AVR (ATmega, ATtiny с USART). Регистр UBRR — 12 бит, 0…4095. В обычном режиме приёмник делает 16 выборок на бит, в режиме двойной скорости (U2X = 1) — 8:
Результат округляют до целого, а фактическая скорость равна fOSC / (16 · (UBRR + 1)) или fOSC / (8 · (UBRR + 1)).
STM32 (USART). Делитель USARTDIV считается от частоты шины, к которой подключён USART (PCLK), а не от системной частоты:
При OVER8 = 0 в регистр BRR записывают USARTDIV целиком. При OVER8 = 1 младшие 4 бита сдвигают вправо на один разряд, а бит 3 оставляют нулевым. USARTDIV не может быть меньше 16, поэтому максимальная скорость — fCK / 16 или fCK / 8. В семействах F1 и F4 тот же делитель записывается в BRR как целая и дробная части — значение регистра получается таким же.
Классический 8051 (12 тактов на машинный цикл: AT89S52, AT89C51 и аналоги). Скорость задаёт таймер 1 в режиме 2 с автоперезагрузкой из TH1:
Быстрые клоны с одним тактом на цикл (STC, CH55x, EFM8 и другие) считают иначе: смотрите их даташиты.
Ошибка во всех случаях — относительная разница фактической и заданной скорости: (BAUDфакт / BAUD − 1) · 100 %.
Пример: 115 200 бит/с на AVR с кварцем 16 МГц
| Режим | UBRR | Фактическая скорость | Ошибка |
|---|---|---|---|
| U2X = 0 | 16 000 000 / (16 · 115 200) − 1 = 7,68 → 8 | 111 111 бит/с | −3,5 % |
| U2X = 1 | 16 000 000 / (8 · 115 200) − 1 = 16,36 → 16 | 117 647 бит/с | +2,1 % |
В обычном режиме ошибка −3,5 % — связь работать не будет. Режим двойной скорости даёт +2,1 %: обычно работает, но запаса почти нет. Те же числа приведены в таблице 20-7 даташита ATmega328P. Плата Arduino Uno с кварцем 16 МГц включает U2X автоматически, поэтому 115 200 бит/с на ней работает — с ошибкой 2,1 %.
Какая ошибка допустима
Приёмник UART заново синхронизируется по фронту каждого старт-бита, а дальше отсчитывает биты по своим часам. Расхождение частот копится до середины стоп-бита — через 9,5 бита для кадра 8N1. По оценке Maxim AN2141 вся линия выдерживает около ±3,3 % расхождения в нормальных условиях и около ±2 % на длинном кабеле с затянутыми фронтами. Microchip для AVR рекомендует держать ошибку каждой стороны в пределах ±2 % (8 бит данных, обычный режим) и ±1,5 % в режиме двойной скорости.
Калькулятор оценивает ошибку одной стороны: до ±2 % — надёжно, от 2 до 3,3 % — только с точным партнёром, больше — связь будет сбоить. Подробнее о том, как приёмник считывает биты, — в статье RS-232.
Кварцы для UART
Частоты, кратные 1,8432 МГц (это 16 × 115 200 Гц), делятся на все стандартные скорости без остатка:
| Кварц | Чем удобен |
|---|---|
| 1,8432 МГц | классический тактовый генератор UART |
| 7,3728 МГц | 115 200 бит/с без ошибки при U2X = 0 |
| 11,0592 МГц | стандарт для 8051: 9600 бит/с при TH1 = 0xFD |
| 14,7456 МГц | AVR до 230 400 бит/с без ошибки |
| 18,432 МГц | AVR с частотой до 20 МГц: 115 200 и 230 400 бит/с без ошибки |
Если кварц уже выбран под другие задачи — 8, 16 или 20 МГц, — выбирайте скорость по таблице калькулятора. Например, на 16 МГц скорости 250 000, 500 000 и 1 000 000 бит/с получаются точно, а 9600, 19 200 и 38 400 бит/с — с ошибкой всего 0,2 %.
Типичные ошибки
- Частота STM32 взята не та. USART тактируется от шины APB, а её частота может быть вдвое-вчетверо ниже системной. Смотрите настройку делителей шин в CubeMX или в регистрах RCC.
- Забыт делитель тактовой частоты AVR. Новые ATmega и ATtiny по умолчанию запускаются с фьюзом CKDIV8: частота 8 МГц превращается в 1 МГц, и вся связь «сыплет» мусором.
- Скорость на ПК и в микроконтроллере совпадает, но связи нет. Проверьте формат кадра (8N1, чётность, число стоп-бит) и уровни: выход UART микроконтроллера нельзя подключать прямо к COM-порту с уровнями RS-232.
- Внутренний RC-генератор вместо кварца. Без калибровки его точность может быть хуже ±2 %, и скорость «плывёт» с температурой.
Частые вопросы
Почему на AVR с кварцем 16 МГц не работает 115 200 бит/с?
В обычном режиме (U2X = 0) ближайшее значение UBRR = 8 даёт 111 111 бит/с — ошибка −3,5 %, это за пределом допуска. Включите режим двойной скорости U2X = 1: UBRR = 16 даёт 117 647 бит/с, ошибка +2,1 % — на грани, но обычно работает. Надёжнее взять кварц 14,7456 или 18,432 МГц: на них ошибка равна нулю.
Какая ошибка скорости UART допустима?
Microchip рекомендует не больше ±2 % на каждой стороне для кадра 8N1 в обычном режиме AVR. Вся линия выдерживает расхождение частот около ±3,3 % (Maxim AN2141): приёмник подстраивается по старт-биту, и ошибка копится только до середины стоп-бита. Если одна сторона уже ошибается на 3 %, второй почти не остаётся запаса.
Что дают режимы U2X, OVER8 и SMOD?
U2X у AVR и OVER8 у STM32 переключают приёмник с 16 на 8 выборок на бит: максимальная скорость удваивается, а у AVR вдвое мельче становится шаг подстройки скорости. Цена — меньший запас по ошибке. SMOD у 8051 просто удваивает скорость при том же значении TH1.
Почему для UART часто ставят кварц 11,0592 МГц?
Эта частота кратна 1,8432 МГц = 16 × 115 200 Гц, поэтому делится на все стандартные скорости без остатка. Для 8051 с делителем 384 она даёт TH1 = 0xFD и ровно 9600 бит/с, а кварц 12 МГц — ошибку +8,5 %.
Можно ли тактировать UART от внутреннего RC-генератора?
Зависит от его точности. У ATmega328P заводская калибровка внутреннего генератора 8 МГц даёт ±10 % при 3 В и 25 °C — для UART этого мало. После пользовательской калибровки точность ±1 %, и связь работает, если частоту не уводит температура. У многих STM32 внутренний генератор точнее, но для длинных кадров и высоких скоростей кварц всё равно надёжнее.
Источники
- Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B), раздел 20 USART0 — формулы UBRR, таблицы 20-2…20-7, допуск приёмника
- STMicroelectronics. RM0360: STM32F030x4/x6/x8/xC and STM32F070x6/xB reference manual, USART baud rate generation — USARTDIV, OVER8, упаковка BRR
- Atmel. AT89S52 8-bit Microcontroller with 8K Bytes In-System Programmable Flash (doc1919) — скорость последовательного порта от таймера 1 в режиме 2
- Analog Devices (Maxim). Determining Clock Accuracy Requirements for UART Communications (AN2141) — допустимое расхождение частот приёмника и передатчика
Обновлено . Нашли ошибку в расчёте? Напишите нам.