====== 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. */
\\