From 8f9b1153ef925f56b2bd8e1ee9ef4003c9b20c67 Mon Sep 17 00:00:00 2001 From: Anthony Mcnicoll Date: Sat, 5 Feb 2022 12:00:23 -0500 Subject: [PATCH] Add ability to use multiple UARTs on STM32L0, STM32G0 when IRQ is shared --- .../TARGET_STM/TARGET_STM32G0/serial_device.c | 124 +++++++----------- .../TARGET_STM/TARGET_STM32L0/serial_device.c | 18 ++- 2 files changed, 59 insertions(+), 83 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32G0/serial_device.c b/targets/TARGET_STM/TARGET_STM32G0/serial_device.c index c5f936b06b..f7f3919075 100644 --- a/targets/TARGET_STM/TARGET_STM32G0/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32G0/serial_device.c @@ -19,32 +19,27 @@ #if defined (STM32G030xx) || defined (STM32G050xx) #define UART_NUM (2) +#define USART_GROUP1_IRQn USART2_IRQn #elif defined (STM32G031xx) || defined (STM32G041xx) || defined (STM32G051xx) || defined (STM32G061xx) #define UART_NUM (3) +#define USART_GROUP1_IRQn USART2_IRQn +#define USART_GROUP2_IRQn LPUART1_IRQn #elif defined (STM32G070xx) #define UART_NUM (4) -#define USART3_IRQn USART3_4_IRQn -#define USART4_IRQn USART3_4_IRQn +#define USART_GROUP1_IRQn USART2_IRQn +#define USART_GROUP2_IRQn USART3_4_IRQn #elif defined (STM32G071xx) || defined (STM32G081xx) #define UART_NUM (5) -#define USART3_IRQn USART3_4_LPUART1_IRQn -#define USART4_IRQn USART3_4_LPUART1_IRQn -#define LPUART1_IRQn USART3_4_LPUART1_IRQn +#define USART_GROUP1_IRQn USART2_IRQn +#define USART_GROUP2_IRQn USART3_4_LPUART1_IRQn #elif defined (STM32G0B0xx) #define UART_NUM (6) -#define USART3_IRQn USART3_4_5_6_IRQn -#define USART4_IRQn USART3_4_5_6_IRQn -#define USART5_IRQn USART3_4_5_6_IRQn -#define USART6_IRQn USART3_4_5_6_IRQn +#define USART_GROUP1_IRQn USART2_IRQn +#define USART_GROUP2_IRQn USART3_4_5_6_IRQn #elif defined (STM32G0B1xx) || defined (STM32G0C1xx) #define UART_NUM (8) -#define USART2_IRQn USART2_LPUART2_IRQn -#define USART3_IRQn USART3_4_5_6_LPUART1_IRQn -#define USART4_IRQn USART3_4_5_6_LPUART1_IRQn -#define USART5_IRQn USART3_4_5_6_LPUART1_IRQn -#define USART6_IRQn USART3_4_5_6_LPUART1_IRQn -#define LPUART1_IRQn USART3_4_5_6_LPUART1_IRQn -#define LPUART2_IRQn USART2_LPUART2_IRQn +#define USART_GROUP1_IRQn USART2_LPUART2_IRQn +#define USART_GROUP2_IRQn USART3_4_5_6_LPUART1_IRQn #endif uint32_t serial_irq_ids[UART_NUM] = {0}; @@ -93,52 +88,35 @@ static void uart1_irq(void) } #endif -#if defined(USART2_BASE) -static void uart2_irq(void) +#if defined (USART_GROUP1_IRQn) +static void uart_group1_irq(void) { + #if defined(USART2_BASE) uart_irq(UART_2); -} -#endif - -#if defined(USART3_BASE) -static void uart3_irq(void) -{ - uart_irq(UART_3); -} -#endif - -#if defined(USART4_BASE) -static void uart4_irq(void) -{ - uart_irq(UART_4); -} -#endif - -#if defined(USART5_BASE) -static void uart5_irq(void) -{ - uart_irq(UART_5); -} -#endif - -#if defined(USART6_BASE) -static void uart6_irq(void) -{ - uart_irq(UART_6); -} -#endif - -#if defined(LPUART1_BASE) -static void lpuart1_irq(void) -{ - uart_irq(LPUART_1); -} -#endif - -#if defined(LPUART2_BASE) -static void lpuart2_irq(void) -{ + #endif + #if defined(LPUART2_BASE) uart_irq(LPUART_2); + #endif +} + +#if defined(USART_GROUP2_IRQn) +static void uart_group2_irq(void) +{ + #if defined(USART3_BASE) + uart_irq(UART_3); + #endif + #if defined(USART4_BASE) + uart_irq(UART_4); + #endif + #if defined(USART5_BASE) + uart_irq(UART_5); + #endif + #if defined(USART6_BASE) + uart_irq(UART_6); + #endif + #if defined(LPUART1_BASE) + uart_irq(LPUART_1); + #endif } #endif @@ -166,50 +144,50 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) #if defined(USART2_BASE) if (obj_s->uart == UART_2) { - irq_n = USART2_IRQn; - vector = (uint32_t)&uart2_irq; + irq_n = USART_GROUP1_IRQn; + vector = (uint32_t)&uart_group1_irq; } #endif #if defined(USART3_BASE) if (obj_s->uart == UART_3) { - irq_n = USART3_IRQn; - vector = (uint32_t)&uart3_irq; + irq_n = USART_GROUP2_IRQn; + vector = (uint32_t)&uart_group2_irq; } #endif #if defined(USART4_BASE) if (obj_s->uart == UART_4) { - irq_n = USART4_IRQn; - vector = (uint32_t)&uart4_irq; + irq_n = USART_GROUP2_IRQn; + vector = (uint32_t)&uart_group2_irq; } #endif #if defined(USART5_BASE) if (obj_s->uart == UART_5) { - irq_n = USART5_IRQn; - vector = (uint32_t)&uart5_irq; + irq_n = USART_GROUP2_IRQn; + vector = (uint32_t)&uart_group2_irq; } #endif #if defined(USART6_BASE) if (obj_s->uart == UART_6) { - irq_n = USART6_IRQn; - vector = (uint32_t)&uart6_irq; + irq_n = USART_GROUP2_IRQn; + vector = (uint32_t)&uart_group2_irq; } #endif #if defined(LPUART1_BASE) if (obj_s->uart == LPUART_1) { - irq_n = LPUART1_IRQn; - vector = (uint32_t)&lpuart1_irq; + irq_n = USART_GROUP2_IRQn; + vector = (uint32_t)&uart_group2_irq; } #endif #if defined(LPUART2_BASE) if (obj_s->uart == LPUART_2) { - irq_n = LPUART2_IRQn; - vector = (uint32_t)&lpuart2_irq; + irq_n = USART2_LPUART2_IRQn; + vector = (uint32_t)&uart_group1_irq; } #endif diff --git a/targets/TARGET_STM/TARGET_STM32L0/serial_device.c b/targets/TARGET_STM/TARGET_STM32L0/serial_device.c index 22e66ccd16..1cf3a53e18 100644 --- a/targets/TARGET_STM/TARGET_STM32L0/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32L0/serial_device.c @@ -79,17 +79,15 @@ static void uart2_irq(void) } #endif -#if defined(USART4_BASE) -static void uart4_irq(void) +#if defined(USART4_BASE) || defined(USART5_BASE) +static void uart4_5_irq(void) { + #if defined(USART4_BASE) uart_irq(UART_4); -} -#endif - -#if defined(USART5_BASE) -static void uart5_irq(void) -{ + #endif + #if defined(USART4_BASE) uart_irq(UART_5); + #endif } #endif @@ -132,14 +130,14 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) #if defined(USART4_BASE) if (obj_s->uart == UART_4) { irq_n = USART4_5_IRQn; - vector = (uint32_t)&uart4_irq; + vector = (uint32_t)&uart4_5_irq; } #endif #if defined(USART5_BASE) if (obj_s->uart == UART_5) { irq_n = USART4_5_IRQn; - vector = (uint32_t)&uart5_irq; + vector = (uint32_t)&uart4_5_irq; } #endif