delay.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include "delay.h"
  2. static u8 fac_us=0; //us延时倍乘数
  3. static u16 fac_ms=0; //ms延时倍乘数,在ucos下,代表每个节拍的ms
  4. //初始化延迟函数
  5. //SYSTICK的时钟固定为HCLK时钟的1/8
  6. //SYSCLK:系统时钟
  7. void delay_init()
  8. {
  9. SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟 HCLK/8
  10. fac_us=SystemCoreClock/8000000; //为系统时钟的1/8
  11. fac_ms=(u16)fac_us*1000; //非OS下,代表每个ms需要的systick时钟数
  12. }
  13. //延时nus
  14. //nus为要延时的us数.
  15. void delay_us(u32 nus)
  16. {
  17. u32 temp;
  18. SysTick->LOAD=nus*fac_us; //时间加载
  19. SysTick->VAL=0x00; //清空计数器
  20. SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
  21. do
  22. {
  23. temp=SysTick->CTRL;
  24. }while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
  25. SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
  26. SysTick->VAL =0X00; //清空计数器
  27. }
  28. //延时nms
  29. //注意nms的范围
  30. //SysTick->LOAD为24位寄存器,所以,最大延时为:
  31. //nms<=0xffffff*8*1000/SYSCLK
  32. //SYSCLK单位为Hz,nms单位为ms
  33. //对72M条件下,nms<=1864
  34. void delay_ms(u16 nms)
  35. {
  36. u32 temp;
  37. SysTick->LOAD=(u32)nms*fac_ms; //时间加载(SysTick->LOAD为24bit)
  38. SysTick->VAL =0x00; //清空计数器
  39. SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
  40. do
  41. {
  42. temp=SysTick->CTRL;
  43. }while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
  44. SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
  45. SysTick->VAL =0X00; //清空计数器
  46. }