@@ -87,9 +87,38 @@ void Uart::begin(unsigned long baudrate, uint16_t config)
8787 } else {
8888 nrfUart->CONFIG = config | (UARTE_CONFIG_HWFC_Disabled << UARTE_CONFIG_HWFC_Pos);
8989 }
90-
91- const double regValue = 268 .43f *(double )baudrate; /* 2^32 / 16000000 = 268.43f. more details here: https://devzone.nordicsemi.com/f/nordic-q-a/391/uart-baudrate-register-values */
92- const uint32_t nrfBaudRate = ((uint32_t )regValue + 0x800 ) & 0xFFFFF000 ;
90+
91+ uint32_t nrfBaudRate;
92+
93+ // Use Nordic's pre-computed values for standard baudrates to match other
94+ // nRF devices exactly; fall back to runtime computation for custom values.
95+ switch (baudrate) {
96+ case 1200 : nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud1200; break ;
97+ case 2400 : nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud2400; break ;
98+ case 4800 : nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud4800; break ;
99+ case 9600 : nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud9600; break ;
100+ case 14400 : nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud14400; break ;
101+ case 19200 : nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud19200; break ;
102+ case 28800 : nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud28800; break ;
103+ case 31250 : nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud31250; break ;
104+ case 38400 : nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud38400; break ;
105+ case 56000 : nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud56000; break ;
106+ case 57600 : nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud57600; break ;
107+ case 76800 : nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud76800; break ;
108+ case 115200 : nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud115200; break ;
109+ case 230400 : nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud230400; break ;
110+ case 250000 : nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud250000; break ;
111+ case 460800 : nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud460800; break ;
112+ case 921600 : nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud921600; break ;
113+ case 1000000 : nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud1M; break ;
114+ default : {
115+ // BAUDRATE = round(baudrate * 2^32 / 16e6) and round to nearest 0x1000.
116+ // https://devzone.nordicsemi.com/f/nordic-q-a/391/uart-baudrate-register-values
117+ const uint32_t regValue = (uint32_t )(((uint64_t )baudrate * 268435456ULL + 500000ULL ) / 1000000ULL );
118+ nrfBaudRate = (regValue + 0x800 ) & 0xFFFFF000 ;
119+ break ;
120+ }
121+ }
93122
94123 nrfUart->BAUDRATE = nrfBaudRate;
95124
0 commit comments