36 #if defined(PIOS_INCLUDE_EXTI)
39 #define EXTI_MAX_LINES 16
41 const struct pios_exti_cfg * pios_exti_line_to_cfg_map[EXTI_MAX_LINES];
43 static uint8_t PIOS_EXTI_line_to_index(uint32_t
line)
46 case EXTI_Line0:
return 0;
47 case EXTI_Line1:
return 1;
48 case EXTI_Line2:
return 2;
49 case EXTI_Line3:
return 3;
50 case EXTI_Line4:
return 4;
51 case EXTI_Line5:
return 5;
52 case EXTI_Line6:
return 6;
53 case EXTI_Line7:
return 7;
54 case EXTI_Line8:
return 8;
55 case EXTI_Line9:
return 9;
56 case EXTI_Line10:
return 10;
57 case EXTI_Line11:
return 11;
58 case EXTI_Line12:
return 12;
59 case EXTI_Line13:
return 13;
60 case EXTI_Line14:
return 14;
61 case EXTI_Line15:
return 15;
68 static uint8_t PIOS_EXTI_gpio_port_to_exti_source_port(GPIO_TypeDef * gpio_port)
70 switch ((uint32_t)gpio_port) {
72 case (uint32_t)GPIOA:
return (GPIO_PortSourceGPIOA);
73 case (uint32_t)GPIOB:
return (GPIO_PortSourceGPIOB);
74 case (uint32_t)GPIOC:
return (GPIO_PortSourceGPIOC);
75 case (uint32_t)GPIOD:
return (GPIO_PortSourceGPIOD);
76 case (uint32_t)GPIOE:
return (GPIO_PortSourceGPIOE);
77 case (uint32_t)GPIOF:
return (GPIO_PortSourceGPIOF);
78 case (uint32_t)GPIOG:
return (GPIO_PortSourceGPIOG);
80 case (uint32_t)GPIOA:
return (EXTI_PortSourceGPIOA);
81 case (uint32_t)GPIOB:
return (EXTI_PortSourceGPIOB);
82 case (uint32_t)GPIOC:
return (EXTI_PortSourceGPIOC);
83 case (uint32_t)GPIOD:
return (EXTI_PortSourceGPIOD);
84 case (uint32_t)GPIOE:
return (EXTI_PortSourceGPIOE);
85 case (uint32_t)GPIOF:
return (EXTI_PortSourceGPIOF);
88 case (uint32_t)GPIOG:
return (EXTI_PortSourceGPIOG);
98 static uint8_t PIOS_EXTI_gpio_pin_to_exti_source_pin(uint32_t gpio_pin)
100 switch ((uint32_t)gpio_pin) {
101 case GPIO_Pin_0:
return (GPIO_PinSource0);
102 case GPIO_Pin_1:
return (GPIO_PinSource1);
103 case GPIO_Pin_2:
return (GPIO_PinSource2);
104 case GPIO_Pin_3:
return (GPIO_PinSource3);
105 case GPIO_Pin_4:
return (GPIO_PinSource4);
106 case GPIO_Pin_5:
return (GPIO_PinSource5);
107 case GPIO_Pin_6:
return (GPIO_PinSource6);
108 case GPIO_Pin_7:
return (GPIO_PinSource7);
109 case GPIO_Pin_8:
return (GPIO_PinSource8);
110 case GPIO_Pin_9:
return (GPIO_PinSource9);
111 case GPIO_Pin_10:
return (GPIO_PinSource10);
112 case GPIO_Pin_11:
return (GPIO_PinSource11);
113 case GPIO_Pin_12:
return (GPIO_PinSource12);
114 case GPIO_Pin_13:
return (GPIO_PinSource13);
115 case GPIO_Pin_14:
return (GPIO_PinSource14);
116 case GPIO_Pin_15:
return (GPIO_PinSource15);
126 uint8_t line_index = PIOS_EXTI_line_to_index(cfg->
line);
128 if (pios_exti_line_to_cfg_map[line_index] != NULL) {
134 pios_exti_line_to_cfg_map[line_index] =
cfg;
140 uint8_t exti_source_port = PIOS_EXTI_gpio_port_to_exti_source_port(cfg->
pin.
gpio);
141 uint8_t exti_source_pin = PIOS_EXTI_gpio_pin_to_exti_source_pin(cfg->
pin.
init.GPIO_Pin);
144 GPIO_EXTILineConfig(exti_source_port, exti_source_pin);
146 SYSCFG_EXTILineConfig(exti_source_port, exti_source_pin);
149 EXTI_Init((EXTI_InitTypeDef*)&cfg->
exti.
init);
152 NVIC_Init((NVIC_InitTypeDef*)&cfg->
irq.
init);
166 uint8_t line_index = PIOS_EXTI_line_to_index(cfg->
line);
167 pios_exti_line_to_cfg_map[line_index] = NULL;
170 uint8_t exti_source_pin = PIOS_EXTI_gpio_pin_to_exti_source_pin(cfg->
pin.
init.GPIO_Pin);
172 uint32_t tmp = ((uint32_t)0x0F) << (0x04 * (exti_source_pin & (uint8_t)0x03));
175 AFIO ->EXTICR[exti_source_pin >> 0x02] &= ~tmp;
177 SYSCFG->EXTICR[exti_source_pin >> 0x02] &= ~tmp;
181 EXTI_InitTypeDef init = {
182 .EXTI_LineCmd = DISABLE,
183 .EXTI_Mode = cfg->
exti.
init.EXTI_Mode,
184 .EXTI_Line = cfg->
exti.
init.EXTI_Line,
189 static bool PIOS_EXTI_generic_irq_handler(uint8_t line_index)
191 const struct pios_exti_cfg * cfg = pios_exti_line_to_cfg_map[line_index];
203 #define PIOS_EXTI_HANDLE_LINE(line) \
204 if (EXTI_GetITStatus(EXTI_Line ## line) != RESET) { \
205 EXTI_ClearITPendingBit(EXTI_Line ## line); \
206 PIOS_EXTI_generic_irq_handler(line); \
209 static void PIOS_EXTI_0_irq_handler(
void)
212 PIOS_EXTI_HANDLE_LINE(0);
217 static
void PIOS_EXTI_1_irq_handler(
void)
220 PIOS_EXTI_HANDLE_LINE(1);
225 static
void PIOS_EXTI_2_irq_handler(
void)
228 PIOS_EXTI_HANDLE_LINE(2);
233 static
void PIOS_EXTI_3_irq_handler(
void)
236 PIOS_EXTI_HANDLE_LINE(3);
241 static
void PIOS_EXTI_4_irq_handler(
void)
244 PIOS_EXTI_HANDLE_LINE(4);
249 static
void PIOS_EXTI_9_5_irq_handler(
void)
253 PIOS_EXTI_HANDLE_LINE(5);
254 PIOS_EXTI_HANDLE_LINE(6);
255 PIOS_EXTI_HANDLE_LINE(7);
256 PIOS_EXTI_HANDLE_LINE(8);
257 PIOS_EXTI_HANDLE_LINE(9);
263 static
void PIOS_EXTI_15_10_irq_handler(
void)
267 PIOS_EXTI_HANDLE_LINE(10);
268 PIOS_EXTI_HANDLE_LINE(11);
269 PIOS_EXTI_HANDLE_LINE(12);
270 PIOS_EXTI_HANDLE_LINE(13);
271 PIOS_EXTI_HANDLE_LINE(14);
272 PIOS_EXTI_HANDLE_LINE(15);
Main PiOS header to include all the compiled in PiOS options.
int32_t PIOS_EXTI_Init(const struct pios_exti_cfg *cfg)
#define PIOS_IRQ_Epilogue()
#define EXTI15_10_IRQHandler
void PIOS_EXTI_DeInit(const struct pios_exti_cfg *cfg)
static struct flyingpicmd_cfg_fa cfg
#define EXTI9_5_IRQHandler
#define PIOS_IRQ_Prologue()
#define PIOS_Assert(test)