|
37 | 37 | #include "pinmap.h"
|
38 | 38 | #include "mbed_error.h"
|
39 | 39 | #include "gpio_irq_device.h"
|
| 40 | +#include "platform/mbed_critical.h" |
40 | 41 |
|
41 | 42 | #define EDGE_NONE (0)
|
42 | 43 | #define EDGE_RISE (1)
|
@@ -194,6 +195,8 @@ int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32
|
194 | 195 | return -1;
|
195 | 196 | }
|
196 | 197 |
|
| 198 | + core_util_critical_section_enter(); |
| 199 | + |
197 | 200 | /* Enable SYSCFG Clock */
|
198 | 201 | #if !defined(TARGET_STM32WB)
|
199 | 202 | __HAL_RCC_SYSCFG_CLK_ENABLE();
|
@@ -266,19 +269,25 @@ int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32
|
266 | 269 | NVIC_SetVector(obj->irq_n, vector);
|
267 | 270 | gpio_irq_enable(obj);
|
268 | 271 |
|
| 272 | + core_util_critical_section_exit(); |
269 | 273 | return 0;
|
270 | 274 | }
|
271 | 275 |
|
272 | 276 | void gpio_irq_free(gpio_irq_t *obj)
|
273 | 277 | {
|
| 278 | + core_util_critical_section_enter(); |
| 279 | + |
274 | 280 | uint32_t gpio_idx = pin_lines_desc[STM_PIN(obj->pin)].gpio_idx;
|
275 | 281 | gpio_channel_t *gpio_channel = &channels[obj->irq_index];
|
276 | 282 |
|
| 283 | + gpio_irq_disable(obj); |
| 284 | + |
277 | 285 | gpio_channel->pin_mask &= ~(1 << gpio_idx);
|
278 | 286 | gpio_channel->channel_ids[gpio_idx] = 0;
|
279 | 287 | gpio_channel->channel_gpio[gpio_idx] = 0;
|
280 | 288 | gpio_channel->channel_pin[gpio_idx] = 0;
|
281 |
| - gpio_irq_disable(obj); |
| 289 | + |
| 290 | + core_util_critical_section_exit(); |
282 | 291 | }
|
283 | 292 |
|
284 | 293 | void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
|
@@ -342,6 +351,13 @@ void gpio_irq_disable(gpio_irq_t *obj)
|
342 | 351 | LL_EXTI_DisableFallingTrig_0_31(1 << pin_index);
|
343 | 352 | LL_EXTI_DisableIT_0_31(1 << pin_index);
|
344 | 353 |
|
| 354 | + uint32_t pin = (uint32_t)(1 << (gpio_channel->channel_pin[gpio_idx])); |
| 355 | + |
| 356 | + // Clear interrupt flag |
| 357 | + if (__HAL_GPIO_EXTI_GET_FLAG(pin) != RESET) { |
| 358 | + __HAL_GPIO_EXTI_CLEAR_FLAG(pin); |
| 359 | + } |
| 360 | + |
345 | 361 | const bool no_more_pins_on_vector = (gpio_channel->pin_mask & ~pin_mask) == 0;
|
346 | 362 | if (no_more_pins_on_vector) {
|
347 | 363 | NVIC_DisableIRQ(obj->irq_n);
|
|
0 commit comments