转自:https://www.amobbs.com/thread-5736304-1-1.html
typedef enum tmrMode { MODE_ONE_SHOT = 0, //单次模式 MODE_PERIODIC, //周期模式 } tmrMode;//定时器模式 typedef enum tmrState { SOFT_TIMER_STOPPED = 0, //停止 SOFT_TIMER_RUNNING, //运行 SOFT_TIMER_TIMEOUT, //超时 SOFT_TIMER_WAITING //等待 } tmrState;//定时器状态。可通过函数获取这个状态。 typedef struct softTimer { unsigned char state; //状态 unsigned char mode; //模式 unsigned int period; //定时周期 unsigned int count; //定时计数用 pFun callback; //定时器回调函数 } softTimer;//定时器结构体。存储定时器任务内容及其他参数。 主要函数: void softTimer_Creat(unsigned char id, tmrMode mode, unsigned int interval, pFun cb) { softTimerList[id].mode = mode; softTimerList[id].period = interval; softTimerList[id].count = 0; softTimerList[id].callback = cb; softTimerList[id].state = SOFT_TIMER_STOPPED; } 创建定时器,后面的变量分别是定时器编号、定时器模式(单次或循环)、定时器触发时间、定时器事件(一个指针,指向函数) void softTimer_Start(unsigned int id) { softTimerList[id].state = SOFT_TIMER_RUNNING; } //开启定时器 void softTimer_Stop(unsigned int id) { softTimerList[id].state = SOFT_TIMER_STOPPED; } //停止定时器 void softTimer_Clr(unsigned int id) { if (softTimerList[id].mode == MODE_ONE_SHOT) { softTimerList[id].state = SOFT_TIMER_STOPPED; } else { softTimerList[id].state = SOFT_TIMER_RUNNING; } } //清除定时器。如果定时器是单次触发模式,则定时器关闭;如果是循环模式,则重新开始计时。 unsigned char softTimer_GetState(unsigned int id) { return softTimerList[id].state; } //获取定时器状态。 void softTimer_Update(void) //更新定时器状态,在硬件定时器中1ms调用一次 { unsigned char id; for (id = 0; id <= SOFT_TIMER_MAX; id++) { switch (softTimerList[id].state) { case SOFT_TIMER_STOPPED: break; case SOFT_TIMER_RUNNING: if (softTimerList[id].count < softTimerList[id].period) { softTimerList[id].count++; } else { softTimerList[id].count = 0; softTimerList[id].state = SOFT_TIMER_TIMEOUT; softTimerList[id].callback(); } break; case SOFT_TIMER_TIMEOUT: if (softTimerList[id].mode == MODE_ONE_SHOT) { softTimerList[id].state = SOFT_TIMER_STOPPED; } else { softTimerList[id].count++; softTimerList[id].state = SOFT_TIMER_RUNNING; } break; default: //state error break; } } }//更新定时器状态,在中断中调用。