XZHDJH

转自: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;
                }
        }
}//更新定时器状态,在中断中调用。

 

分类:

技术点:

相关文章:

  • 2022-12-23
  • 2021-12-03
  • 2021-12-22
  • 2021-11-21
  • 2021-04-27
  • 2022-02-07
猜你喜欢
  • 2021-11-23
  • 2021-11-17
  • 2021-08-10
  • 2021-07-26
  • 2021-04-04
相关资源
相似解决方案