Включим тактирование порта на котором висит кнопка:
/* 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;
}