Цитата(Bosicc @ Feb 16 2007, 12:45)

Цитата(bolmoe @ Feb 16 2007, 11:30)

Тут все просто, есть калькулятор от NXP для расчета этих параметров
Спасибо огромное. Я Вчера 4 часа потратил пытаясь методом перебора подобрать оптимальные. А тут просто лафа.
Проблема решена, всем спасибо!
я тут еще когда-то баловался с этим, наманстрячил себе функшион))), правда иногда долго вычисляет ~ 1-2 мс (lpc2148 - 60 MHz), но все зависит от точности (%), ее еще можно оптимизировать......
#if SET_BAUDRATE
BOOL Set_baudrate(DWORD baudrate,DWORD com)
{
DWORD tmp,lsb,msb,dummy;
DWORD mulval;
DWORD divaddval;
DWORD max,min;
DWORD div;
msb=(( Fpclk / 16 )/baudrate) / 256;
msb*=16;
lsb=(( Fpclk / 16 )/baudrate) % 256;
dummy=lsb;
/* mulval может изменяться в диапазоне 1 .. 15*/
/*divaddval может изменяться в диапазоне 0 .. 15*/
//проценты указываются с множителем на 100, т.е. 0.5%*100=50;
max=(baudrate*50)/(100*100);
max>>=1;
min=max;
min=(baudrate-min);
max+=baudrate;
for(mulval=1;mulval<16;mulval++)
{
for(divaddval=0;divaddval<16;divaddval++)
{
div=(FDIV*mulval);
div/=(mulval+divaddval);
for(lsb=dummy;lsb>0;lsb--)
{
tmp=div/(msb+lsb);
if(tmp>max) break;
if(tmp > min || tmp==baudrate)
{
if(com)
{
U1DLL = lsb;
U1DLM = msb;
U1FDR = ((mulval<<4)|divaddval);
}
else
{
U0DLL = lsb;
U0DLM = msb;
U0FDR = ((mulval<<4)|divaddval);
}
return TRUE;
}
}
}
}
return FALSE;
}
#endif