diff --git a/libraries/mbed/targets/hal/TARGET_STM/TARGET_DISCO_F100RB/gpio_irq_api.c b/libraries/mbed/targets/hal/TARGET_STM/TARGET_DISCO_F100RB/gpio_irq_api.c index 009c25dc4a..57ef8b13a1 100644 --- a/libraries/mbed/targets/hal/TARGET_STM/TARGET_DISCO_F100RB/gpio_irq_api.c +++ b/libraries/mbed/targets/hal/TARGET_STM/TARGET_DISCO_F100RB/gpio_irq_api.c @@ -39,41 +39,49 @@ #define EDGE_FALL (2) #define EDGE_BOTH (3) -#define CHANNEL_NUM (4) +#define CHANNEL_NUM (16) -static uint32_t channel_ids[CHANNEL_NUM] = {0, 0, 0, 0}; -static uint32_t channel_gpio[CHANNEL_NUM] = {0, 0, 0, 0}; -static uint32_t channel_pin[CHANNEL_NUM] = {0, 0, 0, 0}; +static uint32_t channel_ids[CHANNEL_NUM] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +static uint32_t channel_gpio[CHANNEL_NUM] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +static uint32_t channel_pin[CHANNEL_NUM] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; static gpio_irq_handler irq_handler; static void handle_interrupt_in(uint32_t irq_index) { - // Retrieve the gpio and pin that generate the irq - GPIO_TypeDef *gpio = (GPIO_TypeDef *)(channel_gpio[irq_index]); - uint32_t pin = (uint32_t)(1 << channel_pin[irq_index]); - - // Clear interrupt flag - if (EXTI_GetITStatus(pin) != RESET) - { - EXTI_ClearITPendingBit(pin); - } - - if (channel_ids[irq_index] == 0) return; - - // Check which edge has generated the irq - if ((gpio->IDR & pin) == 0) { - irq_handler(channel_ids[irq_index], IRQ_FALL); - } - else { - irq_handler(channel_ids[irq_index], IRQ_RISE); - } + //if irq_index==5 loop exti 5 to 9 + //if irq_index==10 loop exti 10 to 15 + //else exti loop one irq_index + uint32_t to_irq_index=(irq_index==5)?9:((irq_index==10)?15:irq_index); + GPIO_TypeDef *gpio; + uint32_t pin; + do{ + // Retrieve the gpio and pin that generate the irq + gpio = (GPIO_TypeDef *)(channel_gpio[irq_index]); + pin = (uint32_t)(1 << channel_pin[irq_index]); + // Clear interrupt flag + if (EXTI_GetITStatus(pin) != RESET) + { + EXTI_ClearITPendingBit(pin); + if (channel_ids[irq_index] == 0) return; + // Check which edge has generated the irq + if ((gpio->IDR & pin) == 0) { + irq_handler(channel_ids[irq_index], IRQ_FALL); + } else { + irq_handler(channel_ids[irq_index], IRQ_RISE); + } + } + }while(irq_index++ < to_irq_index); } + // The irq_index is passed to the function -static void gpio_irq0(void) {handle_interrupt_in(0);} -static void gpio_irq1(void) {handle_interrupt_in(1);} -static void gpio_irq2(void) {handle_interrupt_in(2);} -static void gpio_irq3(void) {handle_interrupt_in(3);} +static void gpio_irq0(void) {handle_interrupt_in(0);} // EXTI line 0 +static void gpio_irq1(void) {handle_interrupt_in(1);} // EXTI line 1 +static void gpio_irq2(void) {handle_interrupt_in(2);} // EXTI line 2 +static void gpio_irq3(void) {handle_interrupt_in(3);} // EXTI line 3 +static void gpio_irq4(void) {handle_interrupt_in(4);} // EXTI line 4 +static void gpio_irq5(void) {handle_interrupt_in(5);} // EXTI lines 5 to 9 +static void gpio_irq6(void) {handle_interrupt_in(10);} // EXTI lines 10 to 15 extern uint32_t Set_GPIO_Clock(uint32_t port_idx); @@ -88,32 +96,55 @@ int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32 uint32_t pin_index = STM_PIN(pin); // Select irq number and interrupt routine - switch (pin) { - case PC_13: // User button - irq_n = EXTI15_10_IRQn; + switch (pin_index) { + case 0: + irq_n = EXTI0_IRQn; vector = (uint32_t)&gpio_irq0; irq_index = 0; break; - case PB_3: - irq_n = EXTI3_IRQn; + case 1: + irq_n = EXTI1_IRQn; vector = (uint32_t)&gpio_irq1; irq_index = 1; break; - case PB_4: - irq_n = EXTI4_IRQn; + case 2: + irq_n = EXTI2_IRQn; vector = (uint32_t)&gpio_irq2; irq_index = 2; break; - case PB_5: - irq_n = EXTI9_5_IRQn; + case 3: + irq_n = EXTI3_IRQn; vector = (uint32_t)&gpio_irq3; irq_index = 3; break; + case 4: + irq_n = EXTI4_IRQn; + vector = (uint32_t)&gpio_irq4; + irq_index = 4; + break; + case 5: + case 6: + case 7: + case 8: + case 9: + irq_n = EXTI9_5_IRQn; + vector = (uint32_t)&gpio_irq5; + irq_index = pin_index; + break; + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + irq_n = EXTI15_10_IRQn; + vector = (uint32_t)&gpio_irq6; + irq_index = pin_index; + break; default: - error("This pin is not supported with InterruptIn."); + error("InterruptIn error: pin not supported.\n"); return -1; } - // Enable GPIO clock uint32_t gpio_add = Set_GPIO_Clock(port_index);