@@ -74,7 +74,34 @@ static gpio_channel_t channels[CHANNEL_NUM] = {
74
74
{.pin_mask = 0 },
75
75
#endif
76
76
#ifdef EXTI_IRQ6_NUM_LINES
77
- {.pin_mask = 0 }
77
+ {.pin_mask = 0 },
78
+ #endif
79
+ #ifdef EXTI_IRQ7_NUM_LINES
80
+ {.pin_mask = 0 },
81
+ #endif
82
+ #ifdef EXTI_IRQ8_NUM_LINES
83
+ {.pin_mask = 0 },
84
+ #endif
85
+ #ifdef EXTI_IRQ9_NUM_LINES
86
+ {.pin_mask = 0 },
87
+ #endif
88
+ #ifdef EXTI_IRQ10_NUM_LINES
89
+ {.pin_mask = 0 },
90
+ #endif
91
+ #ifdef EXTI_IRQ11_NUM_LINES
92
+ {.pin_mask = 0 },
93
+ #endif
94
+ #ifdef EXTI_IRQ12_NUM_LINES
95
+ {.pin_mask = 0 },
96
+ #endif
97
+ #ifdef EXTI_IRQ13_NUM_LINES
98
+ {.pin_mask = 0 },
99
+ #endif
100
+ #ifdef EXTI_IRQ14_NUM_LINES
101
+ {.pin_mask = 0 },
102
+ #endif
103
+ #ifdef EXTI_IRQ15_NUM_LINES
104
+ {.pin_mask = 0 },
78
105
#endif
79
106
};
80
107
@@ -91,6 +118,36 @@ static void handle_interrupt_in(uint32_t irq_index, uint32_t max_num_pin_line)
91
118
GPIO_TypeDef * gpio = (GPIO_TypeDef * )(gpio_channel -> channel_gpio [gpio_idx ]);
92
119
uint32_t pin = (uint32_t )(1 << (gpio_channel -> channel_pin [gpio_idx ]));
93
120
121
+ #if defined(TARGET_STM32L5 )
122
+ // Clear interrupt flag
123
+ if (LL_EXTI_IsActiveRisingFlag_0_31 (pin ) != RESET ) {
124
+ LL_EXTI_ClearRisingFlag_0_31 (pin );
125
+
126
+ if (gpio_channel -> channel_ids [gpio_idx ] == 0 ) {
127
+ continue ;
128
+ }
129
+
130
+ gpio_irq_event event = IRQ_RISE ;
131
+ irq_handler (gpio_channel -> channel_ids [gpio_idx ], event );
132
+
133
+ return ;
134
+ }
135
+
136
+ if (LL_EXTI_IsActiveFallingFlag_0_31 (pin ) != RESET ) {
137
+ LL_EXTI_ClearFallingFlag_0_31 (pin );
138
+
139
+ if (gpio_channel -> channel_ids [gpio_idx ] == 0 ) {
140
+ continue ;
141
+ }
142
+
143
+ gpio_irq_event event = IRQ_FALL ;
144
+ irq_handler (gpio_channel -> channel_ids [gpio_idx ], event );
145
+
146
+ return ;
147
+ }
148
+
149
+ #else /* TARGET_STM32L5 */
150
+
94
151
// Clear interrupt flag
95
152
if (__HAL_GPIO_EXTI_GET_FLAG (pin ) != RESET ) {
96
153
__HAL_GPIO_EXTI_CLEAR_FLAG (pin );
@@ -125,6 +182,7 @@ static void handle_interrupt_in(uint32_t irq_index, uint32_t max_num_pin_line)
125
182
126
183
return ;
127
184
}
185
+ #endif /* TARGET_STM32L5 */
128
186
}
129
187
}
130
188
error ("Unexpected Spurious interrupt index %" PRIu32 "\n" , irq_index );
@@ -167,19 +225,82 @@ static void gpio_irq4(void)
167
225
}
168
226
#endif
169
227
#ifdef EXTI_IRQ5_NUM_LINES
170
- // EXTI lines 5 to 9
228
+ // EXTI lines 5 to 9, except for STM32L5 line 5 only
171
229
static void gpio_irq5 (void )
172
230
{
173
231
handle_interrupt_in (5 , EXTI_IRQ5_NUM_LINES );
174
232
}
175
233
#endif
176
234
#ifdef EXTI_IRQ6_NUM_LINES
177
- // EXTI lines 10 to 15
235
+ // EXTI lines 10 to 15, except for STM32L5 line 6 only
178
236
static void gpio_irq6 (void )
179
237
{
180
238
handle_interrupt_in (6 , EXTI_IRQ6_NUM_LINES );
181
239
}
182
240
#endif
241
+ #ifdef EXTI_IRQ7_NUM_LINES
242
+ // EXTI line 7 for STM32L5
243
+ static void gpio_irq7 (void )
244
+ {
245
+ handle_interrupt_in (7 , EXTI_IRQ7_NUM_LINES );
246
+ }
247
+ #endif
248
+ #ifdef EXTI_IRQ8_NUM_LINES
249
+ // EXTI line 8 for STM32L5
250
+ static void gpio_irq8 (void )
251
+ {
252
+ handle_interrupt_in (8 , EXTI_IRQ8_NUM_LINES );
253
+ }
254
+ #endif
255
+ #ifdef EXTI_IRQ9_NUM_LINES
256
+ // EXTI line 9 for STM32L5
257
+ static void gpio_irq9 (void )
258
+ {
259
+ handle_interrupt_in (9 , EXTI_IRQ9_NUM_LINES );
260
+ }
261
+ #endif
262
+ #ifdef EXTI_IRQ10_NUM_LINES
263
+ // EXTI line 10 for STM32L5
264
+ static void gpio_irq10 (void )
265
+ {
266
+ handle_interrupt_in (10 , EXTI_IRQ10_NUM_LINES );
267
+ }
268
+ #endif
269
+ #ifdef EXTI_IRQ11_NUM_LINES
270
+ // EXTI line 11 for STM32L5
271
+ static void gpio_irq11 (void )
272
+ {
273
+ handle_interrupt_in (11 , EXTI_IRQ11_NUM_LINES );
274
+ }
275
+ #endif
276
+ #ifdef EXTI_IRQ12_NUM_LINES
277
+ // EXTI line 12 for STM32L5
278
+ static void gpio_irq12 (void )
279
+ {
280
+ handle_interrupt_in (12 , EXTI_IRQ12_NUM_LINES );
281
+ }
282
+ #endif
283
+ #ifdef EXTI_IRQ13_NUM_LINES
284
+ // EXTI line 13 for STM32L5
285
+ static void gpio_irq13 (void )
286
+ {
287
+ handle_interrupt_in (13 , EXTI_IRQ13_NUM_LINES );
288
+ }
289
+ #endif
290
+ #ifdef EXTI_IRQ14_NUM_LINES
291
+ // EXTI line 14 for STM32L5
292
+ static void gpio_irq14 (void )
293
+ {
294
+ handle_interrupt_in (14 , EXTI_IRQ14_NUM_LINES );
295
+ }
296
+ #endif
297
+ #ifdef EXTI_IRQ15_NUM_LINES
298
+ // EXTI line 15 for STM32L5
299
+ static void gpio_irq15 (void )
300
+ {
301
+ handle_interrupt_in (15 , EXTI_IRQ15_NUM_LINES );
302
+ }
303
+ #endif
183
304
184
305
extern GPIO_TypeDef * Set_GPIO_Clock (uint32_t port_idx );
185
306
extern void pin_function_gpiomode (PinName pin , uint32_t gpiomode );
@@ -241,6 +362,51 @@ int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32
241
362
case 6 :
242
363
vector = (uint32_t )& gpio_irq6 ;
243
364
break ;
365
+ #endif
366
+ #ifdef EXTI_IRQ7_NUM_LINES
367
+ case 7 :
368
+ vector = (uint32_t )& gpio_irq7 ;
369
+ break ;
370
+ #endif
371
+ #ifdef EXTI_IRQ8_NUM_LINES
372
+ case 8 :
373
+ vector = (uint32_t )& gpio_irq8 ;
374
+ break ;
375
+ #endif
376
+ #ifdef EXTI_IRQ9_NUM_LINES
377
+ case 9 :
378
+ vector = (uint32_t )& gpio_irq9 ;
379
+ break ;
380
+ #endif
381
+ #ifdef EXTI_IRQ10_NUM_LINES
382
+ case 10 :
383
+ vector = (uint32_t )& gpio_irq10 ;
384
+ break ;
385
+ #endif
386
+ #ifdef EXTI_IRQ11_NUM_LINES
387
+ case 11 :
388
+ vector = (uint32_t )& gpio_irq11 ;
389
+ break ;
390
+ #endif
391
+ #ifdef EXTI_IRQ12_NUM_LINES
392
+ case 12 :
393
+ vector = (uint32_t )& gpio_irq12 ;
394
+ break ;
395
+ #endif
396
+ #ifdef EXTI_IRQ13_NUM_LINES
397
+ case 13 :
398
+ vector = (uint32_t )& gpio_irq13 ;
399
+ break ;
400
+ #endif
401
+ #ifdef EXTI_IRQ14_NUM_LINES
402
+ case 14 :
403
+ vector = (uint32_t )& gpio_irq14 ;
404
+ break ;
405
+ #endif
406
+ #ifdef EXTI_IRQ15_NUM_LINES
407
+ case 15 :
408
+ vector = (uint32_t )& gpio_irq15 ;
409
+ break ;
244
410
#endif
245
411
default :
246
412
error ("InterruptIn error: pin not supported.\n" );
@@ -321,7 +487,7 @@ void gpio_irq_enable(gpio_irq_t *obj)
321
487
322
488
/* Select Source */
323
489
324
- #if defined(STM32G0 )
490
+ #if defined(STM32G0 ) || defined( STM32L5 )
325
491
temp = EXTI -> EXTICR [pin_index >> 2 ];
326
492
CLEAR_BIT (temp , (0x0FU ) << (8U * (pin_index & 0x03U )));
327
493
SET_BIT (temp , port_index << (8U * (pin_index & 0x03U )));
0 commit comments