drv_systick.c 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #include "drv_systick.h"
  2. #include "misc.h"
  3. #include <stdint.h>
  4. static u8 fac_us = 0; // us延时倍乘数
  5. static u16 fac_ms = 0; // ms延时倍乘数
  6. volatile uint32_t systick_ms = 0;
  7. // 初始化延迟函数
  8. // 当使用ucos的时候,此函数会初始化ucos的时钟节拍
  9. // SYSTICK的时钟固定为HCLK时钟的1/8
  10. // SYSCLK:系统时钟
  11. void drv_systick_init()
  12. {
  13. SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
  14. if (SysTick_Config(SystemCoreClock / 1000))
  15. {
  16. while (1)
  17. {
  18. }
  19. }
  20. NVIC_SetPriority(SysTick_IRQn, 0x00);
  21. }
  22. // 延时nus
  23. // nus为要延时的us数.
  24. void drv_delay_us(uint32_t nus)
  25. {
  26. uint32_t temp;
  27. SysTick->LOAD = nus * fac_us; // 时间加载
  28. SysTick->VAL = 0x00; // 清空计数器
  29. SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; // 开始倒数
  30. do
  31. {
  32. temp = SysTick->CTRL;
  33. } while (temp & 0x01 && !(temp & (1 << 16))); // 等待时间到达
  34. SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; // 关闭计数器
  35. SysTick->VAL = 0X00; // 清空计数器
  36. }
  37. // 延时nms
  38. // 注意nms的范围
  39. // SysTick->LOAD为24位寄存器,所以,最大延时为:
  40. // nms<=0xffffff*8*1000/SYSCLK
  41. // SYSCLK单位为Hz,nms单位为ms
  42. // 对72M条件下,nms<=1864
  43. void drv_delay_ms(u16 nms)
  44. {
  45. uint32_t temp;
  46. SysTick->LOAD = (uint32_t)nms * fac_ms; // 时间加载(SysTick->LOAD为24bit)
  47. SysTick->VAL = 0x00; // 清空计数器
  48. SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; // 开始倒数
  49. do
  50. {
  51. temp = SysTick->CTRL;
  52. } while (temp & 0x01 && !(temp & (1 << 16))); // 等待时间到达
  53. SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; // 关闭计数器
  54. SysTick->VAL = 0X00; // 清空计数器
  55. }
  56. uint32_t get_systick_ms(void)
  57. {
  58. uint32_t tick, tick_ms;
  59. __disable_irq();
  60. tick = (SYSTICK_EXT_CLOCK_1MS_CNT - SysTick->VAL);
  61. tick_ms = tick / (SYSTICK_EXT_CLOCK_1MS_CNT);
  62. tick_ms = tick_ms + systick_ms;
  63. __enable_irq();
  64. return tick_ms;
  65. }