int gpio_init_int(gpio_t dev, gpio_pp_t pullup, gpio_flank_t flank, gpio_cb_t cb, void *arg) { int res; uint32_t pin = 0; /* configure pin as input */ res = gpio_init_in(dev, pullup); if (res < 0) { return res; } /* set interrupt priority (its the same for all EXTI interrupts) */ NVIC_SetPriority(EXTI0_1_IRQn, GPIO_IRQ_PRIO); NVIC_SetPriority(EXTI2_3_IRQn, GPIO_IRQ_PRIO); NVIC_SetPriority(EXTI4_15_IRQn, GPIO_IRQ_PRIO); /* enable clock of the SYSCFG module for EXTI configuration */ RCC->APB2ENR |= RCC_APB2ENR_SYSCFGCOMPEN; /* read pin number, set EXIT channel and enable global interrupt for EXTI channel */ switch (dev) { #ifdef GPIO_0_EN case GPIO_0: pin = GPIO_0_PIN; GPIO_0_EXTI_CFG(); NVIC_SetPriority(GPIO_0_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_0_IRQ); break; #endif #ifdef GPIO_1_EN case GPIO_1: pin = GPIO_1_PIN; GPIO_1_EXTI_CFG(); NVIC_SetPriority(GPIO_1_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_1_IRQ); break; #endif #ifdef GPIO_2_EN case GPIO_2: pin = GPIO_2_PIN; GPIO_2_EXTI_CFG(); NVIC_SetPriority(GPIO_2_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_2_IRQ); break; #endif #ifdef GPIO_3_EN case GPIO_3: pin = GPIO_3_PIN; GPIO_3_EXTI_CFG(); NVIC_SetPriority(GPIO_3_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_3_IRQ); break; #endif #ifdef GPIO_4_EN case GPIO_4: pin = GPIO_4_PIN; GPIO_4_EXTI_CFG(); NVIC_SetPriority(GPIO_4_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_4_IRQ); break; #endif #ifdef GPIO_5_EN case GPIO_5: pin = GPIO_5_PIN; GPIO_5_EXTI_CFG(); NVIC_SetPriority(GPIO_5_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_5_IRQ); break; #endif #ifdef GPIO_6_EN case GPIO_6: pin = GPIO_6_PIN; GPIO_6_EXTI_CFG(); NVIC_SetPriority(GPIO_6_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_6_IRQ); break; #endif #ifdef GPIO_7_EN case GPIO_7: pin = GPIO_7_PIN; GPIO_7_EXTI_CFG(); NVIC_SetPriority(GPIO_7_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_7_IRQ); break; #endif #ifdef GPIO_8_EN case GPIO_8: pin = GPIO_8_PIN; GPIO_8_EXTI_CFG(); NVIC_SetPriority(GPIO_8_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_8_IRQ); break; #endif #ifdef GPIO_9_EN case GPIO_9: pin = GPIO_9_PIN; GPIO_9_EXTI_CFG(); NVIC_SetPriority(GPIO_9_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_9_IRQ); break; #endif #ifdef GPIO_10_EN case GPIO_10: pin = GPIO_10_PIN; GPIO_10_EXTI_CFG(); NVIC_SetPriority(GPIO_10_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_10_IRQ); break; #endif #ifdef GPIO_11_EN case GPIO_11: pin = GPIO_11_PIN; GPIO_11_EXTI_CFG(); NVIC_SetPriority(GPIO_11_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_11_IRQ); break; #endif } /* set callback */ gpio_config[dev].cb = cb; gpio_config[dev].arg = arg; /* configure the event that triggers an interrupt */ switch (flank) { case GPIO_RISING: EXTI->RTSR |= (1 << pin); EXTI->FTSR &= ~(1 << pin); break; case GPIO_FALLING: EXTI->RTSR &= ~(1 << pin); EXTI->FTSR |= (1 << pin); break; case GPIO_BOTH: EXTI->RTSR |= (1 << pin); EXTI->FTSR |= (1 << pin); break; } /* clear any pending requests */ EXTI->PR = (1 << pin); /* unmask the pins interrupt channel */ EXTI->IMR |= (1 << pin); return 0; }
int gpio_init_int(gpio_t dev, gpio_pp_t pullup, gpio_flank_t flank, gpio_cb_t cb, void *arg) { int res; uint32_t pin; res = gpio_init_in(dev, pullup); if (res < 0) { return res; } pin = gpio_pin_map[dev]; /* enable the SYSCFG clock */ RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN; /* enable IRQ */ switch (dev) { #if GPIO_0_EN case GPIO_0: GPIO_0_EXTI_CFG(); break; #endif #if GPIO_1_EN case GPIO_1: GPIO_1_EXTI_CFG(); break; #endif #if GPIO_2_EN case GPIO_2: GPIO_2_EXTI_CFG(); break; #endif #if GPIO_3_EN case GPIO_3: GPIO_3_EXTI_CFG(); break; #endif #if GPIO_4_EN case GPIO_4: GPIO_4_EXTI_CFG(); break; #endif #if GPIO_5_EN case GPIO_5: GPIO_5_EXTI_CFG(); break; #endif #if GPIO_6_EN case GPIO_6: GPIO_6_EXTI_CFG(); break; #endif #if GPIO_7_EN case GPIO_7: GPIO_7_EXTI_CFG(); break; #endif #if GPIO_8_EN case GPIO_8: GPIO_8_EXTI_CFG(); break; #endif #if GPIO_9_EN case GPIO_9: GPIO_9_EXTI_CFG(); break; #endif #if GPIO_10_EN case GPIO_10: GPIO_10_EXTI_CFG(); break; #endif #if GPIO_11_EN case GPIO_11: GPIO_11_EXTI_CFG(); break; #endif #if GPIO_12_EN case GPIO_12: GPIO_12_EXTI_CFG(); break; #endif #if GPIO_13_EN case GPIO_13: GPIO_13_EXTI_CFG(); break; #endif #if GPIO_14_EN case GPIO_14: GPIO_14_EXTI_CFG(); break; #endif #if GPIO_15_EN case GPIO_15: GPIO_15_EXTI_CFG(); break; #endif } NVIC_SetPriority(gpio_irq_map[dev], GPIO_IRQ_PRIO); NVIC_EnableIRQ(gpio_irq_map[dev]); /* set callback */ gpio_config[dev].cb = cb; gpio_config[dev].arg = arg; /* configure the active edges */ switch (flank) { case GPIO_RISING: EXTI->RTSR |= (1 << pin); EXTI->FTSR &= ~(1 << pin); break; case GPIO_FALLING: EXTI->RTSR &= ~(1 << pin); EXTI->FTSR |= (1 << pin); break; case GPIO_BOTH: EXTI->RTSR |= (1 << pin); EXTI->FTSR |= (1 << pin); break; } /* clear any pending requests */ EXTI->PR = (1 << pin); /* enable interrupt for EXTI line */ EXTI->IMR |= (1 << pin); return 0; }
int gpio_init_int(gpio_t dev, gpio_pp_t pullup, gpio_flank_t flank, gpio_cb_t cb, void *arg) { int res; uint8_t exti_line; uint8_t gpio_irq; /* configure pin as input */ res = gpio_init_in(dev, pullup); if (res < 0) { return res; } /* set interrupt priority (its the same for all EXTI interrupts) */ NVIC_SetPriority(EXTI0_IRQn, GPIO_IRQ_PRIO); NVIC_SetPriority(EXTI1_IRQn, GPIO_IRQ_PRIO); NVIC_SetPriority(EXTI2_IRQn, GPIO_IRQ_PRIO); NVIC_SetPriority(EXTI4_IRQn, GPIO_IRQ_PRIO); RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; /* read pin number, set EXTI channel and enable global interrupt for EXTI channel */ switch (dev) { #if GPIO_0_EN case GPIO_0: exti_line = GPIO_0_PIN; gpio_irq = GPIO_0; GPIO_0_EXTI_CFG(); NVIC_SetPriority(GPIO_0_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_0_IRQ); break; #endif #if GPIO_1_EN case GPIO_1: exti_line = GPIO_1_PIN; gpio_irq = GPIO_1; GPIO_1_EXTI_CFG(); NVIC_SetPriority(GPIO_1_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_1_IRQ); break; #endif #if GPIO_2_EN case GPIO_2: exti_line = GPIO_2_PIN; gpio_irq = GPIO_2; GPIO_2_EXTI_CFG(); NVIC_SetPriority(GPIO_2_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_2_IRQ); break; #endif #if GPIO_3_EN case GPIO_3: exti_line = GPIO_3_PIN; gpio_irq = GPIO_3; GPIO_3_EXTI_CFG(); NVIC_SetPriority(GPIO_3_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_3_IRQ); break; #endif #if GPIO_4_EN case GPIO_4: exti_line = GPIO_4_PIN; gpio_irq = GPIO_4; GPIO_4_EXTI_CFG(); NVIC_SetPriority(GPIO_4_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_4_IRQ); break; #endif #if GPIO_5_EN case GPIO_5: exti_line = GPIO_5_PIN; gpio_irq = GPIO_5; GPIO_5_EXTI_CFG(); NVIC_SetPriority(GPIO_5_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_5_IRQ); break; #endif #if GPIO_6_EN case GPIO_6: exti_line = GPIO_6_PIN; gpio_irq = GPIO_6; GPIO_6_EXTI_CFG(); NVIC_SetPriority(GPIO_6_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_6_IRQ); break; #endif #if GPIO_7_EN case GPIO_7: exti_line = GPIO_7_PIN; gpio_irq = GPIO_7; GPIO_7_EXTI_CFG(); NVIC_SetPriority(GPIO_7_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_7_IRQ); break; #endif #if GPIO_8_EN case GPIO_8: exti_line = GPIO_8_PIN; gpio_irq = GPIO_8; GPIO_8_EXTI_CFG(); NVIC_SetPriority(GPIO_8_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_8_IRQ); break; #endif #if GPIO_9_EN case GPIO_9: exti_line = GPIO_9_PIN; gpio_irq = GPIO_9; GPIO_9_EXTI_CFG(); NVIC_SetPriority(GPIO_9_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_9_IRQ); break; #endif #if GPIO_10_EN case GPIO_10: exti_line = GPIO_10_PIN; gpio_irq = GPIO_10; GPIO_10_EXTI_CFG(); NVIC_SetPriority(GPIO_10_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_10_IRQ); break; #endif #if GPIO_11_EN case GPIO_11: exti_line = GPIO_11_PIN; gpio_irq = GPIO_11; GPIO_11_EXTI_CFG(); NVIC_SetPriority(GPIO_11_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_11_IRQ); break; #endif #if GPIO_12_EN case GPIO_12: exti_line = GPIO_12_PIN; gpio_irq = GPIO_12; GPIO_12_EXTI_CFG(); NVIC_SetPriority(GPIO_12_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_12_IRQ); break; #endif #if GPIO_13_EN case GPIO_13: exti_line = GPIO_13_PIN; gpio_irq = GPIO_13; GPIO_13_EXTI_CFG(); NVIC_SetPriority(GPIO_13_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_13_IRQ); break; #endif #if GPIO_14_EN case GPIO_14: exti_line = GPIO_14_PIN; gpio_irq = GPIO_14; GPIO_14_EXTI_CFG(); NVIC_SetPriority(GPIO_14_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_14_IRQ); break; #endif #if GPIO_15_EN case GPIO_15: exti_line = GPIO_15_PIN; gpio_irq = GPIO_15; GPIO_15_EXTI_CFG(); NVIC_SetPriority(GPIO_15_IRQ, GPIO_IRQ_PRIO); NVIC_EnableIRQ(GPIO_15_IRQ); break; #endif default: return -1; } /* set callback */ config[gpio_irq].cb = cb; config[gpio_irq].arg = arg; /* configure the event that triggers an interrupt */ switch (flank) { case GPIO_RISING: EXTI->RTSR |= (1 << exti_line); EXTI->FTSR &= ~(1 << exti_line); break; case GPIO_FALLING: EXTI->RTSR &= ~(1 << exti_line); EXTI->FTSR |= (1 << exti_line); break; case GPIO_BOTH: EXTI->RTSR |= (1 << exti_line); EXTI->FTSR |= (1 << exti_line); break; } /* clear event mask */ EXTI->EMR &= ~(1 << exti_line); /* unmask the pins interrupt channel */ EXTI->IMR |= (1 << exti_line); return 0; }