Skip to content

Commit 6b8774f

Browse files
authored
Merge pull request #2703 from anangl/master
TARGET_NRF5: Changed 'serial_baud' implementation to support special baud rates.
2 parents bdf2213 + c9c946f commit 6b8774f

File tree

1 file changed

+37
-54
lines changed

1 file changed

+37
-54
lines changed

hal/targets/hal/TARGET_NORDIC/TARGET_NRF5/serial_api.c

Lines changed: 37 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -344,64 +344,47 @@ void serial_free(serial_t *obj)
344344
}
345345
}
346346

347-
static nrf_uart_baudrate_t baud_translate(int rate)
347+
void serial_baud(serial_t *obj, int baudrate)
348348
{
349-
nrf_uart_baudrate_t baud;
350-
351-
if (rate < 57600) {
352-
if (rate < 14400) {
353-
if (rate < 2400) {
354-
baud = NRF_UART_BAUDRATE_1200;
355-
} else if (rate < 4800) {
356-
baud = NRF_UART_BAUDRATE_2400;
357-
} else if (rate < 9600) {
358-
baud = NRF_UART_BAUDRATE_4800;
359-
} else {
360-
baud = NRF_UART_BAUDRATE_9600;
361-
}
362-
} else {
363-
if (rate < 19200) {
364-
baud = NRF_UART_BAUDRATE_14400;
365-
} else if (rate < 28800) {
366-
baud = NRF_UART_BAUDRATE_19200;
367-
} else if (rate < 38400) {
368-
baud = NRF_UART_BAUDRATE_28800;
369-
} else {
370-
baud = NRF_UART_BAUDRATE_38400;
371-
}
372-
}
373-
} else {
374-
if (rate < 250000) {
375-
if (rate < 76800) {
376-
baud = NRF_UART_BAUDRATE_57600;
377-
} else if (rate < 115200) {
378-
baud = NRF_UART_BAUDRATE_76800;
379-
} else if (rate < 230400) {
380-
baud = NRF_UART_BAUDRATE_115200;
381-
} else {
382-
baud = NRF_UART_BAUDRATE_230400;
383-
}
384-
} else {
385-
if (rate < 460800) {
386-
baud = NRF_UART_BAUDRATE_250000;
387-
} else if (rate < 921600) {
388-
baud = NRF_UART_BAUDRATE_460800;
389-
} else if (rate < 1000000) {
390-
baud = NRF_UART_BAUDRATE_921600;
391-
} else {
392-
baud = NRF_UART_BAUDRATE_1000000;
393-
}
349+
// nrf_uart_baudrate_set() is not used here (registers are accessed
350+
// directly) to make it possible to set special baud rates like 56000
351+
// or 31250.
352+
353+
static uint32_t const acceptedSpeeds[][2] = {
354+
{ 1200, UART_BAUDRATE_BAUDRATE_Baud1200 },
355+
{ 2400, UART_BAUDRATE_BAUDRATE_Baud2400 },
356+
{ 4800, UART_BAUDRATE_BAUDRATE_Baud4800 },
357+
{ 9600, UART_BAUDRATE_BAUDRATE_Baud9600 },
358+
{ 14400, UART_BAUDRATE_BAUDRATE_Baud14400 },
359+
{ 19200, UART_BAUDRATE_BAUDRATE_Baud19200 },
360+
{ 28800, UART_BAUDRATE_BAUDRATE_Baud28800 },
361+
{ 31250, (0x00800000UL) /* 31250 baud */ },
362+
{ 38400, UART_BAUDRATE_BAUDRATE_Baud38400 },
363+
{ 56000, (0x00E51000UL) /* 56000 baud */ },
364+
{ 57600, UART_BAUDRATE_BAUDRATE_Baud57600 },
365+
{ 76800, UART_BAUDRATE_BAUDRATE_Baud76800 },
366+
{ 115200, UART_BAUDRATE_BAUDRATE_Baud115200 },
367+
{ 230400, UART_BAUDRATE_BAUDRATE_Baud230400 },
368+
{ 250000, UART_BAUDRATE_BAUDRATE_Baud250000 },
369+
{ 460800, UART_BAUDRATE_BAUDRATE_Baud460800 },
370+
{ 921600, UART_BAUDRATE_BAUDRATE_Baud921600 },
371+
{ 1000000, UART_BAUDRATE_BAUDRATE_Baud1M }
372+
};
373+
374+
if (baudrate <= 1200) {
375+
UART_INSTANCE->BAUDRATE = UART_BAUDRATE_BAUDRATE_Baud1200;
376+
return;
377+
}
378+
379+
int const item_cnt = sizeof(acceptedSpeeds)/sizeof(acceptedSpeeds[0]);
380+
for (int i = 1; i < item_cnt; i++) {
381+
if ((uint32_t)baudrate < acceptedSpeeds[i][0]) {
382+
UART_INSTANCE->BAUDRATE = acceptedSpeeds[i - 1][1];
383+
return;
394384
}
395385
}
396-
return baud;
397-
}
398-
void serial_baud(serial_t *obj, int baudrate)
399-
{
400-
(void)obj;
401-
UART_CB.baudrate = baud_translate(baudrate);
402386

403-
// Reconfigure UART peripheral.
404-
nrf_uart_baudrate_set(UART_INSTANCE, UART_CB.baudrate);
387+
UART_INSTANCE->BAUDRATE = UART_BAUDRATE_BAUDRATE_Baud1M;
405388
}
406389

407390
void serial_format(serial_t *obj,

0 commit comments

Comments
 (0)