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