@@ -254,18 +254,23 @@ void gpio_irq_free(gpio_irq_t *obj)
254
254
255
255
void gpio_irq_set (gpio_irq_t * obj , gpio_irq_event event , uint32_t enable )
256
256
{
257
+ /* Enable / Disable Edge triggered interrupt and store event */
257
258
if (event == IRQ_RISE ) {
258
259
if (enable ) {
259
260
LL_EXTI_EnableRisingTrig_0_31 (1 << STM_PIN (obj -> pin ));
261
+ obj -> event |= IRQ_RISE ;
260
262
} else {
261
263
LL_EXTI_DisableRisingTrig_0_31 (1 << STM_PIN (obj -> pin ));
264
+ obj -> event &= ~IRQ_RISE ;
262
265
}
263
266
}
264
267
if (event == IRQ_FALL ) {
265
268
if (enable ) {
266
269
LL_EXTI_EnableFallingTrig_0_31 (1 << STM_PIN (obj -> pin ));
270
+ obj -> event |= IRQ_FALL ;
267
271
} else {
268
272
LL_EXTI_DisableFallingTrig_0_31 (1 << STM_PIN (obj -> pin ));
273
+ obj -> event &= ~IRQ_FALL ;
269
274
}
270
275
}
271
276
}
@@ -284,6 +289,15 @@ void gpio_irq_enable(gpio_irq_t *obj)
284
289
285
290
LL_EXTI_EnableIT_0_31 (1 << pin_index );
286
291
292
+ /* Restore previous edge interrupt configuration if applicable */
293
+ if (obj -> event & IRQ_RISE ) {
294
+ LL_EXTI_EnableRisingTrig_0_31 (1 << STM_PIN (obj -> pin ));
295
+ }
296
+ if (obj -> event & IRQ_FALL ) {
297
+ LL_EXTI_EnableFallingTrig_0_31 (1 << STM_PIN (obj -> pin ));
298
+
299
+ }
300
+
287
301
NVIC_EnableIRQ (obj -> irq_n );
288
302
}
289
303
@@ -295,5 +309,4 @@ void gpio_irq_disable(gpio_irq_t *obj)
295
309
LL_EXTI_DisableIT_0_31 (1 << STM_PIN (obj -> pin ));
296
310
NVIC_DisableIRQ (obj -> irq_n );
297
311
NVIC_ClearPendingIRQ (obj -> irq_n );
298
- obj -> event = EDGE_NONE ;
299
312
}
0 commit comments