Сегодня вечером я расскажу сказку о том, как можно эффективно рассчитать параметры прескалера, который обычно используется для установки тактовой частоты портов USART, в частности 8250-совместимых, используемых в Intel SoC. В настоящее время существует как минимум две линейки процессоров Intel SoC, использующих USART с дробным прескалером.
- Медфилд, CloverTrail, Танжер
- БэйТрейл, Брасуэлл
Ниже приведены формулы, используемые для расчета Фюсарт — тактовая частота USART и бод - скорость передачи.
Отдых Фреф — частота перед прескалером, м - числитель, н – знаменатель рациональной дроби предделителя, прескалер - целое число, которое делится на Фюсарт , ДЛАБ - 16-битный делитель, доступный в чипах, совместимых с 8250.
Из всего множества нам известны только две величины, а именно: Фреф И бод .
Величина прескалер как правило, оно равно 16 и некоторые микросхемы не имеют возможности его изменить (это и отличает Линейки процессоров Intel друг от друга)
Расчет стоимости прескалер
Поскольку мы работаем с дробным прескалером, а не с полноценной ФАПЧ, то из (1) долженИ поэтому мы уже можем вычислить значение прескалер
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) , подчиняется простой пропорцииТаким образом, мы можем легко вычислить числитель и знаменатель рациональной дроби предделителя.
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 #программирование микроконтроллеров
-
Системы Отопления
19 Oct, 24 -
Firmacast №1 `Начало Конца...`
19 Oct, 24 -
Заезд В Технопарк (Фотоотчет)
19 Oct, 24