Skip to main content

LPC UART baud rate calculator

In this post I will describe a small project I published some time ago, while working on a NXP microcontroller. It helps in setting the correct register values for proper UART initialization in LPC family MCUs.

The source file is fully available on github, under a permissive MIT-style license:

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

It implements the algorithm written in the user manual (Fig. 35, pag. 218, paragraph 13.5.15). I tested it on a LPC111x chip, I guess it will work for other LPC chips, but did not test it yet.

The idea of the algorithm is to find the values of DLM, DLL, DIVADDVAL and MULVAL having the minimum delta with respect to desired baudrate. In the first loop, the dl_est (DLM|DLL) is found, together with the fr_est value:

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);

Then, a call to float_to_fraction function follows. float_to_fraction implements the algorithm computing the fractional divider look-up table at page 219 (Table 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;
                        }
                }
}