stm32f4-uart-bootloader

Simple UART bootloader for STM32F4 MCU's
git clone git://git.mdnr.space/stm32f4-uart-bootloader
Log | Files | Refs | Submodules | README | LICENSE

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 }