====== External Interrupts ====== The EXTI controller consists of 23 edge detectors, which can be configured individually. \\ \\ {{exti_complete.svg?700em}} \\ \\ ===== EXTI Lines ===== |< 100% 5em >| |0..15|EXTI lines 0..15 correspond to the GPIO pins 0..15| |16|PVD interrupt| |17|RTC Alarm A & B interrupt| |18|USB OTG FS interrupt| |19|Ethernet wakeup| |20|USB OTG HS interrupt| |21|Tamper & time stamp interrupt| |22|RTC wakeup interrupt| \\ ===== Configuration Register ===== ==== SYSCFG_EXTICR1 - External interrupt configuration register 1 ==== \\ {{syscfg_reg_exticr1.svg}} \\ \\ ==== SYSCFG_EXTICR2 - External interrupt configuration register 2 ==== \\ {{syscfg_reg_exticr2.svg}} \\ \\ ==== SYSCFG_EXTICR3 - External interrupt configuration register 3 ==== \\ {{syscfg_reg_exticr3.svg}} \\ \\ ==== SYSCFG_EXTICR4 - External interrupt configuration register 4 ==== \\ {{syscfg_reg_exticr4.svg}} \\ \\ Select the source input for EXTI |< 100% 5em 5em >| |EXTIx|0000|GPIOA pin x (reset state)| |:::|0001|GPIOB pin x| |:::|...| |:::|1010|GPIOK pin x| \\ ==== EXTI_RTSR / EXTI_FTSR - Rising / falling trigger selection register ==== \\ {{exti_reg_xtsr.svg}} \\ \\ |< 100% 5em 5em >| |TRx|0|Trigger for EXTI line x disabled (reset state)| |:::|1|Trigger for EXTI line x enabled| \\ ==== EXTI_IMR - Interrupt mask register ==== \\ {{exti_reg_imr.svg}} \\ \\ |< 100% 5em 5em >| |MRx|0|Interrupt request for EXTI line x masked (reset state)| |:::|1|Interrupt request for EXTI line x unmasked| \\ ==== EXTI_PR - Pending register ==== \\ {{exti_reg_pr.svg}} \\ \\ |< 100% 5em 5em >| |PRx*|0|No trigger request occurred| |:::|1|Selected trigger request occured| * This bit is set when the selected edge event arrives on the external interrupt line x. This bis is cleared by programming it to '1' ===== Programming Example ===== ==== Setup Peripheral (e.g. GPIOA Pin 5) ==== #include "reg_stm32f4xx.h" RCC->AHB1ENR |= (0x1 << 0u); /* Enable GPIOA clock */ /* Configure GPIO pin A.5 as input. */ GPIOA->MODER &= ~(0x3 << 10u); /* Clear existing mode bits 10 and 11. */ GPIOA->PUPDR &= ~(0x3 << 10u); /* Clear existing pull-up/-down bits 10 and 11. */ GPIOA->PUPDR |= (0x1 << 10u); /* Set pin 5 to pull-up mode. */ \\ ==== Setup SYSCFG ==== To choose which GPIO peripheral should trigger EXTI line 5 you have to configure the SYSCFG register. #include "reg_stm32f4xx.h" SYSCFG->EXTICR2 |= (0u << 4u); /* Set EXTI5 to GPIOA. */ \\ ==== Setup EXTI ==== #include "reg_stm32f4xx.h" EXTI->RTSR |= (0x1 << 5u); /* Trigger on rising edge. */ EXTI->IMR |= (0x1 << 5u); /* Unmask interrupt line. */ \\ ==== Setup NVIC ==== #include "reg_stm32f4xx.h" NVIC->ISER0 |= (0x1 << 23u); /* Enable EXTI5 interrupt. */ \\