реклама на сайте
подробности

 
 
> baud rate uart LPC2148
Ave
сообщение Jun 19 2013, 14:07
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 12-09-05
Пользователь №: 8 478



Кто может подсказать калькулятор расчета скорости UART для LPC2148.
Ни как не могу найти сайт.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
andrewlekar
сообщение Jun 20 2013, 08:33
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Макросом дробный делитель сложновато считать. У меня кодом считается при необходимости:

CODE
#ifdef USE_CALC_FRACTIONAL_DIVIDER

//расчёт дробного делителя UART для минимизации процента ошибок.
//19200 и 115200 позволяет использовать с 0 ошибкой для кварца 11,0592.
static void uart_calc_divisors(uint_fast32_t baudrate, int *pDiv, int *pAddDiv, int *pMul, int *error)
{
uint_fast32_t uClk;
uint_fast32_t calcBaudrate = 0;
uint_fast32_t temp = 0;

int mulFracDiv, dividerAddFracDiv;
int diviser = 0;
int mulFracDivOptimal = 1;
int dividerAddOptimal = 0;
int diviserOptimal = 0;

int relativeError = 0;
int relativeOptimalError = 10000;

uClk = CPU_PERIPH_CLOCK >> 4; // div by 16
// In the Uart IP block, baud rate is calculated using FDR and DLL-DLM registers
// The formula is :
// BaudRate= uClk * (mulFracDiv/(mulFracDiv+dividerAddFracDiv) / (16 * (DLL)
// It involves floating point calculations. That's the reason the formulae are adjusted with
// Multiply and divide method.
// The value of mulFracDiv and dividerAddFracDiv should comply to the following expressions:
// 0 < mulFracDiv <= 15, 0 <= dividerAddFracDiv <= 15
for (mulFracDiv = 1; mulFracDiv <= 15;mulFracDiv++)
{
for (dividerAddFracDiv = 0; dividerAddFracDiv <= 15;dividerAddFracDiv++)
{
temp = (mulFracDiv * uClk) / ((mulFracDiv + dividerAddFracDiv));

diviser = temp / baudrate;
if ((temp % baudrate) > (baudrate / 2))
diviser++;

if ((diviser > 2) && (diviser < 65536))
{
calcBaudrate = temp / diviser;

if (calcBaudrate <= baudrate)
relativeError = baudrate - calcBaudrate;
else
relativeError = calcBaudrate - baudrate;

if ((relativeError < relativeOptimalError))
{
mulFracDivOptimal = mulFracDiv;
dividerAddOptimal = dividerAddFracDiv;
diviserOptimal = diviser;
relativeOptimalError = relativeError;
if (relativeError == 0)
break;
}
}
}
if (relativeError == 0)
break;
}

*pDiv = diviserOptimal;
*pAddDiv = dividerAddOptimal;
*pMul = mulFracDivOptimal;
*error = relativeOptimalError;
}
#else //!USE_CALC_FRACTIONAL_DIVIDER

//UART baudrate formula : PCLK / (16 * UART1_MAIN_DIV * (1 + (FRACTIONAL_UART1_DIV / FRACTIONAL_UART1_MUL)))

//For 11.0592 MHz , CCLK = 99532800, PCLK = 24883200

//Baudrate = 115200
#if (UART1_BAUDRATE == 115200)
#define FRACTIONAL_UART1_DIV 1
#define FRACTIONAL_UART1_MUL 2
#define UART1_MAIN_DIV 9
#endif

//Baudrate = 19200
#if (UART1_BAUDRATE == 19200)
#define FRACTIONAL_UART1_DIV 0
#define FRACTIONAL_UART1_MUL 1
#define UART1_MAIN_DIV 81
#endif

//wrong baudrate
#if ((UART1_BAUDRATE != 115200) && (UART1_BAUDRATE != 19200))
#error "Wrong UART1 baudrate"
#endif

#endif //USE_CALC_FRACTIONAL_DIVIDER


Сообщение отредактировал IgorKossak - Jun 20 2013, 09:51
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
KRS
сообщение Jun 20 2013, 09:54
Сообщение #3


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(andrewlekar @ Jun 20 2013, 12:33) *
Макросом дробный делитель сложновато считать. У меня кодом считается при необходимости:

С кодом то понятно, просто jcxz утверждает, что ВСЕ прескалеры макросами получаются.
Может есть какой то "красивый" способ.

Цитата(jcxz @ Jun 20 2013, 11:40) *
В моих проектах все частоты (UART, SPI и т.п.) задаются дефайнами, от которых макросами рассчитываются необходимые делители, прескалеры, делители PCLK и пр.
Если данную частоту невозможно обеспечить физически, принимается ближайшая большая/меньшая или выводится #error компиляции (по ситуации).


вот и интересен пример такого макроса для этого вида UART
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 20 2013, 10:23
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(KRS @ Jun 20 2013, 15:54) *
С кодом то понятно, просто jcxz утверждает, что ВСЕ прескалеры макросами получаются.
Может есть какой то "красивый" способ.

Нет. Сейчас глянул - освежил в памяти - для UART я макросом не стал делать, сделал обычной функцией в рантайм - действительно слишком сложно. Оостальные - SPI, I2C и т.п. макросами
cool.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Ave   baud rate uart LPC2148   Jun 19 2013, 14:07
- - kovigor   Цитата(Ave @ Jun 19 2013, 17:07) Кто може...   Jun 19 2013, 15:34
- - KRS   Так в User Manual есть раздел baud rate calculatio...   Jun 19 2013, 17:43
|- - haker_fox   QUOTE (KRS @ Jun 20 2013, 02:43) Так в Us...   Jun 20 2013, 07:16
|- - jcxz   Цитата(haker_fox @ Jun 20 2013, 13:16) Аг...   Jun 20 2013, 07:40
|- - KRS   Цитата(jcxz @ Jun 20 2013, 11:40) задаютс...   Jun 20 2013, 07:55
- - haker_fox   QUOTE (jcxz @ Jun 20 2013, 16:40) Ну вооб...   Jun 20 2013, 10:27
- - Ave   Спасибо за ответы. Не обязательно что калькулятор...   Jun 20 2013, 12:35
|- - jcxz   А Вы умножьте 921600*16 сравните результат с 24МГц...   Jun 21 2013, 02:09
- - Ave   Умножение 16 * 921600 = 14 745 600 что меньше 24 0...   Jun 21 2013, 06:40
|- - jcxz   Цитата(Ave @ Jun 21 2013, 12:40) Умножени...   Jun 21 2013, 10:56
|- - toweroff   Цитата(jcxz @ Jun 21 2013, 14:56) У меня ...   Jun 22 2013, 20:58
- - Ave   Частота кварца 12 000 000 Частота процессор...   Jun 22 2013, 10:58


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 22:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01402 секунд с 7
ELECTRONIX ©2004-2016