delay.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #include "delay.h"
  2. #define TIMER 1
  3. #if TIMER
  4. #include "timer.h"
  5. void delay_ms(uint32_t nms)
  6. {
  7. uint32_t start_time = TIM7->CNT; // 获取当前定时器计数值
  8. while ((TIM7->CNT - start_time) < nms); // 等待经过指定的延时时间
  9. }
  10. #else
  11. static u8 fac_us=0; //us延时倍乘数
  12. static u16 fac_ms=0; //ms延时倍乘数
  13. //初始化延迟函数
  14. //SYSTICK的时钟固定为HCLK时钟的1/8
  15. //SYSCLK:系统时钟
  16. void delay_init()
  17. {
  18. SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟 HCLK/8
  19. fac_us=SystemCoreClock/8000000; //为系统时钟的1/8
  20. fac_ms=(u16)fac_us*1000; //每个ms需要的systick时钟数
  21. }
  22. //延时nus
  23. //nus为要延时的us数.
  24. void delay_us(u32 nus)
  25. {
  26. u32 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 delay_ms(uint32_t nms)
  44. {
  45. u32 temp;
  46. SysTick->LOAD=(u32)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. #endif