UART Baud Error
Verifica la configurazione di una UART: dal clock della periferica e dal baud desiderato ottieni divisore, baud reale ed errore percentuale, e vedi a colpo d’occhio quali baud standard sono "puliti" a quel clock. Strumento dimostrativo.
1 · Periferica
2 · Configurazione UART
Risultato
baud = f_periph / (oversampling · divisore). Soglie su un estremo (budget combinato 3,95%): |err| < 2% ok, 2–3% al limite, > 3% perde frame. Strumento dimostrativo.
Baud standard a questo clock
| Baud | Divisore | Baud reale | Errore | Stato |
|---|
Come genera il baud una UART?
Una UART non ha un proprio oscillatore al baud: divide il clock della periferica. Un generatore campiona ogni bit più volte (oversampling, tipicamente 16× o 8×) e un divisore porta il clock al ritmo del baud: div = f_periph / (oversampling · baud_target). Il baud reale usa il divisore intero e l’errore è (baud_reale − baud_target) / baud_target · 100.
Una UART non ha un proprio oscillatore al baud: divide il clock della periferica. Un generatore campiona ogni bit più volte (oversampling, tipicamente 16× o 8×) e un divisore porta il clock al ritmo del baud:
Perché nasce l’errore?
Il divisore ideale è quasi sempre frazionario, ma quello intero deve essere intero: arrotondandolo, il baud reale si discosta dal target. A 16 MHz e 115200 baud con oversampling 16 il divisore ideale è ~8.68, arrotondato a 9 dà 111111 baud, cioè −3.5% — abbastanza per perdere frame.
Il divisore ideale è quasi sempre frazionario, ma quello intero deve essere... intero. Arrotondandolo, il baud reale si discosta dal target. A 16 MHz e 115200 baud con oversampling 16 il divisore ideale è ~8.68: arrotondato a 9 dà 111111 baud, cioè −3.5% — abbastanza per perdere frame.
La soglia ±2–3%, e da dove viene
Un frame UART è start + 8 dati + stop = 10 bit. Il ricevitore campiona ogni bit al centro, ricalibrandosi sul fronte di start; l’errore di clock si accumula bit dopo bit lungo il frame. Imponendo che il campione dell’ultimo bit resti dentro la sua finestra si ottiene il budget combinato: (0,5 − 2/S)/(n − 0,5), cioè 3,95% per 8N1 a 16× con decisione a maggioranza. Quel budget vale per i DUE estremi insieme, tolleranza dei clock inclusa: il 2–3% qui sotto è quanto se ne può allocare a uno solo.
Oversampling 16× vs 8×
A 16× ogni bit è campionato su 16 "tick" e la decisione si prende a maggioranza attorno al centro: più robustezza al rumore e al jitter. A 8× il divisore può scendere della metà, quindi si raggiungono baud più alti con lo stesso clock, ma con metà del margine di campionamento. Molti MCU usano 16× di default e 8× solo per i baud più spinti.
Cos’è il divisore frazionario?
Molti peripherali (per esempio l’USART STM32) rappresentano il divisore come mantissa intera più una frazione a 4 bit, con passi di 1/16. Quantizzando la parte frazionaria a 1/16 l’errore crolla: nel caso 16 MHz/115200 si passa da −3.5% a meno dello 0.1%. È il modo più efficace per «pulire» un baud che altrimenti fallirebbe.
Molti peripherali (es. USART STM32) rappresentano il divisore come mantissa intera più una frazione su 4 bit (passi di 1/16). Quantizzando la parte frazionaria a 1/16 l’errore crolla: nel caso 16 MHz/115200 si passa da −3.5% a meno dello 0.1%. È il modo più efficace per "pulire" un baud che altrimenti fallirebbe.
Scegliere il clock giusto
I clock "magici" per la seriale sono multipli del baud per l’oversampling: a 16× un clock come 14.7456 MHz dà errore zero su tutta la famiglia 9600–921600, perché 14.7456e6 / 16 = 921600 esatti. È il motivo per cui quei quarzi dall’aria strana esistono. Se il clock è vincolato altrove, il divisore frazionario è il rimedio.
Quali sono i limiti dello strumento?
La quantizzazione frazionaria usata qui è a 1/16 (4 bit), il caso più comune; alcuni peripherali hanno risoluzione o vincoli diversi. Lo strumento considera il solo errore del generatore di baud: non modella la tolleranza del clock sorgente (quarzo/PLL) né il jitter, che consumano lo stesso budget del ±2–3%. Strumento dimostrativo: per la configurazione reale valgono il reference manual della UART e i registri del peripherale.
- La quantizzazione frazionaria usata qui è a 1/16 (4 bit), il caso più comune; alcuni peripherali hanno risoluzione o vincoli diversi (es. in 8× il bit meno significativo della frazione).
- Considera il solo errore del generatore di baud: non modella la tolleranza del clock sorgente (quarzo/PLL) né il jitter, che consumano lo stesso budget del ±2–3%.
- Strumento dimostrativo: per la configurazione reale valgono il reference manual della UART e i registri del peripherale.