delay.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include "bsp/bsp.h"
  2. #include "bsp/delay.h"
  3. #include "os/os_types.h"
  4. void task_ticks_enable(void)
  5. {
  6. CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
  7. DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
  8. }
  9. uint32_t task_ticks_abs(void)
  10. {
  11. return DWT->CYCCNT;
  12. }
  13. uint32_t task_ticks_rel(uint32_t start)
  14. {
  15. uint32_t ticks = DWT->CYCCNT;
  16. if (ticks >= start) {
  17. return ticks - start;
  18. }
  19. return 0xFFFFFFFF - start + ticks + 1;
  20. }
  21. void task_ticks_delay(uint32_t ticks)
  22. {
  23. uint32_t start;
  24. start = task_ticks_abs();
  25. while (task_ticks_rel(start) < ticks);
  26. }
  27. void task_udelay(uint32_t delay)
  28. {
  29. task_ticks_delay(delay * (SystemCoreClock / 1000000));
  30. }
  31. uint32_t task_get_usecond(void) {
  32. return task_ticks_abs() / (SYSTEM_CLOCK / 1000000);
  33. }
  34. uint32_t task_get_delta_us(uint32_t us) {
  35. u32 count = us * (SYSTEM_CLOCK / 1000000);
  36. return task_delta_ticks(count) / (SYSTEM_CLOCK / 1000000);
  37. }
  38. uint32_t task_delta_ticks(u32 count) {
  39. u32 now = task_ticks_abs();
  40. u32 delta = now - count;
  41. if (now < count) { //wrap
  42. delta = 0xFFFFFFFF - count + now + 1;
  43. }
  44. return (delta);
  45. }
  46. void delay_us(uint16_t cnt)
  47. {
  48. task_udelay(cnt);
  49. }
  50. /*!
  51. \brief delay a time in milliseconds
  52. \param[in] count: count in milliseconds
  53. \param[out] none
  54. \retval none
  55. */
  56. void delay_ms(uint32_t count)
  57. {
  58. task_udelay(1000 * count);
  59. }