timer.c 996 B

123456789101112131415161718192021222324252627282930313233
  1. #include "ch.h"
  2. #include "timer.h"
  3. static systime_t last_systime = 0;
  4. static systime_t overflow = 0;
  5. static uint32_t current_time_ms = 0;
  6. void timer_init(void) { timer_clear(); }
  7. void timer_clear(void) {
  8. last_systime = chVTGetSystemTime();
  9. overflow = 0;
  10. current_time_ms = 0;
  11. }
  12. uint16_t timer_read(void) { return (uint16_t)timer_read32(); }
  13. uint32_t timer_read32(void) {
  14. // Note: We assume that the timer update is called at least once betweeen every wrap around of the system time
  15. systime_t current_systime = chVTGetSystemTime();
  16. systime_t elapsed = current_systime - last_systime + overflow;
  17. uint32_t elapsed_ms = ST2MS(elapsed);
  18. current_time_ms += elapsed_ms;
  19. overflow = elapsed - MS2ST(elapsed_ms);
  20. last_systime = current_systime;
  21. return current_time_ms;
  22. }
  23. uint16_t timer_elapsed(uint16_t last) { return timer_read() - last; }
  24. uint32_t timer_elapsed32(uint32_t last) { return timer_read32() - last; }