From b2de59d8ed7a0ab2464f92e57dd57e555b345824 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C5=82=C4=85bek=2C=20Andrzej?= Date: Wed, 14 Sep 2016 14:43:57 +0200 Subject: [PATCH 1/2] Changed 'serial_baud' implementation to make it possible to use baud rates like 56000 or 31250. --- .../TARGET_NORDIC/TARGET_NRF5/serial_api.c | 93 ++++++++----------- 1 file changed, 38 insertions(+), 55 deletions(-) diff --git a/hal/targets/hal/TARGET_NORDIC/TARGET_NRF5/serial_api.c b/hal/targets/hal/TARGET_NORDIC/TARGET_NRF5/serial_api.c index 08c1e32a27..4f47472cb1 100644 --- a/hal/targets/hal/TARGET_NORDIC/TARGET_NRF5/serial_api.c +++ b/hal/targets/hal/TARGET_NORDIC/TARGET_NRF5/serial_api.c @@ -344,64 +344,47 @@ void serial_free(serial_t *obj) } } -static nrf_uart_baudrate_t baud_translate(int rate) -{ - nrf_uart_baudrate_t baud; - - if (rate < 57600) { - if (rate < 14400) { - if (rate < 2400) { - baud = NRF_UART_BAUDRATE_1200; - } else if (rate < 4800) { - baud = NRF_UART_BAUDRATE_2400; - } else if (rate < 9600) { - baud = NRF_UART_BAUDRATE_4800; - } else { - baud = NRF_UART_BAUDRATE_9600; - } - } else { - if (rate < 19200) { - baud = NRF_UART_BAUDRATE_14400; - } else if (rate < 28800) { - baud = NRF_UART_BAUDRATE_19200; - } else if (rate < 38400) { - baud = NRF_UART_BAUDRATE_28800; - } else { - baud = NRF_UART_BAUDRATE_38400; - } - } - } else { - if (rate < 250000) { - if (rate < 76800) { - baud = NRF_UART_BAUDRATE_57600; - } else if (rate < 115200) { - baud = NRF_UART_BAUDRATE_76800; - } else if (rate < 230400) { - baud = NRF_UART_BAUDRATE_115200; - } else { - baud = NRF_UART_BAUDRATE_230400; - } - } else { - if (rate < 460800) { - baud = NRF_UART_BAUDRATE_250000; - } else if (rate < 921600) { - baud = NRF_UART_BAUDRATE_460800; - } else if (rate < 1000000) { - baud = NRF_UART_BAUDRATE_921600; - } else { - baud = NRF_UART_BAUDRATE_1000000; - } - } - } - return baud; -} void serial_baud(serial_t *obj, int baudrate) { - (void)obj; - UART_CB.baudrate = baud_translate(baudrate); + // nrf_uart_baudrate_set() is not used here (registers are accessed + // directly) to make it possible to set special baud rates like 56000 + // or 31250. - // Reconfigure UART peripheral. - nrf_uart_baudrate_set(UART_INSTANCE, UART_CB.baudrate); + uint32_t const acceptedSpeeds[][2] = { + { 1200, UART_BAUDRATE_BAUDRATE_Baud1200 }, + { 2400, UART_BAUDRATE_BAUDRATE_Baud2400 }, + { 4800, UART_BAUDRATE_BAUDRATE_Baud4800 }, + { 9600, UART_BAUDRATE_BAUDRATE_Baud9600 }, + { 14400, UART_BAUDRATE_BAUDRATE_Baud14400 }, + { 19200, UART_BAUDRATE_BAUDRATE_Baud19200 }, + { 28800, UART_BAUDRATE_BAUDRATE_Baud28800 }, + { 31250, (0x00800000UL) /* 31250 baud */ }, + { 38400, UART_BAUDRATE_BAUDRATE_Baud38400 }, + { 56000, (0x00E51000UL) /* 56000 baud */ }, + { 57600, UART_BAUDRATE_BAUDRATE_Baud57600 }, + { 76800, UART_BAUDRATE_BAUDRATE_Baud76800 }, + { 115200, UART_BAUDRATE_BAUDRATE_Baud115200 }, + { 230400, UART_BAUDRATE_BAUDRATE_Baud230400 }, + { 250000, UART_BAUDRATE_BAUDRATE_Baud250000 }, + { 460800, UART_BAUDRATE_BAUDRATE_Baud460800 }, + { 921600, UART_BAUDRATE_BAUDRATE_Baud921600 }, + { 1000000, UART_BAUDRATE_BAUDRATE_Baud1M } + }; + + if (baudrate <= 1200) { + UART_INSTANCE->BAUDRATE = UART_BAUDRATE_BAUDRATE_Baud1200; + return; + } + + int const item_cnt = sizeof(acceptedSpeeds)/sizeof(acceptedSpeeds[0]); + for (int i = 1; i < item_cnt; i++) { + if ((uint32_t)baudrate < acceptedSpeeds[i][0]) { + UART_INSTANCE->BAUDRATE = acceptedSpeeds[i - 1][1]; + return; + } + } + + UART_INSTANCE->BAUDRATE = UART_BAUDRATE_BAUDRATE_Baud1M; } void serial_format(serial_t *obj, From c9c946f3b47ec861a5c6efd956d7da6c0e0d6955 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C5=82=C4=85bek=2C=20Andrzej?= Date: Wed, 14 Sep 2016 21:52:24 +0200 Subject: [PATCH 2/2] Made the constant array in serial_baud() static. --- hal/targets/hal/TARGET_NORDIC/TARGET_NRF5/serial_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hal/targets/hal/TARGET_NORDIC/TARGET_NRF5/serial_api.c b/hal/targets/hal/TARGET_NORDIC/TARGET_NRF5/serial_api.c index 4f47472cb1..d1a0fe6218 100644 --- a/hal/targets/hal/TARGET_NORDIC/TARGET_NRF5/serial_api.c +++ b/hal/targets/hal/TARGET_NORDIC/TARGET_NRF5/serial_api.c @@ -350,7 +350,7 @@ void serial_baud(serial_t *obj, int baudrate) // directly) to make it possible to set special baud rates like 56000 // or 31250. - uint32_t const acceptedSpeeds[][2] = { + static uint32_t const acceptedSpeeds[][2] = { { 1200, UART_BAUDRATE_BAUDRATE_Baud1200 }, { 2400, UART_BAUDRATE_BAUDRATE_Baud2400 }, { 4800, UART_BAUDRATE_BAUDRATE_Baud4800 },