time.cpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #include "all-headers.h"
  2. static volatile uint32_t gUptime;
  3. static void startSystick (BOOT_MODE) {
  4. SYST_RVR = CPU_MHZ * 1000 - 1 ; // Underflow every ms
  5. SYST_CVR = 0 ;
  6. SYST_CSR = SYST_CSR_CLKSOURCE | SYST_CSR_ENABLE ;
  7. }
  8. MACRO_BOOT_ROUTINE (startSystick);
  9. static void activateSystickInterrupt (INIT_MODE) {
  10. SYST_CSR |= SYST_CSR_TICKINT;
  11. }
  12. MACRO_INIT_ROUTINE (activateSystickInterrupt);
  13. void busyWaitDuring_initMode (INIT_MODE_ const uint32_t inDelayMS) {
  14. const uint32_t COUNTFLAG_MASK = 1 << 16 ;
  15. for (uint32_t i=0 ; i<inDelayMS ; i++) {
  16. while ((SYST_CSR & COUNTFLAG_MASK) == 0) {} // Busy wait, polling COUNTFLAG
  17. }
  18. }
  19. void busyWaitDuring (USER_MODE_ const uint32_t inDelayMS) {
  20. busyWaitUntil(MODE_ gUptime + inDelayMS);
  21. }
  22. void busyWaitUntil (USER_MODE_ const uint32_t inDeadLineMS) {
  23. while (inDeadLineMS > gUptime) {}
  24. }
  25. void systickInterruptServiceRoutine (SECTION_MODE) {
  26. const uint32_t newUptime = gUptime + 1 ;
  27. gUptime = newUptime ;
  28. // Run every section routines in real.time.interrupt.routine.array
  29. extern void (* __real_time_interrupt_routine_array_start) (SECTION_MODE_ const uint32_t inUptime) ;
  30. extern void (* __real_time_interrupt_routine_array_end) (SECTION_MODE_ const uint32_t inUptime) ;
  31. void (** ptr) (SECTION_MODE_ const uint32_t) = & __real_time_interrupt_routine_array_start ;
  32. while (ptr != & __real_time_interrupt_routine_array_end) {
  33. (* ptr) (MODE_ newUptime) ;
  34. ptr ++ ;
  35. }
  36. }
  37. uint32_t millis(ANY_MODE) {
  38. return gUptime;
  39. }
  40. uint32_t systick(ANY_MODE) {
  41. return SYST_CVR;
  42. }