work.c

Включим тактирование порта на котором висит кнопка:

/* enable led & button port */
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN | RCC_AHB1ENR_GPIOAEN;

Настроим его, а также настроим и активизируем прерывание на линии exti0 на падение напряжения:

/* pull-up button io */
    BUT_PORT->PUPDR |= GPIO_PUPDR_PUPDR0_1;
    /* route exti0 to pa0 */
    SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI0_PA;
    /* setup exti0 to failing edge */
    EXTI->FTSR |= EXTI_FTSR_TR0;
    /* enable exti0 interrupt */
    EXTI->IMR |= EXTI_IMR_MR0;

Режим регистров захвата/сравнения переведем в подрежим прямой ШИМ:

/* tim4 setup cc chanel1..4 */
    TIM4->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2;
    TIM4->CCMR2 |= TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2;

Включим прерывание exti0:

/* nvic enable exti0 irq */
    NVIC_EnableIRQ(EXTI0_IRQn);

А также в основной цикл добавим включение прерывания exti0:

/* infinity loop */
    while (1) {
        /* enable exti0 interrupt */
        EXTI->IMR |= EXTI_IMR_MR0;
    }