Ejemplo n.º 1
0
/**
 * 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;
}
Ejemplo n.º 2
0
/**
 * 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;
}