Skip to content

Commit 343ab5f

Browse files
authored
Merge pull request #712 from deepindeep/variable_baudrate_iso
Enable custom UART baudrate for nRF52
2 parents d999e62 + 45103a9 commit 343ab5f

1 file changed

Lines changed: 28 additions & 36 deletions

File tree

cores/nRF5/Uart.cpp

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

Comments
 (0)