#include "Driver_GPIO.h" #include "stm32f4xx.h" #include "sram_vtor.h" #include "debounce.h" extern ARM_DRIVER_GPIO Driver_GPIOA, Driver_GPIOC; volatile long gTicks; void on_tick(void) { gTicks++; } void delay(uint32_t t) { uint32_t start = gTicks; // modular subtraction is resillient against // up to a single overflow in gTicks while (gTicks - start < t) __WFI(); } void init_clock(void) { SystemCoreClockUpdate(); SysTick_Config(SystemCoreClock / 1000); NVIC_SetVector(SysTick_IRQn, (uintptr_t)on_tick); NVIC_EnableIRQ(SysTick_IRQn); RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOCEN; (void)RCC->AHB1ENR; (void)RCC->AHB1ENR; } int main(void) { ARM_DRIVER_GPIO *ioa = &Driver_GPIOA, *ioc = &Driver_GPIOC; NVIC_Relocate_VTOR(); init_clock(); ioa->Setup(5, NULL); ioa->SetDirection(5, ARM_GPIO_OUTPUT); ioc->Setup(13, NULL); sample_state button_samples; debounce_init(&button_samples, true, 5); bool led = true; ioa->SetOutput(5, led); while (1) { bool *stable; stable = debounce( &button_samples, ioc->GetInput(13)); if (stable && !*stable) { led = !led; ioa->SetOutput(5, led); } delay(10); } }