Principe
Un UART divise son horloge noyau pour obtenir le débit binaire. Le diviseur est un entier (ou possède une petite partie fractionnaire), donc le baud rate réel est rarement exact :
| Périphérique | Diviseur | Baud réel |
|---|---|---|
| STM32 USART, ×16 | USARTDIV = round(fck / baud), BRR = USARTDIV | fck / USARTDIV |
| STM32 USART, ×8 | USARTDIV = round(2 fck / baud), BRR[3:0] = USARTDIV[3:0] >> 1 | 2 fck / USARTDIV |
| AVR (ATmega) | UBRR = round(F / (16 baud) − 1), ou 8 avec U2X | F / (16 (UBRR + 1)) |
| RP2040 / RP2350 (PL011) | IBRD + FBRD/64 = clk / (16 baud) | clk / (16 (IBRD + FBRD/64)) |
| ESP32 | CLKDIV + FRAG/16 = clk / baud | clk / (CLKDIV + FRAG/16) |
fck est l’horloge noyau de l’USART divisée par PRESC sur les composants qui en disposent (STM32N6, H7, G4, L4+…). Le STM32 exige USARTDIV ≥ 16.
Quelle erreur est acceptable ?
Le récepteur échantillonne chaque bit en son milieu ; sur une trame de 10 bits, les horloges peuvent dériver l’une par rapport à l’autre d’environ un demi-bit, donc la somme des erreurs des deux côtés doit rester sous 4–5 % environ. L’outil considère ±2 % comme correct et ±3.5 % comme limite.
L’exemple classique : un Arduino Uno à 16 MHz ne peut pas faire proprement du 115 200 bauds. Sans U2X, l’erreur est de −3.5 % ; avec U2X (que le core Arduino active), elle est de +2.1 %. Cela fonctionne avec la plupart des adaptateurs USB-série, mais pas avec tous les équipements.
Préréglages
Les horloges sont des valeurs par défaut typiques (STM32N6 avec HSI 64 MHz comme horloge noyau de l’USART, clk_peri du Pico SDK, APB de l’ESP32 à 80 MHz). Votre arbre d’horloges peut différer : vérifiez-le dans CubeMX ou le manuel de référence et saisissez la valeur.