startup.c

Все просто - вектор и его обработчик:

    0,                  /*!%5 RCC                          */                                           
    exti0_irq_handler,  /*!%6 EXTI Line0                   */                       
    0,                  /*!%7 EXTI Line1                   */
/* exti0 irq handler */
void exti0_irq_handler(void) {
    if (EXTI->PR | EXTI_PR_PR0) {
        /* change pwm submode for tim4 ccch2,4 */
        TIM4->CCMR1 ^= TIM_CCMR1_OC2M_0;
        TIM4->CCMR2 ^= TIM_CCMR2_OC4M_0;
        /* clear pending irq */
        EXTI->PR |= EXTI_PR_PR0;
        /* disable exti0 interrupt */
        EXTI->IMR &= ~EXTI_IMR_MR0;
    }
}

В обработчике мы вместо изменения состояния светодиодов сменяем режим ШИМа - с прямого на обратны и наоборот для каналов 2 и 4. По сути т.к. переклюлючение светодиодов происходит на половине периода таймера, то происходит сдвиг фаз мигания.