mbed library sources. Supersedes mbed-src.
Dependents: Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more
Diff: targets/TARGET_STM/TARGET_STM32F0/serial_device.c
- 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