stimer.c (1649B)
1 #include "stimer.h" 2 #include "libopencm3/stm32/rcc.h" 3 #include "libopencm3/cm3/systick.h" 4 #include "libopencm3/cm3/vector.h" 5 6 volatile uint32_t ticks; 7 8 void sys_tick_handler(void) { 9 ticks++; 10 } 11 12 // Get current tick value 13 static uint32_t systick_get_ticks(void) { 14 return ticks; 15 } 16 17 // Initialize systick peripheral 18 void stimer_systick_init(void) { 19 systick_set_frequency(1000, rcc_ahb_frequency); 20 systick_counter_enable(); 21 systick_interrupt_enable(); 22 } 23 24 // Setup and start a software timer 25 void stimer_start(Stimer_t *timer, uint32_t waitTime, bool autoReset) { 26 timer->autoReset = autoReset; 27 timer->waitTime = waitTime; 28 timer->targetTime = systick_get_ticks() + waitTime; 29 timer->hasElapsed = false; 30 } 31 32 // Reset timer counter to zero 33 void stimer_reload(Stimer_t *timer) { 34 if (!timer->hasElapsed) timer->targetTime = systick_get_ticks() + timer->waitTime; 35 } 36 37 // Returns true of timer has elapsed 38 bool stimer_ping(Stimer_t *timer) { 39 if (timer->hasElapsed) return false; 40 uint32_t now = systick_get_ticks(); 41 bool hasElapsed = now >= timer->targetTime; 42 if (hasElapsed) { 43 if (timer->autoReset) { 44 uint32_t drift = now - timer->targetTime; 45 timer->targetTime = (now + timer->waitTime) - drift; 46 } else { 47 timer->hasElapsed = true; 48 } 49 } 50 return hasElapsed; 51 } 52 53 // Resets software timers counter 54 void stimer_reset(Stimer_t *timer) { 55 stimer_start(timer, timer->waitTime, timer->autoReset); 56 } 57 58 // Blocking delay 59 void stimer_delay(uint32_t delay) { 60 Stimer_t timer; 61 stimer_start(&timer, delay, false); 62 while(!stimer_ping(&timer)); 63 }