Перейти к содержанию

Калькулятор скорости UART

Выберите микроконтроллер, частоту тактирования и скорость — калькулятор посчитает значение регистра, фактическую скорость и ошибку и покажет, какие стандартные скорости при этой частоте работают надёжно.

Исходные данные

МГц

кварцы 7,3728, 11,0592 и 14,7456 МГц дают нулевую ошибку на стандартных скоростях

бит/с

9600, 19 200, 57 600, 115 200…

Режим USART

Результат

Значение UBRR
103 (0x067)
Фактическая скорость
9 615,4 бит/с
Ошибка скорости
+0,16 %

Ошибка в пределах ±2 % — связь будет устойчивой.

Стандартные скорости при 16 МГц, U2X = 0 (×16)

Скорость, бит/сUBRRОшибка
1 200832 (0x340)+0,04 %
2 400416 (0x1A0)−0,08 %
4 800207 (0x0CF)+0,16 %
9 600103 (0x067)+0,16 %
14 40068 (0x044)+0,64 %
19 20051 (0x033)+0,16 %
38 40025 (0x019)+0,16 %
57 60016 (0x010)+2,1 %
115 2008 (0x008)−3,5 %
230 4003 (0x003)+8,5 %
250 0003 (0x003)0 %
460 8001 (0x001)+8,5 %
500 0001 (0x001)0 %
921 6000 (0x000)+8,5 %
1 000 0000 (0x000)0 %

Скорость UART задаёт делитель частоты тактирования. Он целый, поэтому получить ровно 9600 или 115 200 бит/с удаётся не на любой частоте: реальная скорость отличается от заданной на долю процента или на несколько процентов. Если ошибка больше 2–3 %, приёмник начинает ошибаться в последних битах кадра. Калькулятор считает значение регистра для трёх распространённых семейств, фактическую скорость и ошибку и строит таблицу для всех стандартных скоростей.

Формулы

AVR (ATmega, ATtiny с USART). Регистр UBRR — 12 бит, 0…4095. В обычном режиме приёмник делает 16 выборок на бит, в режиме двойной скорости (U2X = 1) — 8:

UBRR=fOSC16⋅BAUD−1(U2X=0),UBRR=fOSC8⋅BAUD−1(U2X=1).\text{UBRR} = \frac{f_\text{OSC}}{16 \cdot \text{BAUD}} - 1 \quad (\text{U2X} = 0), \qquad \text{UBRR} = \frac{f_\text{OSC}}{8 \cdot \text{BAUD}} - 1 \quad (\text{U2X} = 1).

Результат округляют до целого, а фактическая скорость равна fOSC / (16 · (UBRR + 1)) или fOSC / (8 · (UBRR + 1)).

STM32 (USART). Делитель USARTDIV считается от частоты шины, к которой подключён USART (PCLK), а не от системной частоты:

USARTDIV=fCKBAUD(OVER8=0),USARTDIV=2fCKBAUD(OVER8=1).\text{USARTDIV} = \frac{f_\text{CK}}{\text{BAUD}} \quad (\text{OVER8} = 0), \qquad \text{USARTDIV} = \frac{2 f_\text{CK}}{\text{BAUD}} \quad (\text{OVER8} = 1).

При OVER8 = 0 в регистр BRR записывают USARTDIV целиком. При OVER8 = 1 младшие 4 бита сдвигают вправо на один разряд, а бит 3 оставляют нулевым. USARTDIV не может быть меньше 16, поэтому максимальная скорость — fCK / 16 или fCK / 8. В семействах F1 и F4 тот же делитель записывается в BRR как целая и дробная части — значение регистра получается таким же.

Классический 8051 (12 тактов на машинный цикл: AT89S52, AT89C51 и аналоги). Скорость задаёт таймер 1 в режиме 2 с автоперезагрузкой из TH1:

BAUD=2SMOD32⋅fOSC12⋅(256−TH1).\text{BAUD} = \frac{2^\text{SMOD}}{32} \cdot \frac{f_\text{OSC}}{12 \cdot (256 - \text{TH1})}.

Быстрые клоны с одним тактом на цикл (STC, CH55x, EFM8 и другие) считают иначе: смотрите их даташиты.

Ошибка во всех случаях — относительная разница фактической и заданной скорости: (BAUDфакт / BAUD − 1) · 100 %.

Пример: 115 200 бит/с на AVR с кварцем 16 МГц

РежимUBRRФактическая скоростьОшибка
U2X = 016 000 000 / (16 · 115 200) − 1 = 7,68 → 8111 111 бит/с−3,5 %
U2X = 116 000 000 / (8 · 115 200) − 1 = 16,36 → 16117 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 внутренний генератор точнее, но для длинных кадров и высоких скоростей кварц всё равно надёжнее.

Источники

  1. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B), раздел 20 USART0 — формулы UBRR, таблицы 20-2…20-7, допуск приёмника
  2. STMicroelectronics. RM0360: STM32F030x4/x6/x8/xC and STM32F070x6/xB reference manual, USART baud rate generation — USARTDIV, OVER8, упаковка BRR
  3. Atmel. AT89S52 8-bit Microcontroller with 8K Bytes In-System Programmable Flash (doc1919) — скорость последовательного порта от таймера 1 в режиме 2
  4. Analog Devices (Maxim). Determining Clock Accuracy Requirements for UART Communications (AN2141) — допустимое расхождение частот приёмника и передатчика

Обновлено . Нашли ошибку в расчёте? Напишите нам.