Esempio n. 1
0
void gpio_init(gpio_t *obj, PinName pin)
{
    if (pin == (PinName)NC) {
        return;
    }
    
    obj->port_num = WIZ_PORT(pin);
    obj->pin_index    = WIZ_PIN_INDEX(pin);
    obj->pin = pin;
    GPIO_TypeDef *gpio = (GPIO_TypeDef *)Get_GPIO_BaseAddress(obj->port_num);
    obj->reg_data_in    = &gpio->DATA;
}
Esempio n. 2
0
int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32_t id)
{
    IRQn_Type irq_n = (IRQn_Type)0;
    uint32_t gpio_pin;

    if (pin == NC) return -1;

    uint32_t port_index = WIZ_PORT(pin);
    uint32_t pin_index  = WIZ_PIN(pin);

    // If port_index is not GPIOC, return -1
    if (port_index != 2 ) {
        error("InterruptIn error: pin not supported.\n");
        return -1;
    }

    // Select irq number and interrupt routine
    if ((pin_index == 0) || (pin_index == 1) || (pin_index == 4) || (pin_index == 6) || (pin_index == 7)) {
        irq_n = EXTI_IRQn;
        gpio_pin = 1 << pin_index;
    } else {
        error("InterruptIn error: pin not supported.\n");
        return -1;
    }

    // Enable GPIO clock
    uint32_t gpio_add = Get_GPIO_BaseAddress(port_index);

    // Configure GPIO
    EXTI_InitTypeDef EXTI_InitDef;
    EXTI_InitDef.EXTI_Line = gpio_pin;
    EXTI_InitDef.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_Init(gpio_add, &EXTI_InitDef);

    // Enable EXTI interrupt
    NVIC_ClearPendingIRQ(irq_n); // Pending bit Clear
    NVIC_EnableIRQ(irq_n);

    obj->irq_n = irq_n;
//    obj->irq_index = irq_index;
    obj->event = EDGE_FALL;
    obj->pin = pin;

    channel.channel_pin = pin_index;
    channel.pin_mask = gpio_pin;
    channel.channel_ids = id;
    channel.obj = obj;

    irq_handler = handler;

    return 0;
}
Esempio n. 3
0
void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
{
    uint16_t porarity;

    if (enable) {
        if (event == IRQ_RISE) {
            porarity = EXTI_Trigger_Rising;
            obj->event = EDGE_RISE;
        }
        if (event == IRQ_FALL) {
            porarity = EXTI_Trigger_Falling;
            obj->event = EDGE_FALL;
        }

        uint32_t port_index = WIZ_PORT(obj->pin);
        uint32_t pin_index  = WIZ_PIN(obj->pin);

        // Enable GPIO clock
        uint32_t gpio_add = Get_GPIO_BaseAddress(port_index);
        EXTI_Polarity_Set(port_index,(1<<pin_index),porarity);
    } else { // Disable
        gpio_irq_free(obj);
    }
}