Skip to content

Commit 45103a9

Browse files
committed
update UART to use pre-computed baudrate values for standard rates with fallback for custom rates
1 parent 73a0e86 commit 45103a9

1 file changed

Lines changed: 32 additions & 3 deletions

File tree

cores/nRF5/Uart.cpp

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)