timer.c 943 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  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) {
  7. timer_clear();
  8. }
  9. void timer_clear(void) {
  10. last_systime = chVTGetSystemTime();
  11. overflow = 0;
  12. current_time_ms = 0;
  13. }
  14. uint16_t timer_read(void) {
  15. return (uint16_t)timer_read32();
  16. }
  17. uint32_t timer_read32(void) {
  18. // Note: We assume that the timer update is called at least once betweeen every wrap around of the system time
  19. systime_t current_systime = chVTGetSystemTime();
  20. systime_t elapsed = current_systime - last_systime + overflow;
  21. uint32_t elapsed_ms = ST2MS(elapsed);
  22. current_time_ms += elapsed_ms;
  23. overflow = elapsed - MS2ST(elapsed_ms);
  24. last_systime = current_systime;
  25. return current_time_ms;
  26. }
  27. uint16_t timer_elapsed(uint16_t last) {
  28. return timer_read() - last;
  29. }
  30. uint32_t timer_elapsed32(uint32_t last) {
  31. return timer_read32() - last;
  32. }