Skip to content

Update gpio_irq_api.c #268

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 22, 2014
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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);

Expand Down