timer.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include "timer.h"
  2. #include "stdint.h"
  3. #include "string.h"
  4. #define HAL_TIMER_NUM 32
  5. typedef struct
  6. {
  7. HAL_TimerCB_fp s_sTimerCallback;
  8. uint8_t position;
  9. int timerReload;
  10. int tick;
  11. } HAL_TIMER_CALLBACK;
  12. static HAL_TIMER_CALLBACK Timer_Callback[HAL_TIMER_NUM];
  13. void timer_tick_check(void)
  14. {
  15. int i;
  16. for (i = 0; i < HAL_TIMER_NUM; i++)
  17. {
  18. if (Timer_Callback[i].s_sTimerCallback != NULL)
  19. {
  20. if (++Timer_Callback[i].tick >= Timer_Callback[i].timerReload)
  21. {
  22. Timer_Callback[i].tick = 0;
  23. Timer_Callback[i].s_sTimerCallback();
  24. }
  25. }
  26. }
  27. }
  28. uint8_t timer_register(HAL_TimerCB_fp callback, int timerReload)
  29. {
  30. uint8_t handle = 0;
  31. int i;
  32. for (i = 0; i < HAL_TIMER_NUM; i++)
  33. {
  34. if (Timer_Callback[i].s_sTimerCallback == callback)
  35. {
  36. Timer_Callback[i].timerReload = timerReload;
  37. Timer_Callback[i].tick = 0;
  38. handle = i;
  39. return handle;
  40. }
  41. }
  42. for (i = 0; i < HAL_TIMER_NUM; i++)
  43. {
  44. if (Timer_Callback[i].s_sTimerCallback == NULL)
  45. {
  46. Timer_Callback[i].s_sTimerCallback = callback;
  47. Timer_Callback[i].position = i;
  48. Timer_Callback[i].timerReload = timerReload;
  49. Timer_Callback[i].tick = 0;
  50. handle = i;
  51. break;
  52. }
  53. }
  54. return handle;
  55. }
  56. int timer_unregister(uint8_t *handle)
  57. {
  58. uint8_t timer_index = *handle;
  59. if (handle == NULL)
  60. {
  61. return -1;
  62. }
  63. if (timer_index > HAL_TIMER_NUM)
  64. {
  65. return -2;
  66. }
  67. if (0xff != timer_index)
  68. {
  69. Timer_Callback[timer_index].s_sTimerCallback = NULL;
  70. Timer_Callback[timer_index].timerReload = 0;
  71. Timer_Callback[timer_index].tick = 0;
  72. *handle = 0xff;
  73. }
  74. return 0;
  75. }