Vai al testo principale

Calcolatore baud rate per registri LPC UART

Qualche tempo fa, lavorando su un microcontrollore NXP, ho pubblicato su GitHub un piccolo progetto, che aiuta a configurare correttamente il valore dei registri per l'inizializzazione delle porte UART delle MCU di famiglia LPC.

I sorgenti sono disponibili con una licenza MIT-style, estremamente permissiva:

https://github.com/colosimo/lpc-uart-calc

Implementa l'algoritmo scritto nel manuale utente (Fig. 35, pag. 218, paragrafo 13.5.15). L'ho testata su un chip LPC111x. Penso che possa funzionare anche per altri chip LPC.

L'idea dell'algoritmo è trovare i valori di DLM, DLL, DIVADDVAL e MULVAL aventi il minimo scostamento rispetto al baudrate desiderato. Nel primo loop, è calcolato dl_est (DLM|DLL), insieme al valore di fr_est:

do {
        dl_est = uart_pclk / (16 * br * fr_est);
        fr_est = uart_pclk / (16 * br * dl_est);
} while (fr_est <= 1.1 && fr_est >= 1.9);

In seguito, viene effettuata una chiamata alla funzione float_to_fraction, che implementa l'algoritmo per calcolare la il divisore frazionario secondo la look-up table a pag. 219 (Tabella 201):

void float_to_fraction(float ft, unsigned *mul, unsigned *div, unsigned maxdiv)
{
        int m, d;
        float err = ft;
        float newerr;

        for (m = 0; m < maxdiv; m++)
                for (d = 1; d <= maxdiv; d++) {
                        newerr = fabs(((float)m) / ((float)d) - ft);
                        if (newerr < err) {
                                        *mul = m;
                                        *div = d;
                                        err = newerr;
                        }
                }
}