From 8f9b1153ef925f56b2bd8e1ee9ef4003c9b20c67 Mon Sep 17 00:00:00 2001 From: Anthony Mcnicoll Date: Sat, 5 Feb 2022 12:00:23 -0500 Subject: [PATCH 1/4] Add ability to use multiple UARTs on STM32L0, STM32G0 when IRQ is shared --- .../TARGET_STM/TARGET_STM32G0/serial_device.c | 110 +++++++----------- .../TARGET_STM/TARGET_STM32L0/serial_device.c | 18 ++- 2 files changed, 52 insertions(+), 76 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32G0/serial_device.c b/targets/TARGET_STM/TARGET_STM32G0/serial_device.c index c5f936b06bb..f7f3919075c 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(LPUART2_BASE) + uart_irq(LPUART_2); + #endif } -#endif -#if defined(USART3_BASE) -static void uart3_irq(void) +#if defined(USART_GROUP2_IRQn) +static void uart_group2_irq(void) { + #if defined(USART3_BASE) uart_irq(UART_3); -} -#endif - -#if defined(USART4_BASE) -static void uart4_irq(void) -{ + #endif + #if defined(USART4_BASE) uart_irq(UART_4); -} -#endif - -#if defined(USART5_BASE) -static void uart5_irq(void) -{ + #endif + #if defined(USART5_BASE) uart_irq(UART_5); -} -#endif - -#if defined(USART6_BASE) -static void uart6_irq(void) -{ + #endif + #if defined(USART6_BASE) uart_irq(UART_6); -} -#endif - -#if defined(LPUART1_BASE) -static void lpuart1_irq(void) -{ + #endif + #if defined(LPUART1_BASE) uart_irq(LPUART_1); -} -#endif - -#if defined(LPUART2_BASE) -static void lpuart2_irq(void) -{ - uart_irq(LPUART_2); + #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 22e66ccd161..1cf3a53e187 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 From f004f09b0b28898b77e2a66256f61884f2411f50 Mon Sep 17 00:00:00 2001 From: Anthony Mcnicoll Date: Sat, 12 Feb 2022 12:35:49 -0500 Subject: [PATCH 2/4] Consistency fixes for multiple UART support commit --- .../TARGET_STM/TARGET_STM32G0/serial_device.c | 30 +++++++++---------- .../TARGET_STM/TARGET_STM32L0/serial_device.c | 8 ++--- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32G0/serial_device.c b/targets/TARGET_STM/TARGET_STM32G0/serial_device.c index f7f3919075c..75cfd080c50 100644 --- a/targets/TARGET_STM/TARGET_STM32G0/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32G0/serial_device.c @@ -91,32 +91,32 @@ static void uart1_irq(void) #if defined (USART_GROUP1_IRQn) static void uart_group1_irq(void) { - #if defined(USART2_BASE) +#if defined(USART2_BASE) uart_irq(UART_2); - #endif - #if defined(LPUART2_BASE) +#endif +#if defined(LPUART2_BASE) uart_irq(LPUART_2); - #endif +#endif } #if defined(USART_GROUP2_IRQn) static void uart_group2_irq(void) { - #if defined(USART3_BASE) +#if defined(USART3_BASE) uart_irq(UART_3); - #endif - #if defined(USART4_BASE) +#endif +#if defined(USART4_BASE) uart_irq(UART_4); - #endif - #if defined(USART5_BASE) +#endif +#if defined(USART5_BASE) uart_irq(UART_5); - #endif - #if defined(USART6_BASE) +#endif +#if defined(USART6_BASE) uart_irq(UART_6); - #endif - #if defined(LPUART1_BASE) +#endif +#if defined(LPUART1_BASE) uart_irq(LPUART_1); - #endif +#endif } #endif @@ -186,7 +186,7 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) #if defined(LPUART2_BASE) if (obj_s->uart == LPUART_2) { - irq_n = USART2_LPUART2_IRQn; + irq_n = USART_GROUP1_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 1cf3a53e187..eb1927beaf7 100644 --- a/targets/TARGET_STM/TARGET_STM32L0/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32L0/serial_device.c @@ -82,12 +82,12 @@ static void uart2_irq(void) #if defined(USART4_BASE) || defined(USART5_BASE) static void uart4_5_irq(void) { - #if defined(USART4_BASE) +#if defined(USART4_BASE) uart_irq(UART_4); - #endif - #if defined(USART4_BASE) +#endif +#if defined(USART4_BASE) uart_irq(UART_5); - #endif +#endif } #endif From 41275f7e0dd1ee766fc0631e4f3535a86c8b39a9 Mon Sep 17 00:00:00 2001 From: Anthony Mcnicoll Date: Tue, 15 Feb 2022 21:46:12 -0500 Subject: [PATCH 3/4] Refactor missing #defs for multiple UART support --- targets/TARGET_STM/TARGET_STM32G0/serial_device.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/targets/TARGET_STM/TARGET_STM32G0/serial_device.c b/targets/TARGET_STM/TARGET_STM32G0/serial_device.c index 75cfd080c50..13b9f9ab739 100644 --- a/targets/TARGET_STM/TARGET_STM32G0/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32G0/serial_device.c @@ -360,37 +360,37 @@ static IRQn_Type serial_get_irq_n(UARTName uart_name) #endif #if defined(USART2_BASE) case UART_2: - irq_n = USART2_IRQn; + irq_n = USART_GROUP1_IRQn; break; #endif #if defined(USART3_BASE) case UART_3: - irq_n = USART3_IRQn; + irq_n = USART_GROUP2_IRQn; break; #endif #if defined(USART4_BASE) case UART_4: - irq_n = USART4_IRQn; + irq_n = USART_GROUP2_IRQn; break; #endif #if defined(USART5_BASE) case UART_5: - irq_n = USART5_IRQn; + irq_n = USART_GROUP2_IRQn; break; #endif #if defined(USART6_BASE) case UART_6: - irq_n = USART6_IRQn; + irq_n = USART_GROUP2_IRQn; break; #endif #if defined(LPUART1_BASE) case LPUART_1: - irq_n = LPUART1_IRQn; + irq_n = USART_GROUP2_IRQn; break; #endif #if defined(LPUART2_BASE) case LPUART_2: - irq_n = LPUART2_IRQn; + irq_n = USART_GROUP1_IRQn; break; #endif default: From fe698ea13b5bf97477fbbe04fbfa081015207be2 Mon Sep 17 00:00:00 2001 From: Anthony Mcnicoll Date: Sun, 20 Feb 2022 16:43:44 -0500 Subject: [PATCH 4/4] Missed matching #endif --- targets/TARGET_STM/TARGET_STM32G0/serial_device.c | 1 + 1 file changed, 1 insertion(+) diff --git a/targets/TARGET_STM/TARGET_STM32G0/serial_device.c b/targets/TARGET_STM/TARGET_STM32G0/serial_device.c index 13b9f9ab739..f436f95cde0 100644 --- a/targets/TARGET_STM/TARGET_STM32G0/serial_device.c +++ b/targets/TARGET_STM/TARGET_STM32G0/serial_device.c @@ -98,6 +98,7 @@ static void uart_group1_irq(void) uart_irq(LPUART_2); #endif } +#endif #if defined(USART_GROUP2_IRQn) static void uart_group2_irq(void)