@@ -73,7 +73,34 @@ static gpio_channel_t channels[CHANNEL_NUM] = {
7373 {.pin_mask = 0 },
7474#endif
7575#ifdef EXTI_IRQ6_NUM_LINES
76- {.pin_mask = 0 }
76+ {.pin_mask = 0 },
77+ #endif
78+ #ifdef EXTI_IRQ7_NUM_LINES
79+ {.pin_mask = 0 },
80+ #endif
81+ #ifdef EXTI_IRQ8_NUM_LINES
82+ {.pin_mask = 0 },
83+ #endif
84+ #ifdef EXTI_IRQ9_NUM_LINES
85+ {.pin_mask = 0 },
86+ #endif
87+ #ifdef EXTI_IRQ10_NUM_LINES
88+ {.pin_mask = 0 },
89+ #endif
90+ #ifdef EXTI_IRQ11_NUM_LINES
91+ {.pin_mask = 0 },
92+ #endif
93+ #ifdef EXTI_IRQ12_NUM_LINES
94+ {.pin_mask = 0 },
95+ #endif
96+ #ifdef EXTI_IRQ13_NUM_LINES
97+ {.pin_mask = 0 },
98+ #endif
99+ #ifdef EXTI_IRQ14_NUM_LINES
100+ {.pin_mask = 0 },
101+ #endif
102+ #ifdef EXTI_IRQ15_NUM_LINES
103+ {.pin_mask = 0 },
77104#endif
78105};
79106
@@ -90,6 +117,36 @@ static void handle_interrupt_in(uint32_t irq_index, uint32_t max_num_pin_line)
90117 GPIO_TypeDef * gpio = (GPIO_TypeDef * )(gpio_channel -> channel_gpio [gpio_idx ]);
91118 uint32_t pin = (uint32_t )(1 << (gpio_channel -> channel_pin [gpio_idx ]));
92119
120+ #if defined(TARGET_STM32L5 )
121+ // Clear interrupt flag
122+ if (LL_EXTI_IsActiveRisingFlag_0_31 (pin ) != RESET ) {
123+ LL_EXTI_ClearRisingFlag_0_31 (pin );
124+
125+ if (gpio_channel -> channel_ids [gpio_idx ] == 0 ) {
126+ continue ;
127+ }
128+
129+ gpio_irq_event event = IRQ_RISE ;
130+ irq_handler (gpio_channel -> channel_ids [gpio_idx ], event );
131+
132+ return ;
133+ }
134+
135+ if (LL_EXTI_IsActiveFallingFlag_0_31 (pin ) != RESET ) {
136+ LL_EXTI_ClearFallingFlag_0_31 (pin );
137+
138+ if (gpio_channel -> channel_ids [gpio_idx ] == 0 ) {
139+ continue ;
140+ }
141+
142+ gpio_irq_event event = IRQ_FALL ;
143+ irq_handler (gpio_channel -> channel_ids [gpio_idx ], event );
144+
145+ return ;
146+ }
147+
148+ #else /* TARGET_STM32L5 */
149+
93150 // Clear interrupt flag
94151 if (__HAL_GPIO_EXTI_GET_FLAG (pin ) != RESET ) {
95152 __HAL_GPIO_EXTI_CLEAR_FLAG (pin );
@@ -124,6 +181,7 @@ static void handle_interrupt_in(uint32_t irq_index, uint32_t max_num_pin_line)
124181
125182 return ;
126183 }
184+ #endif /* TARGET_STM32L5 */
127185 }
128186 }
129187 error ("Unexpected Spurious interrupt index %" PRIu32 "\n" , irq_index );
@@ -166,19 +224,82 @@ static void gpio_irq4(void)
166224}
167225#endif
168226#ifdef EXTI_IRQ5_NUM_LINES
169- // EXTI lines 5 to 9
227+ // EXTI lines 5 to 9, except for STM32L5 line 5 only
170228static void gpio_irq5 (void )
171229{
172230 handle_interrupt_in (5 , EXTI_IRQ5_NUM_LINES );
173231}
174232#endif
175233#ifdef EXTI_IRQ6_NUM_LINES
176- // EXTI lines 10 to 15
234+ // EXTI lines 10 to 15, except for STM32L5 line 6 only
177235static void gpio_irq6 (void )
178236{
179237 handle_interrupt_in (6 , EXTI_IRQ6_NUM_LINES );
180238}
181239#endif
240+ #ifdef EXTI_IRQ7_NUM_LINES
241+ // EXTI line 7 for STM32L5
242+ static void gpio_irq7 (void )
243+ {
244+ handle_interrupt_in (7 , EXTI_IRQ7_NUM_LINES );
245+ }
246+ #endif
247+ #ifdef EXTI_IRQ8_NUM_LINES
248+ // EXTI line 8 for STM32L5
249+ static void gpio_irq8 (void )
250+ {
251+ handle_interrupt_in (8 , EXTI_IRQ8_NUM_LINES );
252+ }
253+ #endif
254+ #ifdef EXTI_IRQ9_NUM_LINES
255+ // EXTI line 9 for STM32L5
256+ static void gpio_irq9 (void )
257+ {
258+ handle_interrupt_in (9 , EXTI_IRQ9_NUM_LINES );
259+ }
260+ #endif
261+ #ifdef EXTI_IRQ10_NUM_LINES
262+ // EXTI line 10 for STM32L5
263+ static void gpio_irq10 (void )
264+ {
265+ handle_interrupt_in (10 , EXTI_IRQ10_NUM_LINES );
266+ }
267+ #endif
268+ #ifdef EXTI_IRQ11_NUM_LINES
269+ // EXTI line 11 for STM32L5
270+ static void gpio_irq11 (void )
271+ {
272+ handle_interrupt_in (11 , EXTI_IRQ11_NUM_LINES );
273+ }
274+ #endif
275+ #ifdef EXTI_IRQ12_NUM_LINES
276+ // EXTI line 12 for STM32L5
277+ static void gpio_irq12 (void )
278+ {
279+ handle_interrupt_in (12 , EXTI_IRQ12_NUM_LINES );
280+ }
281+ #endif
282+ #ifdef EXTI_IRQ13_NUM_LINES
283+ // EXTI line 13 for STM32L5
284+ static void gpio_irq13 (void )
285+ {
286+ handle_interrupt_in (13 , EXTI_IRQ13_NUM_LINES );
287+ }
288+ #endif
289+ #ifdef EXTI_IRQ14_NUM_LINES
290+ // EXTI line 14 for STM32L5
291+ static void gpio_irq14 (void )
292+ {
293+ handle_interrupt_in (14 , EXTI_IRQ14_NUM_LINES );
294+ }
295+ #endif
296+ #ifdef EXTI_IRQ15_NUM_LINES
297+ // EXTI line 15 for STM32L5
298+ static void gpio_irq15 (void )
299+ {
300+ handle_interrupt_in (15 , EXTI_IRQ15_NUM_LINES );
301+ }
302+ #endif
182303
183304extern GPIO_TypeDef * Set_GPIO_Clock (uint32_t port_idx );
184305extern void pin_function_gpiomode (PinName pin , uint32_t gpiomode );
@@ -238,6 +359,51 @@ int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32
238359 case 6 :
239360 vector = (uint32_t )& gpio_irq6 ;
240361 break ;
362+ #endif
363+ #ifdef EXTI_IRQ7_NUM_LINES
364+ case 7 :
365+ vector = (uint32_t )& gpio_irq7 ;
366+ break ;
367+ #endif
368+ #ifdef EXTI_IRQ8_NUM_LINES
369+ case 8 :
370+ vector = (uint32_t )& gpio_irq8 ;
371+ break ;
372+ #endif
373+ #ifdef EXTI_IRQ9_NUM_LINES
374+ case 9 :
375+ vector = (uint32_t )& gpio_irq9 ;
376+ break ;
377+ #endif
378+ #ifdef EXTI_IRQ10_NUM_LINES
379+ case 10 :
380+ vector = (uint32_t )& gpio_irq10 ;
381+ break ;
382+ #endif
383+ #ifdef EXTI_IRQ11_NUM_LINES
384+ case 11 :
385+ vector = (uint32_t )& gpio_irq11 ;
386+ break ;
387+ #endif
388+ #ifdef EXTI_IRQ12_NUM_LINES
389+ case 12 :
390+ vector = (uint32_t )& gpio_irq12 ;
391+ break ;
392+ #endif
393+ #ifdef EXTI_IRQ13_NUM_LINES
394+ case 13 :
395+ vector = (uint32_t )& gpio_irq13 ;
396+ break ;
397+ #endif
398+ #ifdef EXTI_IRQ14_NUM_LINES
399+ case 14 :
400+ vector = (uint32_t )& gpio_irq14 ;
401+ break ;
402+ #endif
403+ #ifdef EXTI_IRQ15_NUM_LINES
404+ case 15 :
405+ vector = (uint32_t )& gpio_irq15 ;
406+ break ;
241407#endif
242408 default :
243409 error ("InterruptIn error: pin not supported.\n" );
@@ -312,7 +478,7 @@ void gpio_irq_enable(gpio_irq_t *obj)
312478
313479 /* Select Source */
314480
315- #if defined(STM32G0 )
481+ #if defined(STM32G0 ) || defined( STM32L5 )
316482 temp = EXTI -> EXTICR [pin_index >> 2 ];
317483 CLEAR_BIT (temp , (0x0FU ) << (8U * (pin_index & 0x03U )));
318484 SET_BIT (temp , port_index << (8U * (pin_index & 0x03U )));
0 commit comments