work.c

В основной фунции 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;
    }
}

Comments