mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Revision:
148:21d94c44109e
Parent:
144:ef7eb2e8f9f7
--- a/targets/hal/TARGET_NORDIC/TARGET_NRF5/serial_api.c	Fri Sep 16 16:24:25 2016 +0100
+++ b/targets/hal/TARGET_NORDIC/TARGET_NRF5/serial_api.c	Fri Sep 30 18:07:01 2016 +0100
@@ -344,64 +344,47 @@
     }
 }
 
-static nrf_uart_baudrate_t baud_translate(int rate)
+void serial_baud(serial_t *obj, int baudrate)
 {
-    nrf_uart_baudrate_t baud;
+    // 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.
 
-    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;
-            }
+    static 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;
         }
     }
-    return baud;
-}
-void serial_baud(serial_t *obj, int baudrate)
-{
-    (void)obj;
-    UART_CB.baudrate = baud_translate(baudrate);
 
-    // Reconfigure UART peripheral.
-    nrf_uart_baudrate_set(UART_INSTANCE, UART_CB.baudrate);
+    UART_INSTANCE->BAUDRATE = UART_BAUDRATE_BAUDRATE_Baud1M;
 }
 
 void serial_format(serial_t *obj,