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; }
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; }
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); } }