123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- #include "eventUnit.h"
- #include "stm32f10x.h"
- eventParams_ts eventParams[16];
- uint16_t timerEventMask;
- bool eventDriverSta;
- /**
- * 调用周期:1ms
- */
- void eventDriver(void)
- {
- int i;
-
- for ( i = 0; i < 16; i++)
- {
- if (eventParams[i].countSet)
- {
- if (++ eventParams[i].count >= eventParams[i].countSet)
- {
- eventParams[i].count = 0;
- if (eventParams[i].reload == false)
- {
- eventParams[i].countSet = 0;
- }
- timerEventMask |= (1 << i);
- }
- }
- }
- }
- /**
- * 设置超时事件
- * @mask:事件标志
- * @reload:=false,表示只执行一次
- =true,表示周期性执行,周期为:timeOut_ms
- @timeOut_ms:超时时间,或周期时间
- 备注:
- 1、执行前需先关闭中断,防止eventDriver()在定时器中断中执行冲撞
- **/
- void setEvent(uint16_t mask, bool reload, uint32_t timeOut_ms)
- {
- __set_PRIMASK(1);
-
- eventParams[mask].countSet = timeOut_ms;
- eventParams[mask].count = 0;
- eventParams[mask].reload = reload;
- if (timeOut_ms == 0)
- {
- timerEventMask |= (1 << mask);
- }
- __set_PRIMASK(0);//开总中断
- }
- /**
- * 触发单次事件
- * @mask:事件标志
- 备注:
- 1、立即执行该事件
- 2、执行前需先关闭中断,防止eventDriver()在定时器中断中执行冲撞
- */
- void event_post(uint16_t mask)
- {
- __set_PRIMASK(1);
- eventParams[mask].countSet = 0;
- eventParams[mask].count = 0;
- eventParams[mask].reload = false;
- timerEventMask |= (1 << mask);
- __set_PRIMASK(0);//开总中断
- }
- /**
- * 清除事件
- * @mask:事件标志
- 备注:
- 1、执行前需先关闭中断,防止eventDriver()在定时器中断中执行冲撞
- */
- void event_clear(uint16_t mask)
- {
- __set_PRIMASK(1);
- eventParams[mask].countSet = 0;
- eventParams[mask].count = 0;
- eventParams[mask].reload = false;
- __set_PRIMASK(0);//开总中断
- }
- /**
- * 事件等待
- 备注:
- 1、该函数需要放在主循环中执行,获取需要响应的事件标志位,
- 传给getEvent(...)的event
- 2、执行前需先关闭中断,防止eventDriver()在定时器中断中执行冲撞
- */
- uint16_t event_pend(void)
- {
- uint16_t ret = 0;
- __set_PRIMASK(1);
- ret = timerEventMask;
- timerEventMask = 0;
- __set_PRIMASK(0);//开总中断
- return ret;
- }
- /**
- * 判断事件是否触发
- * @event:所有事件标志位缓存,由函数event_pend()产生
- * @mask:需要判断的事件标志
- */
- uint16_t getEvent(uint16_t event, uint16_t mask)
- {
- return event & (1 << mask);
- }
|