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