В основной фунции work() уберем регистрацию падения напряжения(детектор спада) и добавим инцициализацию системного таймера:
/* enable exti0 interrupt */
EXTI->IMR |= EXTI_IMR_MR0;
/* nvic enable exti0 irq */
NVIC_EnableIRQ(EXTI0_IRQn);
/* setup SysTick timer */
SysTick_Config(16000);
Также добавим функцию аппаратной задержки с обновлением флага прерывания exti0:
/* hardware delay and switch */
void hard_delay(void) {
static unsigned int counter;
counter++;
/* wait a half second */
if (counter > 500) {
/* switch leds */
LED_PORT->ODR ^= ALL_LEDS;
counter = 0;
}
/* if exit0 interrupt disable */
if (!(EXTI->IMR & EXTI_IMR_MR0)) {
/* enable exti0 interrupt */
EXTI->IMR |= EXTI_IMR_MR0;
}
}