Delay.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include <stm32f10x.h>
  2. #include "delay.h"
  3. //使用SysTick的普通计数模式对延迟进行管理
  4. //2010/5/27
  5. #if 0
  6. static u8 fac_us=0;//us延时倍乘数
  7. static u16 fac_ms=0;//ms延时倍乘数
  8. //初始化延迟函数
  9. //SYSTICK的时钟固定为HCLK时钟的1/8
  10. //SYSCLK:系统时钟
  11. void delay_init(u8 SYSCLK)
  12. {
  13. SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟 HCLK/8
  14. fac_us=SYSCLK/8;
  15. fac_ms=(u16)fac_us*1000;
  16. }
  17. //延时nms
  18. //注意nms的范围
  19. //SysTick->LOAD为24位寄存器,所以,最大延时为:
  20. //nms<=0xffffff*8*1000/SYSCLK
  21. //SYSCLK单位为Hz,nms单位为ms
  22. //对72M条件下,nms<=1864
  23. void delay_ms(u16 nms)
  24. {
  25. u32 temp;
  26. SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
  27. SysTick->VAL =0x00; //清空计数器
  28. SysTick->CTRL=0x01 ; //开始倒数
  29. do
  30. {
  31. temp=SysTick->CTRL;
  32. }
  33. while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
  34. SysTick->CTRL=0x00; //关闭计数器
  35. SysTick->VAL =0X00; //清空计数器
  36. }
  37. //延时nus
  38. //nus为要延时的us数.
  39. void delay_us(u32 nus)
  40. {
  41. u32 temp;
  42. SysTick->LOAD=nus*fac_us; //时间加载
  43. SysTick->VAL=0x00; //清空计数器
  44. SysTick->CTRL=0x01 ; //开始倒数
  45. do
  46. {
  47. temp=SysTick->CTRL;
  48. }
  49. while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
  50. SysTick->CTRL=0x00; //关闭计数器
  51. SysTick->VAL =0X00; //清空计数器
  52. }
  53. #if 1
  54. void Delay(vu32 nCount)
  55. {
  56. for(; nCount != 0; nCount--);
  57. }
  58. #endif
  59. #endif