#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); }