Delay1.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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
  60. #define DLY_LOOP_CONST (8500000)
  61. #define DLY_LOOP_CONST1 (8500)
  62. void Dly1us ( unsigned int DelayVal )
  63. {
  64. while ( DelayVal-- )
  65. {
  66. for ( unsigned int i = SystemClockFreq / DLY_LOOP_CONST; i; --i );
  67. }
  68. }
  69. void Dly1ms ( unsigned int DelayVal )
  70. {
  71. while ( DelayVal-- )
  72. {
  73. for ( unsigned int i = SystemClockFreq / DLY_LOOP_CONST1; i; --i );
  74. }
  75. }