SysTick.c 6.0 KB

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