@@ -74,7 +74,34 @@ static gpio_channel_t channels[CHANNEL_NUM] = {
7474 {.pin_mask = 0 },
7575#endif
7676#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 },
78105#endif
79106};
80107
@@ -91,6 +118,36 @@ static void handle_interrupt_in(uint32_t irq_index, uint32_t max_num_pin_line)
91118 GPIO_TypeDef * gpio = (GPIO_TypeDef * )(gpio_channel -> channel_gpio [gpio_idx ]);
92119 uint32_t pin = (uint32_t )(1 << (gpio_channel -> channel_pin [gpio_idx ]));
93120
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+
94151 // Clear interrupt flag
95152 if (__HAL_GPIO_EXTI_GET_FLAG (pin ) != RESET ) {
96153 __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)
125182
126183 return ;
127184 }
185+ #endif /* TARGET_STM32L5 */
128186 }
129187 }
130188 error ("Unexpected Spurious interrupt index %" PRIu32 "\n" , irq_index );
@@ -167,19 +225,82 @@ static void gpio_irq4(void)
167225}
168226#endif
169227#ifdef EXTI_IRQ5_NUM_LINES
170- // EXTI lines 5 to 9
228+ // EXTI lines 5 to 9, except for STM32L5 line 5 only
171229static void gpio_irq5 (void )
172230{
173231 handle_interrupt_in (5 , EXTI_IRQ5_NUM_LINES );
174232}
175233#endif
176234#ifdef EXTI_IRQ6_NUM_LINES
177- // EXTI lines 10 to 15
235+ // EXTI lines 10 to 15, except for STM32L5 line 6 only
178236static void gpio_irq6 (void )
179237{
180238 handle_interrupt_in (6 , EXTI_IRQ6_NUM_LINES );
181239}
182240#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
183304
184305extern GPIO_TypeDef * Set_GPIO_Clock (uint32_t port_idx );
185306extern 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
241362 case 6 :
242363 vector = (uint32_t )& gpio_irq6 ;
243364 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 ;
244410#endif
245411 default :
246412 error ("InterruptIn error: pin not supported.\n" );
@@ -321,7 +487,7 @@ void gpio_irq_enable(gpio_irq_t *obj)
321487
322488 /* Select Source */
323489
324- #if defined(STM32G0 )
490+ #if defined(STM32G0 ) || defined( STM32L5 )
325491 temp = EXTI -> EXTICR [pin_index >> 2 ];
326492 CLEAR_BIT (temp , (0x0FU ) << (8U * (pin_index & 0x03U )));
327493 SET_BIT (temp , port_index << (8U * (pin_index & 0x03U )));
0 commit comments