Add ability to use multiple UARTs on STM32L0, STM32G0 when IRQ is shared

pull/15221/head
Anthony Mcnicoll 2022-02-05 12:00:23 -05:00
parent 9bdbe9cb85
commit 8f9b1153ef
2 changed files with 59 additions and 83 deletions

View File

@ -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

View File

@ -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