mbed library sources. Supersedes mbed-src.

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

Revision:
181:57724642e740
Parent:
180:96ed750bd169
Child:
186:707f6e361f3e
--- a/targets/TARGET_STM/TARGET_STM32F0/serial_device.c	Wed Jan 17 15:23:54 2018 +0000
+++ b/targets/TARGET_STM/TARGET_STM32F0/serial_device.c	Fri Feb 16 16:09:33 2018 +0000
@@ -47,87 +47,101 @@
 
 static uart_irq_handler irq_handler;
 
+// Defined in serial_api.c
+inline int8_t get_uart_index(UARTName uart_name);
+
 /******************************************************************************
  * INTERRUPTS HANDLING
  ******************************************************************************/
 
-static void uart_irq(int id)
+static void uart_irq(UARTName uart_name)
 {
-    UART_HandleTypeDef * huart = &uart_handlers[id];
-    
-    if (serial_irq_ids[id] != 0) {
-        if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) {
-            if (__HAL_UART_GET_IT(huart, UART_IT_TXE) != RESET) {
-                irq_handler(serial_irq_ids[id], TxIrq);
+    int8_t id = get_uart_index(uart_name);
+
+    if (id >= 0) {
+        UART_HandleTypeDef * huart = &uart_handlers[id];
+        if (serial_irq_ids[id] != 0) {
+            if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) {
+                if (__HAL_UART_GET_IT(huart, UART_IT_TXE) != RESET) {
+                    irq_handler(serial_irq_ids[id], TxIrq);
+                }
             }
-        }
-        if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) {
-            if (__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESET) {
-                irq_handler(serial_irq_ids[id], RxIrq);
-                /*  Flag has been cleared when reading the content */
+            if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) {
+                if (__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESET) {
+                    irq_handler(serial_irq_ids[id], RxIrq);
+                    /* Flag has been cleared when reading the content */
+                }
             }
-        }
-        if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
-            if (__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET) {
-                __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF);
+            if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
+                if (__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET) {
+                    __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF);
+                }
             }
         }
     }
 }
 
+#if defined(USART1_BASE)
 static void uart1_irq(void)
 {
-    uart_irq(0);
+    uart_irq(UART_1);
 }
+#endif
 
 #if defined(USART2_BASE)
 static void uart2_irq(void)
 {
-    uart_irq(1);
-}
-#endif
-
-#if defined USART3_BASE
-static void uart3_irq(void)
-{
-    uart_irq(2);
-}
-#endif
-
-#if defined USART4_BASE
-static void uart4_irq(void)
-{
-    uart_irq(3);
+    uart_irq(UART_2);
 }
 #endif
 
-#if defined USART5_BASE
-static void uart5_irq(void)
+// Used for both USART3_4_IRQn and USART3_8_IRQn
+static void uart3_8_irq(void)
 {
-    uart_irq(4);
-}
+#if defined(TARGET_STM32F091RC)
+#if defined(USART3_BASE)
+  if (__HAL_GET_PENDING_IT(HAL_ITLINE_USART3) != RESET) {
+      uart_irq(UART_3);
+  }
 #endif
-
-#if defined USART6_BASE
-static void uart6_irq(void)
-{
-    uart_irq(5);
-}
+#if defined(USART4_BASE)
+  if (__HAL_GET_PENDING_IT(HAL_ITLINE_USART4) != RESET) {
+      uart_irq(UART_4);
+  }
+#endif
+#if defined(USART5_BASE)
+  if (__HAL_GET_PENDING_IT(HAL_ITLINE_USART5) != RESET) {
+      uart_irq(UART_5);
+  }
+#endif
+#if defined(USART6_BASE)
+  if (__HAL_GET_PENDING_IT(HAL_ITLINE_USART6) != RESET) {
+      uart_irq(UART_6);
+  }
 #endif
-
-#if defined USART7_BASE
-static void uart7_irq(void)
-{
-    uart_irq(6);
-}
+#if defined(USART7_BASE)
+  if (__HAL_GET_PENDING_IT(HAL_ITLINE_USART7) != RESET) {
+      uart_irq(UART_7);
+  }
+#endif
+#if defined(USART8_BASE)
+  if (__HAL_GET_PENDING_IT(HAL_ITLINE_USART8) != RESET) {
+      uart_irq(UART_8);
+  }
 #endif
-
-#if defined USART8_BASE
-static void uart8_irq(void)
-{
-    uart_irq(7);
+#else // TARGET_STM32F070RB, TARGET_STM32F072RB
+#if defined(USART3_BASE)
+  if (USART3->ISR & (UART_FLAG_TXE | UART_FLAG_RXNE | UART_FLAG_ORE)) {
+      uart_irq(UART_3);
+  }
+#endif
+#if defined(USART4_BASE)
+  if (USART4->ISR & (UART_FLAG_TXE | UART_FLAG_RXNE | UART_FLAG_ORE)) {
+      uart_irq(UART_4);
+  }
+#endif
+#endif
 }
-#endif
 
 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
 {
@@ -144,10 +158,12 @@
     IRQn_Type irq_n = (IRQn_Type)0;
     uint32_t vector = 0;
 
+#if defined(USART1_BASE)
     if (obj_s->uart == UART_1) {
         irq_n = USART1_IRQn;
         vector = (uint32_t)&uart1_irq;
     }
+#endif
 
 #if defined(USART2_BASE)
     if (obj_s->uart == UART_2) {
@@ -156,53 +172,55 @@
     }
 #endif
 
-#if defined (TARGET_STM32F091RC)
-    if (obj_s->uart == UART_3) {
-        irq_n = USART3_8_IRQn;
-        vector = (uint32_t)&uart3_irq;
-    }
-
-    if (obj_s->uart == UART_4) {
-        irq_n = USART3_8_IRQn;
-        vector = (uint32_t)&uart4_irq;
-    }
-
-    if (obj_s->uart == UART_5) {
-        irq_n = USART3_8_IRQn;
-        vector = (uint32_t)&uart5_irq;
-    }
-
-    if (obj_s->uart == UART_6) {
-        irq_n = USART3_8_IRQn;
-        vector = (uint32_t)&uart6_irq;
-    }
-
-    if (obj_s->uart == UART_7) {
-        irq_n = USART3_8_IRQn;
-        vector = (uint32_t)&uart7_irq;
-    }
-
-    if (obj_s->uart == UART_8) {
-        irq_n = USART3_8_IRQn;
-        vector = (uint32_t)&uart8_irq;
-    }
-
-#elif defined (TARGET_STM32F030R8) || defined (TARGET_STM32F051R8)
-
-#else
 #if defined(USART3_BASE)
     if (obj_s->uart == UART_3) {
+#if defined(TARGET_STM32F091RC)
+        irq_n = USART3_8_IRQn;
+#else
         irq_n = USART3_4_IRQn;
-        vector = (uint32_t)&uart3_irq;
+#endif
+        vector = (uint32_t)&uart3_8_irq;
     }
 #endif
 
 #if defined(USART4_BASE)
     if (obj_s->uart == UART_4) {
+#if defined(TARGET_STM32F091RC)
+        irq_n = USART3_8_IRQn;
+#else
         irq_n = USART3_4_IRQn;
-        vector = (uint32_t)&uart4_irq;
+#endif
+        vector = (uint32_t)&uart3_8_irq;
+    }
+#endif
+
+// Below usart are available only on TARGET_STM32F091RC
+#if defined(USART5_BASE)
+    if (obj_s->uart == UART_5) {
+        irq_n = USART3_8_IRQn;
+        vector = (uint32_t)&uart3_8_irq;
     }
 #endif
+
+#if defined(USART6_BASE)
+    if (obj_s->uart == UART_6) {
+        irq_n = USART3_8_IRQn;
+        vector = (uint32_t)&uart3_8_irq;
+    }
+#endif
+
+#if defined(USART7_BASE)
+    if (obj_s->uart == UART_7) {
+        irq_n = USART3_8_IRQn;
+        vector = (uint32_t)&uart3_8_irq;
+    }
+#endif
+
+#if defined(USART8_BASE)
+    if (obj_s->uart == UART_8) {
+        irq_n = USART3_8_IRQn;
+        vector = (uint32_t)&uart3_8_irq;
+    }
 #endif
 
     if (enable) {
@@ -231,7 +249,7 @@
         }
 
         if (all_disabled) {
-          NVIC_DisableIRQ(irq_n);
+            NVIC_DisableIRQ(irq_n);
         }
     }
 }
@@ -344,44 +362,75 @@
 /**
 * Get index of serial object TX IRQ, relating it to the physical peripheral.
 *
-* @param obj pointer to serial object
+* @param uart_name i.e. UART_1, UART_2, ...
 * @return internal NVIC TX IRQ index of U(S)ART peripheral
 */
-static IRQn_Type serial_get_irq_n(serial_t *obj)
+static IRQn_Type serial_get_irq_n(UARTName uart_name)
 {
-    struct serial_s *obj_s = SERIAL_S(obj);
     IRQn_Type irq_n;
 
-    switch (obj_s->index) {
+    switch (uart_name) {
+
 #if defined(USART1_BASE)
-        case 0:
+        case UART_1:
             irq_n = USART1_IRQn;
             break;
 #endif
+
 #if defined(USART2_BASE)
-        case 1:
+        case UART_2:
             irq_n = USART2_IRQn;
             break;
 #endif
+
+#if defined(USART3_BASE)
+        case UART_3:
 #if defined (TARGET_STM32F091RC)
-        case 2:
-        case 3:
-        case 4:
-        case 5:
-        case 6:
-        case 7:
+            irq_n = USART3_8_IRQn;
+#else
+            irq_n = USART3_4_IRQn;
+#endif
+            break;
+#endif
+
+#if defined(USART4_BASE)
+        case UART_4:
+#if defined (TARGET_STM32F091RC)
+            irq_n = USART3_8_IRQn;
+#else
+            irq_n = USART3_4_IRQn;
+#endif
+            break;
+#endif
+
+#if defined(USART5_BASE)
+        case UART_5:
             irq_n = USART3_8_IRQn;
             break;
-#elif !defined (TARGET_STM32F030R8) && !defined (TARGET_STM32F051R8)
-        case 2:
-        case 3:
-            irq_n = USART3_4_IRQn;
+#endif
+
+#if defined(USART6_BASE)
+        case UART_6:
+            irq_n = USART3_8_IRQn;
             break;
 #endif
+
+#if defined(USART7_BASE)
+        case UART_7:
+            irq_n = USART3_8_IRQn;
+            break;
+#endif
+
+#if defined(USART8_BASE)
+        case UART_8:
+            irq_n = USART3_8_IRQn;
+            break;
+#endif
+
         default:
             irq_n = (IRQn_Type)0;
     }
-    
+
     return irq_n;
 }
 
@@ -427,7 +476,7 @@
     serial_enable_event(obj, event, 1); // Set only the wanted events
     
     // Enable interrupt
-    IRQn_Type irq_n = serial_get_irq_n(obj);
+    IRQn_Type irq_n = serial_get_irq_n(obj_s->uart);
     NVIC_ClearPendingIRQ(irq_n);
     NVIC_DisableIRQ(irq_n);
     NVIC_SetPriority(irq_n, 1);
@@ -477,7 +526,7 @@
     
     serial_rx_buffer_set(obj, rx, rx_length, rx_width);
 
-    IRQn_Type irq_n = serial_get_irq_n(obj);
+    IRQn_Type irq_n = serial_get_irq_n(obj_s->uart);
     NVIC_ClearPendingIRQ(irq_n);
     NVIC_DisableIRQ(irq_n);
     NVIC_SetPriority(irq_n, 0);
@@ -635,7 +684,7 @@
     
     // clear flags
     __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_TCF);
-    
+
     // reset states
     huart->TxXferCount = 0;
     // update handle state