cpu.c 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #include "os/os_type.h"
  2. #include "bsp/bsp.h"
  3. void cpu_counts_enable(void)
  4. {
  5. CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
  6. DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
  7. }
  8. u32 cpu_counts_abs(void)
  9. {
  10. return DWT->CYCCNT;
  11. }
  12. static __inline__ u32 cpu_counts_rel(u32 start)
  13. {
  14. u32 ticks = DWT->CYCCNT;
  15. if (ticks >= start) {
  16. return ticks - start;
  17. }
  18. return 0xFFFFFFFF - start + ticks + 1;
  19. }
  20. static void cpu_counts_delay(u32 ticks)
  21. {
  22. volatile u32 start = cpu_counts_abs();
  23. while (cpu_counts_rel(start) < ticks);
  24. }
  25. void cpu_udelay(u32 delay)
  26. {
  27. cpu_counts_delay(delay * (SystemCoreClock / 1000000));
  28. }
  29. float cpu_count_times(u32 prev) {
  30. u32 delta = cpu_counts_rel(prev);
  31. return (float)delta / (float)SystemCoreClock;
  32. }
  33. float cpu_times_bew_counts(u32 now, u32 prev) {
  34. u32 delta = now - prev;
  35. if (now < prev) {
  36. delta = 0xFFFFFFFF - prev + now + 1;
  37. }
  38. return (float)delta / (float)SystemCoreClock;
  39. }
  40. u32 cpu_count_delta_us(u32 count) {
  41. u32 cpu_c = cpu_counts_rel(count);
  42. float us = (float)cpu_c/120;
  43. return (u32)us;
  44. }