delay.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #include "delay.h"
  2. static u8 fac_us=0;//us延时倍乘数
  3. static u16 fac_ms=0;//ms延时倍乘数
  4. void Delay_Init(void)
  5. {
  6. //SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//bit2清空,选择外部时钟 HCLK/8
  7. //SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
  8. fac_us=(SystemCoreClock/1000000); //1us需计算的脉冲个数,其中(SystemFrequency/1000000)代表1US的脉冲个数,8是需要8分频
  9. fac_ms=(u16)fac_us*1000; //1ms需计算的脉冲个数
  10. if(fac_us==0)fac_us=1;
  11. }
  12. static void Delay_1Ms(void)
  13. {
  14. u32 temp;
  15. SysTick->LOAD=(u32)fac_ms;//时间加载(SysTick->LOAD为24bit)
  16. SysTick->VAL =0x00; //清空计数器
  17. SysTick->CTRL=0x01 ; //开始倒数
  18. do
  19. {
  20. temp=SysTick->CTRL;
  21. }
  22. while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
  23. SysTick->CTRL=0x00; //关闭计数器
  24. SysTick->VAL =0X00; //清空计数器
  25. }
  26. static void Delay_1Us(void)
  27. {
  28. u32 temp;
  29. SysTick->LOAD=fac_us; //时间加载
  30. SysTick->VAL=0x00; //清空计数器
  31. SysTick->CTRL=0x01 ; //开始倒数
  32. do
  33. {
  34. temp=SysTick->CTRL;
  35. }
  36. while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
  37. SysTick->CTRL=0x00; //关闭计数器
  38. SysTick->VAL =0X00; //清空计数器
  39. }
  40. /***********************************************
  41. *
  42. ***********************************************/
  43. void DelayTick(int tick)
  44. {
  45. unsigned long ctrl;
  46. int i;
  47. ctrl=SysTick->CTRL;
  48. for(i=0;i<tick;i++){
  49. while(1){
  50. if(ctrl!=SysTick->CTRL){
  51. ctrl=SysTick->CTRL;
  52. break;
  53. }
  54. }
  55. }
  56. }
  57. void Delay_Ms(u32 ms)
  58. {
  59. u32 i = 0;
  60. for(i = 0; i < ms; i++)
  61. {
  62. Delay_1Ms();
  63. }
  64. }
  65. void Delay_Us(u32 us)
  66. {
  67. u32 i = 0;
  68. for(i = 0; i < us; i++)
  69. {
  70. Delay_1Us();
  71. }
  72. }