eventUnit.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #include "eventUnit.h"
  2. #include "stm32f10x.h"
  3. eventParams_ts eventParams[16];
  4. uint16_t timerEventMask;
  5. bool eventDriverSta;
  6. /**
  7. * 调用周期:1ms
  8. */
  9. void eventDriver(void)
  10. {
  11. int i;
  12. for ( i = 0; i < 16; i++)
  13. {
  14. if (eventParams[i].countSet)
  15. {
  16. if (++ eventParams[i].count >= eventParams[i].countSet)
  17. {
  18. eventParams[i].count = 0;
  19. if (eventParams[i].reload == false)
  20. {
  21. eventParams[i].countSet = 0;
  22. }
  23. timerEventMask |= (1 << i);
  24. }
  25. }
  26. }
  27. }
  28. /**
  29. * 设置超时事件
  30. * @mask:事件标志
  31. * @reload:=false,表示只执行一次
  32. =true,表示周期性执行,周期为:timeOut_ms
  33. @timeOut_ms:超时时间,或周期时间
  34. 备注:
  35. 1、执行前需先关闭中断,防止eventDriver()在定时器中断中执行冲撞
  36. **/
  37. void setEvent(uint16_t mask, bool reload, uint32_t timeOut_ms)
  38. {
  39. __set_PRIMASK(1);
  40. eventParams[mask].countSet = timeOut_ms;
  41. eventParams[mask].count = 0;
  42. eventParams[mask].reload = reload;
  43. if (timeOut_ms == 0)
  44. {
  45. timerEventMask |= (1 << mask);
  46. }
  47. __set_PRIMASK(0);//开总中断
  48. }
  49. /**
  50. * 触发单次事件
  51. * @mask:事件标志
  52. 备注:
  53. 1、立即执行该事件
  54. 2、执行前需先关闭中断,防止eventDriver()在定时器中断中执行冲撞
  55. */
  56. void event_post(uint16_t mask)
  57. {
  58. __set_PRIMASK(1);
  59. eventParams[mask].countSet = 0;
  60. eventParams[mask].count = 0;
  61. eventParams[mask].reload = false;
  62. timerEventMask |= (1 << mask);
  63. __set_PRIMASK(0);//开总中断
  64. }
  65. /**
  66. * 清除事件
  67. * @mask:事件标志
  68. 备注:
  69. 1、执行前需先关闭中断,防止eventDriver()在定时器中断中执行冲撞
  70. */
  71. void event_clear(uint16_t mask)
  72. {
  73. __set_PRIMASK(1);
  74. eventParams[mask].countSet = 0;
  75. eventParams[mask].count = 0;
  76. eventParams[mask].reload = false;
  77. __set_PRIMASK(0);//开总中断
  78. }
  79. /**
  80. * 事件等待
  81. 备注:
  82. 1、该函数需要放在主循环中执行,获取需要响应的事件标志位,
  83. 传给getEvent(...)的event
  84. 2、执行前需先关闭中断,防止eventDriver()在定时器中断中执行冲撞
  85. */
  86. uint16_t event_pend(void)
  87. {
  88. uint16_t ret = 0;
  89. __set_PRIMASK(1);
  90. ret = timerEventMask;
  91. timerEventMask = 0;
  92. __set_PRIMASK(0);//开总中断
  93. return ret;
  94. }
  95. /**
  96. * 判断事件是否触发
  97. * @event:所有事件标志位缓存,由函数event_pend()产生
  98. * @mask:需要判断的事件标志
  99. */
  100. uint16_t getEvent(uint16_t event, uint16_t mask)
  101. {
  102. return event & (1 << mask);
  103. }