Normalmente calcular os valores dos registradores que prgogramam o baudrate no LPC2148, por exemplo, é um "pé no saco" e normalmente recorre-se a tabelas. Para evitar este transtorno segue rotina abaixo :
typedef struct
{
unsigned char UDLM;
unsigned char UDLL;
unsigned char DIVADDVAL;
unsigned char MULVAL;
} uart_divisor;
//------------------------------------------------------------------------------|
// Retorna a estrutura que programa o baud rate desejado |
//------------------------------------------------------------------------------|
uart_divisor *get_divisor(uart_divisor *result, unsigned short baud)
{
unsigned char divaddval, mulval;
unsigned short udl;
double error, min_error = FLT_MAX;
double tmp;
for(divaddval=0; divaddval<=15; divaddval++)
for(mulval=2; mulval<=15; mulval++)
{
tmp =(PCLK * mulval)>>4;
udl = tmp/(double)(baud*(divaddval+mulval));
error = fabs((baud-(tmp/(double)(udl*(divaddval+mulval))))/baud);
if(error < min_error)
{
min_error = error;
result->DIVADDVAL = divaddval;
result->MULVAL = mulval;
result->UDLM = udl>>8;
result->UDLL = udl;
}
}
return result;
}
Exemplo : Calcular os registradores para baudrate 9600 :
uart_divisor divisor;
get_divisor(&divisor, 9600);
Resultado:
o valor de UxDLL é: divisor.UDLL
o valor de UxDLM é: divisor.UDLM
o valor de UxFDR é: (divisor.MULVAL<<4) | divisor.DIVADDVAL