|
27 | 27 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
28 | 28 | *******************************************************************************
|
29 | 29 | */
|
30 |
| -#include <stddef.h> |
| 30 | +#include <stdbool.h> |
31 | 31 | #include "cmsis.h"
|
32 | 32 | #include "gpio_irq_api.h"
|
33 | 33 | #include "pinmap.h"
|
@@ -268,11 +268,11 @@ void gpio_irq_free(gpio_irq_t *obj)
|
268 | 268 | uint32_t gpio_idx = pin_lines_desc[STM_PIN(obj->pin)].gpio_idx;
|
269 | 269 | gpio_channel_t *gpio_channel = &channels[obj->irq_index];
|
270 | 270 |
|
271 |
| - gpio_irq_disable(obj); |
272 | 271 | gpio_channel->pin_mask &= ~(1 << gpio_idx);
|
273 | 272 | gpio_channel->channel_ids[gpio_idx] = 0;
|
274 | 273 | gpio_channel->channel_gpio[gpio_idx] = 0;
|
275 | 274 | gpio_channel->channel_pin[gpio_idx] = 0;
|
| 275 | + gpio_irq_disable(obj); |
276 | 276 | }
|
277 | 277 |
|
278 | 278 | void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
|
@@ -325,10 +325,20 @@ void gpio_irq_enable(gpio_irq_t *obj)
|
325 | 325 |
|
326 | 326 | void gpio_irq_disable(gpio_irq_t *obj)
|
327 | 327 | {
|
| 328 | + const uint32_t pin_index = STM_PIN(obj->pin); |
| 329 | + const uint32_t gpio_idx = pin_lines_desc[pin_index].gpio_idx; |
| 330 | + const uint32_t pin_mask = 1 << gpio_idx; |
| 331 | + const uint32_t irq_index = pin_lines_desc[pin_index].irq_index; |
| 332 | + const gpio_channel_t *const gpio_channel = &channels[irq_index]; |
| 333 | + |
328 | 334 | /* Clear EXTI line configuration */
|
329 |
| - LL_EXTI_DisableRisingTrig_0_31(1 << STM_PIN(obj->pin)); |
330 |
| - LL_EXTI_DisableFallingTrig_0_31(1 << STM_PIN(obj->pin)); |
331 |
| - LL_EXTI_DisableIT_0_31(1 << STM_PIN(obj->pin)); |
332 |
| - NVIC_DisableIRQ(obj->irq_n); |
333 |
| - NVIC_ClearPendingIRQ(obj->irq_n); |
| 335 | + LL_EXTI_DisableRisingTrig_0_31(1 << pin_index); |
| 336 | + LL_EXTI_DisableFallingTrig_0_31(1 << pin_index); |
| 337 | + LL_EXTI_DisableIT_0_31(1 << pin_index); |
| 338 | + |
| 339 | + const bool no_more_pins_on_vector = (gpio_channel->pin_mask & ~pin_mask) == 0; |
| 340 | + if (no_more_pins_on_vector) { |
| 341 | + NVIC_DisableIRQ(obj->irq_n); |
| 342 | + NVIC_ClearPendingIRQ(obj->irq_n); |
| 343 | + } |
334 | 344 | }
|
0 commit comments