Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-dev by
Diff: targets/TARGET_STM/TARGET_STM32F0/serial_device.c
- Revision:
- 182:57724642e740
- Parent:
- 181:96ed750bd169
--- 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