@@ -90,42 +90,34 @@ void Uart::begin(unsigned long baudrate, uint16_t config)
9090
9191 uint32_t nrfBaudRate;
9292
93- if (baudrate <= 1200 ) {
94- nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud1200;
95- } else if (baudrate <= 2400 ) {
96- nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud2400;
97- } else if (baudrate <= 4800 ) {
98- nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud4800;
99- } else if (baudrate <= 9600 ) {
100- nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud9600;
101- } else if (baudrate <= 14400 ) {
102- nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud14400;
103- } else if (baudrate <= 19200 ) {
104- nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud19200;
105- } else if (baudrate <= 28800 ) {
106- nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud28800;
107- } else if (baudrate <= 31250 ) {
108- nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud31250;
109- } else if (baudrate <= 38400 ) {
110- nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud38400;
111- } else if (baudrate <= 56000 ) {
112- nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud56000;
113- } else if (baudrate <= 57600 ) {
114- nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud57600;
115- } else if (baudrate <= 76800 ) {
116- nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud76800;
117- } else if (baudrate <= 115200 ) {
118- nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud115200;
119- } else if (baudrate <= 230400 ) {
120- nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud230400;
121- } else if (baudrate <= 250000 ) {
122- nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud250000;
123- } else if (baudrate <= 460800 ) {
124- nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud460800;
125- } else if (baudrate <= 921600 ) {
126- nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud921600;
127- } else {
128- nrfBaudRate = UARTE_BAUDRATE_BAUDRATE_Baud1M;
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+ }
129121 }
130122
131123 nrfUart->BAUDRATE = nrfBaudRate;
0 commit comments