Skip to content

Commit 8f9b115

Browse files
committed
Add ability to use multiple UARTs on STM32L0, STM32G0 when IRQ is shared
1 parent 9bdbe9c commit 8f9b115

File tree

2 files changed

+52
-76
lines changed

2 files changed

+52
-76
lines changed

targets/TARGET_STM/TARGET_STM32G0/serial_device.c

Lines changed: 44 additions & 66 deletions
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,35 @@ 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
}
101-
#endif
102101

103-
#if defined(USART3_BASE)
104-
static void uart3_irq(void)
102+
#if defined(USART_GROUP2_IRQn)
103+
static void uart_group2_irq(void)
105104
{
105+
#if defined(USART3_BASE)
106106
uart_irq(UART_3);
107-
}
108-
#endif
109-
110-
#if defined(USART4_BASE)
111-
static void uart4_irq(void)
112-
{
107+
#endif
108+
#if defined(USART4_BASE)
113109
uart_irq(UART_4);
114-
}
115-
#endif
116-
117-
#if defined(USART5_BASE)
118-
static void uart5_irq(void)
119-
{
110+
#endif
111+
#if defined(USART5_BASE)
120112
uart_irq(UART_5);
121-
}
122-
#endif
123-
124-
#if defined(USART6_BASE)
125-
static void uart6_irq(void)
126-
{
113+
#endif
114+
#if defined(USART6_BASE)
127115
uart_irq(UART_6);
128-
}
129-
#endif
130-
131-
#if defined(LPUART1_BASE)
132-
static void lpuart1_irq(void)
133-
{
116+
#endif
117+
#if defined(LPUART1_BASE)
134118
uart_irq(LPUART_1);
135-
}
136-
#endif
137-
138-
#if defined(LPUART2_BASE)
139-
static void lpuart2_irq(void)
140-
{
141-
uart_irq(LPUART_2);
119+
#endif
142120
}
143121
#endif
144122

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

167145
#if defined(USART2_BASE)
168146
if (obj_s->uart == UART_2) {
169-
irq_n = USART2_IRQn;
170-
vector = (uint32_t)&uart2_irq;
147+
irq_n = USART_GROUP1_IRQn;
148+
vector = (uint32_t)&uart_group1_irq;
171149
}
172150
#endif
173151

174152
#if defined(USART3_BASE)
175153
if (obj_s->uart == UART_3) {
176-
irq_n = USART3_IRQn;
177-
vector = (uint32_t)&uart3_irq;
154+
irq_n = USART_GROUP2_IRQn;
155+
vector = (uint32_t)&uart_group2_irq;
178156
}
179157
#endif
180158

181159
#if defined(USART4_BASE)
182160
if (obj_s->uart == UART_4) {
183-
irq_n = USART4_IRQn;
184-
vector = (uint32_t)&uart4_irq;
161+
irq_n = USART_GROUP2_IRQn;
162+
vector = (uint32_t)&uart_group2_irq;
185163
}
186164
#endif
187165

188166
#if defined(USART5_BASE)
189167
if (obj_s->uart == UART_5) {
190-
irq_n = USART5_IRQn;
191-
vector = (uint32_t)&uart5_irq;
168+
irq_n = USART_GROUP2_IRQn;
169+
vector = (uint32_t)&uart_group2_irq;
192170
}
193171
#endif
194172

195173
#if defined(USART6_BASE)
196174
if (obj_s->uart == UART_6) {
197-
irq_n = USART6_IRQn;
198-
vector = (uint32_t)&uart6_irq;
175+
irq_n = USART_GROUP2_IRQn;
176+
vector = (uint32_t)&uart_group2_irq;
199177
}
200178
#endif
201179

202180
#if defined(LPUART1_BASE)
203181
if (obj_s->uart == LPUART_1) {
204-
irq_n = LPUART1_IRQn;
205-
vector = (uint32_t)&lpuart1_irq;
182+
irq_n = USART_GROUP2_IRQn;
183+
vector = (uint32_t)&uart_group2_irq;
206184
}
207185
#endif
208186

209187
#if defined(LPUART2_BASE)
210188
if (obj_s->uart == LPUART_2) {
211-
irq_n = LPUART2_IRQn;
212-
vector = (uint32_t)&lpuart2_irq;
189+
irq_n = USART2_LPUART2_IRQn;
190+
vector = (uint32_t)&uart_group1_irq;
213191
}
214192
#endif
215193

targets/TARGET_STM/TARGET_STM32L0/serial_device.c

Lines changed: 8 additions & 10 deletions
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-
}
87-
#endif
88-
89-
#if defined(USART5_BASE)
90-
static void uart5_irq(void)
91-
{
87+
#endif
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)