Skip to content

Commit 48b1b8e

Browse files
authored
Merge pull request #15221 from amcnicoll/amcnicoll/shared_uart_isr
Add ability to use multiple UARTs on STM32L0, STM32G0 when IRQ is shared
2 parents a58f8dd + fe698ea commit 48b1b8e

File tree

2 files changed

+49
-72
lines changed

2 files changed

+49
-72
lines changed

targets/TARGET_STM/TARGET_STM32G0/serial_device.c

+42-63
Original file line numberDiff line numberDiff line change
@@ -19,32 +19,27 @@
1919

2020
#if defined (STM32G030xx) || defined (STM32G050xx)
2121
#define UART_NUM (2)
22+
#define USART_GROUP1_IRQn USART2_IRQn
2223
#elif defined (STM32G031xx) || defined (STM32G041xx) || defined (STM32G051xx) || defined (STM32G061xx)
2324
#define UART_NUM (3)
25+
#define USART_GROUP1_IRQn USART2_IRQn
26+
#define USART_GROUP2_IRQn LPUART1_IRQn
2427
#elif defined (STM32G070xx)
2528
#define UART_NUM (4)
26-
#define USART3_IRQn USART3_4_IRQn
27-
#define USART4_IRQn USART3_4_IRQn
29+
#define USART_GROUP1_IRQn USART2_IRQn
30+
#define USART_GROUP2_IRQn USART3_4_IRQn
2831
#elif defined (STM32G071xx) || defined (STM32G081xx)
2932
#define UART_NUM (5)
30-
#define USART3_IRQn USART3_4_LPUART1_IRQn
31-
#define USART4_IRQn USART3_4_LPUART1_IRQn
32-
#define LPUART1_IRQn USART3_4_LPUART1_IRQn
33+
#define USART_GROUP1_IRQn USART2_IRQn
34+
#define USART_GROUP2_IRQn USART3_4_LPUART1_IRQn
3335
#elif defined (STM32G0B0xx)
3436
#define UART_NUM (6)
35-
#define USART3_IRQn USART3_4_5_6_IRQn
36-
#define USART4_IRQn USART3_4_5_6_IRQn
37-
#define USART5_IRQn USART3_4_5_6_IRQn
38-
#define USART6_IRQn USART3_4_5_6_IRQn
37+
#define USART_GROUP1_IRQn USART2_IRQn
38+
#define USART_GROUP2_IRQn USART3_4_5_6_IRQn
3939
#elif defined (STM32G0B1xx) || defined (STM32G0C1xx)
4040
#define UART_NUM (8)
41-
#define USART2_IRQn USART2_LPUART2_IRQn
42-
#define USART3_IRQn USART3_4_5_6_LPUART1_IRQn
43-
#define USART4_IRQn USART3_4_5_6_LPUART1_IRQn
44-
#define USART5_IRQn USART3_4_5_6_LPUART1_IRQn
45-
#define USART6_IRQn USART3_4_5_6_LPUART1_IRQn
46-
#define LPUART1_IRQn USART3_4_5_6_LPUART1_IRQn
47-
#define LPUART2_IRQn USART2_LPUART2_IRQn
41+
#define USART_GROUP1_IRQn USART2_LPUART2_IRQn
42+
#define USART_GROUP2_IRQn USART3_4_5_6_LPUART1_IRQn
4843
#endif
4944

5045
uint32_t serial_irq_ids[UART_NUM] = {0};
@@ -93,52 +88,36 @@ static void uart1_irq(void)
9388
}
9489
#endif
9590

96-
#if defined(USART2_BASE)
97-
static void uart2_irq(void)
91+
#if defined (USART_GROUP1_IRQn)
92+
static void uart_group1_irq(void)
9893
{
94+
#if defined(USART2_BASE)
9995
uart_irq(UART_2);
96+
#endif
97+
#if defined(LPUART2_BASE)
98+
uart_irq(LPUART_2);
99+
#endif
100100
}
101101
#endif
102102

103-
#if defined(USART3_BASE)
104-
static void uart3_irq(void)
103+
#if defined(USART_GROUP2_IRQn)
104+
static void uart_group2_irq(void)
105105
{
106+
#if defined(USART3_BASE)
106107
uart_irq(UART_3);
107-
}
108108
#endif
109-
110109
#if defined(USART4_BASE)
111-
static void uart4_irq(void)
112-
{
113110
uart_irq(UART_4);
114-
}
115111
#endif
116-
117112
#if defined(USART5_BASE)
118-
static void uart5_irq(void)
119-
{
120113
uart_irq(UART_5);
121-
}
122114
#endif
123-
124115
#if defined(USART6_BASE)
125-
static void uart6_irq(void)
126-
{
127116
uart_irq(UART_6);
128-
}
129117
#endif
130-
131118
#if defined(LPUART1_BASE)
132-
static void lpuart1_irq(void)
133-
{
134119
uart_irq(LPUART_1);
135-
}
136120
#endif
137-
138-
#if defined(LPUART2_BASE)
139-
static void lpuart2_irq(void)
140-
{
141-
uart_irq(LPUART_2);
142121
}
143122
#endif
144123

@@ -166,50 +145,50 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
166145

167146
#if defined(USART2_BASE)
168147
if (obj_s->uart == UART_2) {
169-
irq_n = USART2_IRQn;
170-
vector = (uint32_t)&uart2_irq;
148+
irq_n = USART_GROUP1_IRQn;
149+
vector = (uint32_t)&uart_group1_irq;
171150
}
172151
#endif
173152

174153
#if defined(USART3_BASE)
175154
if (obj_s->uart == UART_3) {
176-
irq_n = USART3_IRQn;
177-
vector = (uint32_t)&uart3_irq;
155+
irq_n = USART_GROUP2_IRQn;
156+
vector = (uint32_t)&uart_group2_irq;
178157
}
179158
#endif
180159

181160
#if defined(USART4_BASE)
182161
if (obj_s->uart == UART_4) {
183-
irq_n = USART4_IRQn;
184-
vector = (uint32_t)&uart4_irq;
162+
irq_n = USART_GROUP2_IRQn;
163+
vector = (uint32_t)&uart_group2_irq;
185164
}
186165
#endif
187166

188167
#if defined(USART5_BASE)
189168
if (obj_s->uart == UART_5) {
190-
irq_n = USART5_IRQn;
191-
vector = (uint32_t)&uart5_irq;
169+
irq_n = USART_GROUP2_IRQn;
170+
vector = (uint32_t)&uart_group2_irq;
192171
}
193172
#endif
194173

195174
#if defined(USART6_BASE)
196175
if (obj_s->uart == UART_6) {
197-
irq_n = USART6_IRQn;
198-
vector = (uint32_t)&uart6_irq;
176+
irq_n = USART_GROUP2_IRQn;
177+
vector = (uint32_t)&uart_group2_irq;
199178
}
200179
#endif
201180

202181
#if defined(LPUART1_BASE)
203182
if (obj_s->uart == LPUART_1) {
204-
irq_n = LPUART1_IRQn;
205-
vector = (uint32_t)&lpuart1_irq;
183+
irq_n = USART_GROUP2_IRQn;
184+
vector = (uint32_t)&uart_group2_irq;
206185
}
207186
#endif
208187

209188
#if defined(LPUART2_BASE)
210189
if (obj_s->uart == LPUART_2) {
211-
irq_n = LPUART2_IRQn;
212-
vector = (uint32_t)&lpuart2_irq;
190+
irq_n = USART_GROUP1_IRQn;
191+
vector = (uint32_t)&uart_group1_irq;
213192
}
214193
#endif
215194

@@ -382,37 +361,37 @@ static IRQn_Type serial_get_irq_n(UARTName uart_name)
382361
#endif
383362
#if defined(USART2_BASE)
384363
case UART_2:
385-
irq_n = USART2_IRQn;
364+
irq_n = USART_GROUP1_IRQn;
386365
break;
387366
#endif
388367
#if defined(USART3_BASE)
389368
case UART_3:
390-
irq_n = USART3_IRQn;
369+
irq_n = USART_GROUP2_IRQn;
391370
break;
392371
#endif
393372
#if defined(USART4_BASE)
394373
case UART_4:
395-
irq_n = USART4_IRQn;
374+
irq_n = USART_GROUP2_IRQn;
396375
break;
397376
#endif
398377
#if defined(USART5_BASE)
399378
case UART_5:
400-
irq_n = USART5_IRQn;
379+
irq_n = USART_GROUP2_IRQn;
401380
break;
402381
#endif
403382
#if defined(USART6_BASE)
404383
case UART_6:
405-
irq_n = USART6_IRQn;
384+
irq_n = USART_GROUP2_IRQn;
406385
break;
407386
#endif
408387
#if defined(LPUART1_BASE)
409388
case LPUART_1:
410-
irq_n = LPUART1_IRQn;
389+
irq_n = USART_GROUP2_IRQn;
411390
break;
412391
#endif
413392
#if defined(LPUART2_BASE)
414393
case LPUART_2:
415-
irq_n = LPUART2_IRQn;
394+
irq_n = USART_GROUP1_IRQn;
416395
break;
417396
#endif
418397
default:

targets/TARGET_STM/TARGET_STM32L0/serial_device.c

+7-9
Original file line numberDiff line numberDiff line change
@@ -79,17 +79,15 @@ static void uart2_irq(void)
7979
}
8080
#endif
8181

82-
#if defined(USART4_BASE)
83-
static void uart4_irq(void)
82+
#if defined(USART4_BASE) || defined(USART5_BASE)
83+
static void uart4_5_irq(void)
8484
{
85+
#if defined(USART4_BASE)
8586
uart_irq(UART_4);
86-
}
8787
#endif
88-
89-
#if defined(USART5_BASE)
90-
static void uart5_irq(void)
91-
{
88+
#if defined(USART4_BASE)
9289
uart_irq(UART_5);
90+
#endif
9391
}
9492
#endif
9593

@@ -132,14 +130,14 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
132130
#if defined(USART4_BASE)
133131
if (obj_s->uart == UART_4) {
134132
irq_n = USART4_5_IRQn;
135-
vector = (uint32_t)&uart4_irq;
133+
vector = (uint32_t)&uart4_5_irq;
136134
}
137135
#endif
138136

139137
#if defined(USART5_BASE)
140138
if (obj_s->uart == UART_5) {
141139
irq_n = USART4_5_IRQn;
142-
vector = (uint32_t)&uart5_irq;
140+
vector = (uint32_t)&uart4_5_irq;
143141
}
144142
#endif
145143

0 commit comments

Comments
 (0)