SysTick.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #include "SysTick.h"
  2. #include "gd32e230x_conf.h"
  3. /*********************************************************************************************************
  4. * 宏定义
  5. *********************************************************************************************************/
  6. /*********************************************************************************************************
  7. * 枚举结构体
  8. *********************************************************************************************************/
  9. /*********************************************************************************************************
  10. * 内部变量定义
  11. *********************************************************************************************************/
  12. static __IO unsigned int s_iTimDelayCnt = 0;
  13. /*********************************************************************************************************
  14. * 内部函数声明
  15. *********************************************************************************************************/
  16. static void TimDelayDec(void); //延时计数
  17. /*********************************************************************************************************
  18. * 内部函数实现
  19. *********************************************************************************************************/
  20. /*********************************************************************************************************
  21. * 函数名称:TimDelayDec
  22. * 函数功能:延时计数
  23. * 输入参数:void
  24. * 输出参数:void
  25. * 返 回 值:void
  26. * 创建日期:2021年07月01日
  27. * 注 意:在SysTick中断服务函数SysTick_Handler中调用
  28. *********************************************************************************************************/
  29. static void TimDelayDec(void)
  30. {
  31. if(s_iTimDelayCnt != 0) //延时计数器的数值不为0
  32. {
  33. s_iTimDelayCnt--; //延时计数器的数值减1
  34. }
  35. }
  36. /*********************************************************************************************************
  37. * 函数名称:SysTick_Handler
  38. * 函数功能:SysTick中断服务函数
  39. * 输入参数:void
  40. * 输出参数:void
  41. * 返 回 值:void
  42. * 创建日期:2021年07月01日
  43. * 注 意:
  44. *********************************************************************************************************/
  45. void SysTick_Handler(void)
  46. {
  47. TimDelayDec(); //延时计数函数
  48. }
  49. /*********************************************************************************************************
  50. * API函数实现
  51. *********************************************************************************************************/
  52. /*********************************************************************************************************
  53. * 函数名称:InitSysTick
  54. * 函数功能:初始化SysTick模块
  55. * 输入参数:void
  56. * 输出参数:void
  57. * 返 回 值:void
  58. * 创建日期:2021年07月01日
  59. * 注 意:SystemCoreClock / 1000 1ms中断一次(计数1000次为1s,每计一次位1/1000s=1ms)
  60. * SystemCoreClock / 4000 0.25ms中断一次(计数4000次为1s,每计一次位1/4000s=0.25ms)
  61. * SystemCoreClock / 100000 10us中断一次(计数100000次为1s,每计一次位1/100000s=10us)
  62. * SystemCoreClock / 1000000 1us中断一次(计数1000000次为1s,每计一次位1/1000000s=1us)
  63. *********************************************************************************************************/
  64. void InitSysTick( void )
  65. {
  66. if (SysTick_Config(SystemCoreClock / 1000)) //配置系统滴答定时器1ms中断一次
  67. {
  68. while(1) //错误发生的情况下,进入死循环
  69. {
  70. }
  71. }
  72. }
  73. /*********************************************************************************************************
  74. * 函数名称:DelayNms
  75. * 函数功能:毫秒级延时函数
  76. * 输入参数:nms
  77. * 输出参数:void
  78. * 返 回 值:void
  79. * 创建日期:2021年07月01日
  80. * 注 意:
  81. *********************************************************************************************************/
  82. void DelayNms(__IO unsigned int nms)
  83. {
  84. s_iTimDelayCnt = nms; //将延时计数器s_iTimDelayCnt的数值赋为nms
  85. while(s_iTimDelayCnt != 0) //延时计数器的数值为0时,表示延时了nms,跳出while语句
  86. {
  87. }
  88. }
  89. /*********************************************************************************************************
  90. * 函数名称:DelayNus
  91. * 函数功能:微秒级延时函数
  92. * 输入参数:nus
  93. * 输出参数:void
  94. * 返 回 值:void
  95. * 创建日期:2021年07月01日
  96. * 注 意:经测试,100us和200us基本准确
  97. *********************************************************************************************************/
  98. void DelayNus(__IO unsigned int nus)
  99. {
  100. unsigned int s_iTimCnt = nus; //定义一个变量s_iTimCnt作为延时计数器,赋值为nus
  101. unsigned short i; //定义一个变量作为循环计数器
  102. while(s_iTimCnt != 0) //延时计数器s_iTimCnt的值不为0
  103. {
  104. for(i = 0; i < 3; i++) //空循环,产生延时功能
  105. {
  106. }
  107. s_iTimCnt--; //成功延时1us,变量s_iTimCnt减1
  108. }
  109. }