mirror of https://github.com/ARMmbed/mbed-os.git
Merge pull request #4676 from LMESTM/issue_2959
Correctly enable / disable InterruptIn Edges detectionpull/4792/head
commit
185b7233da
|
@ -90,8 +90,9 @@ static void handle_interrupt_in(uint32_t irq_index, uint32_t max_num_pin_line)
|
||||||
if (__HAL_GPIO_EXTI_GET_FLAG(pin) != RESET) {
|
if (__HAL_GPIO_EXTI_GET_FLAG(pin) != RESET) {
|
||||||
__HAL_GPIO_EXTI_CLEAR_FLAG(pin);
|
__HAL_GPIO_EXTI_CLEAR_FLAG(pin);
|
||||||
|
|
||||||
if (gpio_channel->channel_ids[gpio_idx] == 0)
|
if (gpio_channel->channel_ids[gpio_idx] == 0) {
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Check which edge has generated the irq
|
// Check which edge has generated the irq
|
||||||
if ((gpio->IDR & pin) == 0) {
|
if ((gpio->IDR & pin) == 0) {
|
||||||
|
@ -99,9 +100,11 @@ static void handle_interrupt_in(uint32_t irq_index, uint32_t max_num_pin_line)
|
||||||
} else {
|
} else {
|
||||||
irq_handler(gpio_channel->channel_ids[gpio_idx], IRQ_RISE);
|
irq_handler(gpio_channel->channel_ids[gpio_idx], IRQ_RISE);
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
error("Unexpected Spurious interrupt, index %d\r\n", irq_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -254,18 +257,23 @@ void gpio_irq_free(gpio_irq_t *obj)
|
||||||
|
|
||||||
void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
|
void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
|
||||||
{
|
{
|
||||||
|
/* Enable / Disable Edge triggered interrupt and store event */
|
||||||
if (event == IRQ_RISE) {
|
if (event == IRQ_RISE) {
|
||||||
if (enable) {
|
if (enable) {
|
||||||
LL_EXTI_EnableRisingTrig_0_31(1 << STM_PIN(obj->pin));
|
LL_EXTI_EnableRisingTrig_0_31(1 << STM_PIN(obj->pin));
|
||||||
|
obj->event |= IRQ_RISE;
|
||||||
} else {
|
} else {
|
||||||
LL_EXTI_DisableRisingTrig_0_31(1 << STM_PIN(obj->pin));
|
LL_EXTI_DisableRisingTrig_0_31(1 << STM_PIN(obj->pin));
|
||||||
|
obj->event &= ~IRQ_RISE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (event == IRQ_FALL) {
|
if (event == IRQ_FALL) {
|
||||||
if (enable) {
|
if (enable) {
|
||||||
LL_EXTI_EnableFallingTrig_0_31(1 << STM_PIN(obj->pin));
|
LL_EXTI_EnableFallingTrig_0_31(1 << STM_PIN(obj->pin));
|
||||||
|
obj->event |= IRQ_FALL;
|
||||||
} else {
|
} else {
|
||||||
LL_EXTI_DisableFallingTrig_0_31(1 << STM_PIN(obj->pin));
|
LL_EXTI_DisableFallingTrig_0_31(1 << STM_PIN(obj->pin));
|
||||||
|
obj->event &= ~IRQ_FALL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -284,14 +292,23 @@ void gpio_irq_enable(gpio_irq_t *obj)
|
||||||
|
|
||||||
LL_EXTI_EnableIT_0_31(1 << pin_index);
|
LL_EXTI_EnableIT_0_31(1 << pin_index);
|
||||||
|
|
||||||
|
/* Restore previous edge interrupt configuration if applicable */
|
||||||
|
if (obj->event & IRQ_RISE) {
|
||||||
|
LL_EXTI_EnableRisingTrig_0_31(1 << STM_PIN(obj->pin));
|
||||||
|
}
|
||||||
|
if (obj->event & IRQ_FALL) {
|
||||||
|
LL_EXTI_EnableFallingTrig_0_31(1 << STM_PIN(obj->pin));
|
||||||
|
}
|
||||||
|
|
||||||
NVIC_EnableIRQ(obj->irq_n);
|
NVIC_EnableIRQ(obj->irq_n);
|
||||||
}
|
}
|
||||||
|
|
||||||
void gpio_irq_disable(gpio_irq_t *obj)
|
void gpio_irq_disable(gpio_irq_t *obj)
|
||||||
{
|
{
|
||||||
/* Clear EXTI line configuration */
|
/* Clear EXTI line configuration */
|
||||||
|
LL_EXTI_DisableRisingTrig_0_31(1 << STM_PIN(obj->pin));
|
||||||
|
LL_EXTI_DisableFallingTrig_0_31(1 << STM_PIN(obj->pin));
|
||||||
LL_EXTI_DisableIT_0_31(1 << STM_PIN(obj->pin));
|
LL_EXTI_DisableIT_0_31(1 << STM_PIN(obj->pin));
|
||||||
NVIC_DisableIRQ(obj->irq_n);
|
NVIC_DisableIRQ(obj->irq_n);
|
||||||
NVIC_ClearPendingIRQ(obj->irq_n);
|
NVIC_ClearPendingIRQ(obj->irq_n);
|
||||||
obj->event = EDGE_NONE;
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue