@@ -90,18 +90,21 @@ static void handle_interrupt_in(uint32_t irq_index, uint32_t max_num_pin_line)
90
90
if (__HAL_GPIO_EXTI_GET_FLAG (pin ) != RESET ) {
91
91
__HAL_GPIO_EXTI_CLEAR_FLAG (pin );
92
92
93
- if (gpio_channel -> channel_ids [gpio_idx ] == 0 )
93
+ if (gpio_channel -> channel_ids [gpio_idx ] == 0 ) {
94
94
continue ;
95
+ }
95
96
96
97
// Check which edge has generated the irq
97
98
if ((gpio -> IDR & pin ) == 0 ) {
98
99
irq_handler (gpio_channel -> channel_ids [gpio_idx ], IRQ_FALL );
99
100
} else {
100
101
irq_handler (gpio_channel -> channel_ids [gpio_idx ], IRQ_RISE );
101
102
}
103
+ return ;
102
104
}
103
105
}
104
106
}
107
+ error ("Unexpected Spurious interrupt, index %d\r\n" , irq_index );
105
108
}
106
109
107
110
@@ -254,18 +257,23 @@ void gpio_irq_free(gpio_irq_t *obj)
254
257
255
258
void gpio_irq_set (gpio_irq_t * obj , gpio_irq_event event , uint32_t enable )
256
259
{
260
+ /* Enable / Disable Edge triggered interrupt and store event */
257
261
if (event == IRQ_RISE ) {
258
262
if (enable ) {
259
263
LL_EXTI_EnableRisingTrig_0_31 (1 << STM_PIN (obj -> pin ));
264
+ obj -> event |= IRQ_RISE ;
260
265
} else {
261
266
LL_EXTI_DisableRisingTrig_0_31 (1 << STM_PIN (obj -> pin ));
267
+ obj -> event &= ~IRQ_RISE ;
262
268
}
263
269
}
264
270
if (event == IRQ_FALL ) {
265
271
if (enable ) {
266
272
LL_EXTI_EnableFallingTrig_0_31 (1 << STM_PIN (obj -> pin ));
273
+ obj -> event |= IRQ_FALL ;
267
274
} else {
268
275
LL_EXTI_DisableFallingTrig_0_31 (1 << STM_PIN (obj -> pin ));
276
+ obj -> event &= ~IRQ_FALL ;
269
277
}
270
278
}
271
279
}
@@ -284,14 +292,23 @@ void gpio_irq_enable(gpio_irq_t *obj)
284
292
285
293
LL_EXTI_EnableIT_0_31 (1 << pin_index );
286
294
295
+ /* Restore previous edge interrupt configuration if applicable */
296
+ if (obj -> event & IRQ_RISE ) {
297
+ LL_EXTI_EnableRisingTrig_0_31 (1 << STM_PIN (obj -> pin ));
298
+ }
299
+ if (obj -> event & IRQ_FALL ) {
300
+ LL_EXTI_EnableFallingTrig_0_31 (1 << STM_PIN (obj -> pin ));
301
+ }
302
+
287
303
NVIC_EnableIRQ (obj -> irq_n );
288
304
}
289
305
290
306
void gpio_irq_disable (gpio_irq_t * obj )
291
307
{
292
308
/* Clear EXTI line configuration */
309
+ LL_EXTI_DisableRisingTrig_0_31 (1 << STM_PIN (obj -> pin ));
310
+ LL_EXTI_DisableFallingTrig_0_31 (1 << STM_PIN (obj -> pin ));
293
311
LL_EXTI_DisableIT_0_31 (1 << STM_PIN (obj -> pin ));
294
312
NVIC_DisableIRQ (obj -> irq_n );
295
313
NVIC_ClearPendingIRQ (obj -> irq_n );
296
- obj -> event = EDGE_NONE ;
297
314
}
0 commit comments