/** * gpio irq init * * Initialize an external interrupt on a gpio pin * * @param pin Pin number to enable gpio. * @param handler Interrupt handler * @param arg Argument to pass to interrupt handler * @param trig Trigger mode of interrupt * @param pull Push/pull mode of input. * * @return int */ int gpio_irq_init(int pin, gpio_irq_handler_t handler, void *arg, gpio_irq_trig_t trig, enum gpio_pull pull) { int rc; int irqn; int index; uint32_t pin_mask; EXTI_InitTypeDef exti_cfg; /* Configure the gpio for an external interrupt */ rc = 0; pin_mask = GPIO_MASK(pin); index = GPIO_INDEX(pin); exti_cfg.EXTI_Line = index; exti_cfg.EXTI_Mode = EXTI_Mode_Interrupt; switch (trig) { case GPIO_TRIG_NONE: rc = -1; break; case GPIO_TRIG_RISING: exti_cfg.EXTI_Trigger = EXTI_Trigger_Rising; break; case GPIO_TRIG_FALLING: exti_cfg.EXTI_Trigger = EXTI_Trigger_Falling; break; case GPIO_TRIG_BOTH: exti_cfg.EXTI_Trigger = EXTI_Trigger_Rising_Falling; break; case GPIO_TRIG_LOW: rc = -1; break; case GPIO_TRIG_HIGH: rc = -1; break; default: rc = -1; break; } exti_cfg.EXTI_LineCmd = ENABLE; /* Check to make sure no error has occurred */ if (!rc) { /* Disable interrupt and clear any pending */ gpio_irq_disable(pin); EXTI_ClearFlag(pin_mask); gpio_init_in(pin, pull); /* Configure SYSCFG */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); /* Configure EXTI */ SYSCFG_EXTILineConfig(GPIO_PORT(pin), index); EXTI_Init(&exti_cfg); /* Set the gpio irq handler */ gpio_irq_handlers[index].isr = handler; gpio_irq_handlers[index].arg = arg; /* Configure the GPIO */ if (!rc) { /* Enable interrupt vector in NVIC */ irqn = hal_gpio_pin_to_irq(pin); hal_gpio_set_nvic(irqn); } } return rc; }
/** * gpio irq init * * Initialize an external interrupt on a gpio pin * * @param pin Pin number to enable gpio. * @param handler Interrupt handler * @param arg Argument to pass to interrupt handler * @param trig Trigger mode of interrupt * @param pull Push/pull mode of input. * * @return int */ int hal_gpio_irq_init(int pin, hal_gpio_irq_handler_t handler, void *arg, hal_gpio_irq_trig_t trig, hal_gpio_pull_t pull) { int rc; int irqn; int index; uint32_t pin_mask; uint32_t mode; GPIO_InitTypeDef cfg; /* Configure the gpio for an external interrupt */ rc = 0; switch (trig) { case HAL_GPIO_TRIG_NONE: rc = -1; break; case HAL_GPIO_TRIG_RISING: mode = GPIO_MODE_IT_RISING; break; case HAL_GPIO_TRIG_FALLING: mode = GPIO_MODE_IT_FALLING; break; case HAL_GPIO_TRIG_BOTH: mode = GPIO_MODE_IT_RISING_FALLING; break; case HAL_GPIO_TRIG_LOW: rc = -1; break; case HAL_GPIO_TRIG_HIGH: rc = -1; break; default: rc = -1; break; } /* Check to make sure no error has occurred */ if (!rc) { /* Disable interrupt and clear any pending */ hal_gpio_irq_disable(pin); pin_mask = HAL_GPIO_PIN(pin); __HAL_GPIO_EXTI_CLEAR_FLAG(pin_mask); /* Set the gpio irq handler */ index = HAL_GPIO_PIN_NUM(pin); hal_gpio_irq[index].isr = handler; hal_gpio_irq[index].arg = arg; hal_gpio_irq[index].invoked = 0; /* Configure the GPIO */ cfg.Mode = mode; cfg.Pull = pull; rc = hal_gpio_init_stm(pin, &cfg); if (!rc) { /* Enable interrupt vector in NVIC */ irqn = hal_gpio_pin_to_irq(pin); hal_gpio_set_nvic(irqn); } } return rc; }