Skip to content

Commit 396f7e3

Browse files
authored
Merge pull request #8037 from mattbrown015/stm32_gpio_irq_shared_vector
STM32: Fix disabling of IRQs shared by multiple events
2 parents 6fca23e + 792cec7 commit 396f7e3

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

targets/TARGET_STM/gpio_irq_api.c

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2828
*******************************************************************************
2929
*/
30-
#include <stddef.h>
30+
#include <stdbool.h>
3131
#include "cmsis.h"
3232
#include "gpio_irq_api.h"
3333
#include "pinmap.h"
@@ -268,11 +268,11 @@ void gpio_irq_free(gpio_irq_t *obj)
268268
uint32_t gpio_idx = pin_lines_desc[STM_PIN(obj->pin)].gpio_idx;
269269
gpio_channel_t *gpio_channel = &channels[obj->irq_index];
270270

271-
gpio_irq_disable(obj);
272271
gpio_channel->pin_mask &= ~(1 << gpio_idx);
273272
gpio_channel->channel_ids[gpio_idx] = 0;
274273
gpio_channel->channel_gpio[gpio_idx] = 0;
275274
gpio_channel->channel_pin[gpio_idx] = 0;
275+
gpio_irq_disable(obj);
276276
}
277277

278278
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)
325325

326326
void gpio_irq_disable(gpio_irq_t *obj)
327327
{
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+
328334
/* 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+
}
334344
}

0 commit comments

Comments
 (0)