Все просто - вектор и его обработчик:
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. По сути т.к. переклюлючение светодиодов происходит на половине периода таймера, то происходит сдвиг фаз мигания.