11 #include "stm32/stm32f4xx_misc.h"
16 struct gpio_irq_handler_t
18 uint32_t (*handler)(
const struct gpio_t *gpio);
23 static struct gpio_irq_handler_t handlers[16];
25 static uint32_t exti_line(
const struct gpio_t *gpio)
33 EXTI_StructInit(&EXTI_InitStructure);
34 EXTI_InitStructure.
EXTI_Line = exti_line(gpio);
37 EXTI_Init(&EXTI_InitStructure);
49 static void exti_handler(uint32_t
nr)
51 const struct gpio_t *gpio = &handlers[
nr].gpio;
52 EXTI->PR = exti_line(gpio);
54 switch (handlers[nr].
mode)
62 handlers[
nr].handler(gpio);
68 if (handlers[nr].handler(gpio))
79 if (handlers[nr].handler(gpio))
94 static void exti0_irq_handler(
void)
99 static void exti1_irq_handler(
void)
104 static void exti2_irq_handler(
void)
109 static void exti3_irq_handler(
void)
114 static void exit4_irq_handler(
void)
119 static void exti9_5_irq_handler(
void)
122 for (i = 5 ; i <= 9 ; i++)
124 const struct gpio_t *gpio = &handlers[i].gpio;
126 if (!exti_line(gpio))
131 if (EXTI_GetITStatus(exti_line(gpio)))
138 static void exti15_10_irq_handler(
void)
141 for (i = 10 ; i <= 15 ; i++)
143 const struct gpio_t *gpio = &handlers[i].gpio;
145 if (!exti_line(gpio))
150 if (EXTI_GetITStatus(exti_line(gpio)))
157 struct gpio_exti_map_t
160 void (*handler)(void);
163 static const struct gpio_exti_map_t map[] =
165 {.irq_nr =
EXTI0_IRQn, .handler = exti0_irq_handler, },
166 {.irq_nr =
EXTI1_IRQn, .handler = exti1_irq_handler, },
167 {.irq_nr =
EXTI2_IRQn, .handler = exti2_irq_handler, },
168 {.irq_nr =
EXTI3_IRQn, .handler = exti3_irq_handler, },
169 {.irq_nr =
EXTI4_IRQn, .handler = exit4_irq_handler, },
170 {.irq_nr =
EXTI9_5_IRQn, .handler = exti9_5_irq_handler, },
171 {.irq_nr =
EXTI9_5_IRQn, .handler = exti9_5_irq_handler, },
172 {.irq_nr =
EXTI9_5_IRQn, .handler = exti9_5_irq_handler, },
173 {.irq_nr =
EXTI9_5_IRQn, .handler = exti9_5_irq_handler, },
174 {.irq_nr =
EXTI9_5_IRQn, .handler = exti9_5_irq_handler, },
185 switch (handlers[gpio->
nr].mode)
196 EXTI_GenerateSWInterrupt(exti_line(gpio));
204 EXTI_GenerateSWInterrupt(exti_line(gpio));
252 status_e status = _disable_irq(gpio);
254 handlers[gpio->
nr].handler = handler;
255 handlers[gpio->
nr].gpio = NC;
260 handlers[gpio->
nr].mode = mode;
261 handlers[gpio->
nr].handler = handler;
262 handlers[gpio->
nr].gpio = *gpio;
266 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
267 EXTI_StructInit(&EXTI_InitStructure);
268 EXTI_InitStructure.
EXTI_Line = exti_line(gpio);
270 EXTI_InitStructure.
EXTI_Mode = EXTI_Mode_Interrupt;
287 EXTI_InitStructure.
EXTI_Trigger = EXTI_Trigger_Rising_Falling;
304 SYSCFG_EXTILineConfig(gpio->
ctrl, gpio->
nr);
305 EXTI_Init(&EXTI_InitStructure);
312 NVIC_InitStructure.NVIC_Handler = map[gpio->
nr].handler;
313 NVIC_Init(&NVIC_InitStructure);
321 EXTI_GenerateSWInterrupt(exti_line(gpio));
328 EXTI_GenerateSWInterrupt(exti_line(gpio));
This file contains all the functions prototypes for the RCC firmware library.
FunctionalState EXTI_LineCmd
EXTITrigger_TypeDef EXTI_Trigger
BSP - Board Support Package.
EXTI Init Structure definition.
uint8_t nr
Pin number (0 for GPIOx0, ... , 3 for GPIOx3, ...)
uint8_t ctrl
Controller number (0 for GPIOA, 1 for GPIOB, ...)
status_e gpio_irq_disable(const struct gpio_t *gpio)
Disable a gpio interrupt.
enum gpio_mode_e mode
mode for instance GPIO_INPUT | GPIO_PULLDOWN
void bsp_fatal(status_e status)
fatal error
uint8_t NVIC_IRQChannelSubPriority
NVIC Init Structure definition.
static uint32_t gpio_get(const struct gpio_t *gpio)
Get gpio level.
This file contains all the functions prototypes for the SYSCFG firmware library.
status_e gpio_irq_setup(const struct gpio_t *gpio, uint32_t(*handler)(const struct gpio_t *gpio), enum gpio_irq_mode_e mode, uint32_t prio)
Setup interrupt on GPIO.
#define GPIO_NC
Unconnected pin.
EXTIMode_TypeDef EXTI_Mode
FunctionalState NVIC_IRQChannelCmd
uint16_t mask
Pin mask (0x1 for GPIOx0, ... , 0x4 for GPIOx3, ...)
uint8_t NVIC_IRQChannelPreemptionPriority
status_e gpio_setup(const struct gpio_t *gpio)
Setup a gpio.
#define ARRAY_SIZE(x)
Number of elements in the array.
status_e gpio_irq_restore(const struct gpio_t *gpio)
Restore a gpio interrupt.
This file contains all the functions prototypes for the EXTI firmware library.