summaryrefslogtreecommitdiff
path: root/bsp
diff options
context:
space:
mode:
authorBernard Xiong <[email protected]>2021-05-18 19:34:25 +0800
committerGitHub <[email protected]>2021-05-18 19:34:25 +0800
commit5ba96109c60c4b1a66ffcc39a42de2fc28fcd75e (patch)
treea38778146664c18b4e913ab5aa2a1dd21bce9f5c /bsp
parenta0175e3d15ea55d2ccc9b5ae3afa8a53b91d7063 (diff)
parent2a56598c8c9b86e94075ac502605f98d908d26d5 (diff)
Merge pull request #4665 from tao-eternal/patch-1
[GD32V]fixed some bugs about interrupt
Diffstat (limited to 'bsp')
-rw-r--r--bsp/gd32vf103v-eval/drivers/drv_gpio.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/bsp/gd32vf103v-eval/drivers/drv_gpio.c b/bsp/gd32vf103v-eval/drivers/drv_gpio.c
index ca56bf54a2..f4d9c0923b 100644
--- a/bsp/gd32vf103v-eval/drivers/drv_gpio.c
+++ b/bsp/gd32vf103v-eval/drivers/drv_gpio.c
@@ -350,16 +350,14 @@ static rt_err_t gd32vf_pin_irq_enable(struct rt_device *device, rt_base_t pin,
return RT_ENOSYS;
}
- /* configure pin as input */
- gpio_init(index->gpio_periph, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, index->pin);
- if (enabled == PIN_IRQ_ENABLE)
+ irqindex = bit2bitno(index->pin);
+ if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map))
{
- irqindex = bit2bitno(index->pin);
- if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map))
- {
- return RT_ENOSYS;
- }
+ return RT_ENOSYS;
+ }
+ if (enabled == PIN_IRQ_ENABLE)
+ {
level = rt_hw_interrupt_disable();
if (pin_irq_hdr_tab[irqindex].pin == -1)
@@ -372,24 +370,31 @@ static rt_err_t gd32vf_pin_irq_enable(struct rt_device *device, rt_base_t pin,
/* enable and set EXTI interrupt to the lowest priority */
eclic_irq_enable(irqmap->irqno, 1, 1);
- gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_0);
+ /* select SOURCE_PORT_x and SOURCE_PIN_x */
+ gpio_exti_source_select(index->index >> 4, irqindex);
/* Configure GPIO_InitStructure */
switch (pin_irq_hdr_tab[irqindex].mode)
{
case PIN_IRQ_MODE_RISING:
+ gpio_init( index->gpio_periph, GPIO_MODE_IPD, GPIO_OSPEED_50MHZ,
+ index->pin );
exti_init(EXTI_(irqindex), EXTI_INTERRUPT, EXTI_TRIG_RISING);
break;
case PIN_IRQ_MODE_FALLING:
+ gpio_init( index->gpio_periph, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ,
+ index->pin );
exti_init(EXTI_(irqindex), EXTI_INTERRUPT, EXTI_TRIG_FALLING);
break;
case PIN_IRQ_MODE_RISING_FALLING:
+ gpio_init(index->gpio_periph, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ,
+ index->pin);
exti_init(EXTI_(irqindex), EXTI_INTERRUPT, EXTI_TRIG_BOTH);
break;
}
pin_irq_enable_mask |= irqmap->pinbit;
-
- exti_interrupt_flag_clear(EXTI_(index->pin));
+ /* irqindex should be bitno and then EXTI_(x) can be the bit */
+ exti_interrupt_flag_clear(EXTI_(irqindex));
rt_hw_interrupt_enable(level);
}
@@ -408,7 +413,7 @@ static rt_err_t gd32vf_pin_irq_enable(struct rt_device *device, rt_base_t pin,
pin_irq_enable_mask &= ~irqmap->pinbit;
eclic_irq_disable(irqmap->irqno);
- exti_interrupt_flag_clear(EXTI_(index->pin));
+ exti_interrupt_flag_clear(EXTI_(irqindex));
rt_hw_interrupt_enable(level);
}