Расчет Параметров Прескалера Для 8250-Совместимых Usart

Сегодня вечером я расскажу сказку о том, как можно эффективно рассчитать параметры прескалера, который обычно используется для установки тактовой частоты портов USART, в частности 8250-совместимых, используемых в Intel SoC. В настоящее время существует как минимум две линейки процессоров Intel SoC, использующих USART с дробным прескалером.

  1. Медфилд, CloverTrail, Танжер
  2. БэйТрейл, Брасуэлл
В чем разница между ними, я расскажу чуть позже.

Ниже приведены формулы, используемые для расчета Фюсарт — тактовая частота USART и бод - скорость передачи.



Расчет параметров прескалера для 8250-совместимых USART

Отдых Фреф — частота перед прескалером, м - числитель, н – знаменатель рациональной дроби предделителя, прескалер - целое число, которое делится на Фюсарт , ДЛАБ - 16-битный делитель, доступный в чипах, совместимых с 8250. Из всего множества нам известны только две величины, а именно: Фреф И бод .

Величина прескалер как правило, оно равно 16 и некоторые микросхемы не имеют возможности его изменить (это и отличает Линейки процессоров Intel друг от друга)

Расчет стоимости прескалер

Поскольку мы работаем с дробным прескалером, а не с полноценной ФАПЧ, то из (1) должен

Расчет параметров прескалера для 8250-совместимых USART

И поэтому мы уже можем вычислить значение прескалер
  
  
   

prescaler = 16 fusart = baud * prescaler if fref < fusart: if fref >= baud: prescaler = fref / baud else: prescaler = 1 fusart = baud * prescaler



Расчет Фюсарт

Предыдущая часть работает, только если это не так (3) .

В противном случае Фюсарт может быть очень низким по сравнению с Фреф при запрошенной довольно низкой скорости передачи данных, например 110 бод. А поскольку числитель и знаменатель делителя обычно имеют одинаковую ширину (в битах), было бы неплохо ограничить их расхождение.

Для этого давайте приблизим его Фюсарт К Фреф насколько возможно.



fusart <<= int(math.log(fref / fusart, 2))

Почему было выбрано именно это приближение? Вот в чем дело, если у нас есть переполнение ДЛАБ , а оно всего 16-битное, то в случае использования степени двойки мы можем это отследить с помощью простейших битовых операций.



Очередь за знаменателем

Очевидно, что теперь из (1,2) , подчиняется простой пропорции

Расчет параметров прескалера для 8250-совместимых USART

Таким образом, мы можем легко вычислить числитель и знаменатель рациональной дроби предделителя.



divisor = gcd(fref, fusart) n = fref / divisor while n > (2 ** width - 1): divisor <<= 1 n >>= 1 m = fusart / divisor

Здесь ширина — разрядность в битах числителя и знаменателя.

Вот и все.

Для тех, кому интересно, исходный код на Python можно найти.

на GitHub (оно уже обновлялось несколько раз и может быть обновлено в будущем).

Пример расчета для Fref=50 МГц, ширины=24 бита Вывод в формате 1) м , 2) н , 3) прескалер , 4) Фюсарт , 5) загадочное число, 6) список скоростей передачи, значение в скобках ДЛАБ .

24 25 12 48000000 64000000 4000000(1) 49 50 14 49000000 56000000 3500000(1) 4 5 16 40000000 40000000 2500000(1) 16 25 16 32000000 32000000 500000(4),1000000(2),2000000(1) 24 25 16 48000000 48000000 1500000(2),3000000(1) 2304 3125 16 36864000 36864000 576000(4),1152000(2) 8192 15625 16 26214400 26214400 50(32768),200(8192) 9216 15625 16 29491200 29491200 1800(1024),57600(32),115200(16),230400(8),460800(4),921600(2),1843200(1) 12288 15625 16 39321600 39321600 75(32768),150(16384),300(8192),600(4096),1200(2048),2400(1024),4800(512),9600(256),19200(128),38400(64) 45056 78125 16 28835840 28835840 110(16384) 274432 390625 16 35127296 35127296 134(16384) Обратите внимание, что приведенный выше алгоритм прост и быстр, хотя и не столь точен, но нашей цели он удовлетворяет. Теги: #программирование #микроконтроллеры #python #uart #последовательный порт #Intel #программирование микроконтроллеров

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.