Для начала добавим функцию аппаратной задержки - она будет вызываться обработчиком системного таймера. Через 500 вызовов происходит смена состояния светодиодов на противоположное:
/* 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; }}В функцию work() мы добавим инциализацию портов в/в и включение светодиодов:
/* enable led & button port */ RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN | RCC_AHB1ENR_GPIOAEN; /* set led pins to output state */ LED_PORT->MODER |= GPIO_MODER_MODER12_0 | GPIO_MODER_MODER13_0 | GPIO_MODER_MODER14_0 | GPIO_MODER_MODER15_0; /* pull-up button io */ BUT_PORT->PUPDR |= GPIO_PUPDR_PUPDR0_1; /* enable leds */ LED_PORT->ODR |= ALL_LEDS;Инициализацию таймера - т.к. таймер у нас работает на частоте ядра(~16МГц) то период его будет равен 16000 циклов, что равно ~1мс:
/* setup SysTick timer */ SysTick_Config(16000);Т.к. мы подключили заголовочный файл ядра - core_cm4.h то воспользуемся функцией инициализации системного таймера оттуда.
И наконец добавим бесконечный цикл в котором будет происходить опрос кнопки:
/* infinity loop */ while (1) { /* if button pressed */ if (BUT_PORT->IDR & BUT1) { /* change status to two leds - red & green */ LED_PORT->ODR ^= GREEN_LED | RED_LED; /* wait while button pressed */ while (BUT_PORT->IDR & BUT1); } }