main.c

Инициализируем и настроим порты в/в:

/* enable led & button port */
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN | RCC_AHB1ENR_GPIOAEN;
    /* set led pins to output state */
    LED_PORT->MODER |=
        GPIO_MODER_MODER12_0 | GPIO_MODER_MODER13_0 |
        GPIO_MODER_MODER14_0 | GPIO_MODER_MODER15_0;
    /* pull-up button io */
    BUT_PORT->PUPDR |= GPIO_PUPDR_PUPDR0_1;

Перенаправим линию exti0 на вход порта pa0:

/* route exti0 to pa0 */
    SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI0_PA;

Настроим реакцию exti0 на возрастание и падение уровня напряжения:

/* setup exti0 to rising edge */
    EXTI->RTSR |= EXTI_RTSR_TR0;
    /* setup exti0 to failing edge */
    EXTI->FTSR |= EXTI_FTSR_TR0;

Размаскируем и активизируем прерывание с exti0:

/* enable exti0 interrupt */
    EXTI->IMR |= EXTI_IMR_MR0;
    /* nvic enable exti0 irq */
    NVIC_EnableIRQ(EXTI0_IRQn);