⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer.c

📁 430单片机原代码 430单片机原代码 430单片机原代码
💻 C
📖 第 1 页 / 共 2 页
字号:
                inittemp = (INT32U)((FP64)tmrinit/TMR_TICK_LENGTH+0.5)-1;
                break;
        }
        //OS_ENTER_CRITICAL();
#ifdef  TMR_LARG_RANG            
        TmrInit[tmrid] = inittemp;
#else
        TmrInit[tmrid] = (INT16U)inittemp;
#endif
        TmrCtr[tmrid] = TmrInit[tmrid];
        //OS_EXIT_CRITICAL();
    }
}

/**********************************************************************
 *                          修改一个计时器                            *
 *                                                                    *
 * 功能描述   :    这个函数修改计时器的各项参数,但是无法修改触发标志 *
 *                 的地址。                                           *
 *                                                                    *
 * 输入参数   : tmrid     计时器id                                    *
 *              tmrinit   计时器计时长度                              *
 *              tmrunit   计时器计时长度单位,微秒:UNIT_US           *
 *                                            毫秒:UNIT_MS           *
 *                                            秒  :UNIT_S            *
 *              tmrmod    计时器工作模式                              *
 *              intfnct   指向中断内调用函数的指针                    *
 *              fnct      指向中断外调用函数的指针                    *
 * 返回参数   : 无                                                    *
 * 文件名称   : TIMER.C                                               *
 * 作者       : Liy-tj                                                *
 **********************************************************************/
#ifdef TMR_SET_EN
    #ifdef TMR_LARG_RANG
void TMR_Set( TMR_ID tmrid, INT32U tmrinit, INT8U tmrunit, INT8U tmrmod,
             void ( *intfnct)(void), void ( *fnct)(void) )
    #else
void TMR_Set( TMR_ID tmrid, INT16U tmrinit, INT8U tmrunit, INT8U tmrmod,
             void ( *intfnct)(void), void ( *fnct)(void) )
    #endif
{
    if(tmrid < MAX_TMR)
    {
        //OS_ENTER_CRITICAL();
        TmrSta[tmrid] &= 0xC9;
        TmrSta[tmrid] |= tmrmod;
        TMR_SetLen(tmrid, tmrinit, tmrunit);
        TmrFnct[tmrid] = fnct;
        TmrIntFnct[tmrid] = intfnct;
        //OS_EXIT_CRITICAL();
    }
}
#endif

#ifdef TMR_CALL_FNCT_EN
/*立即调用计时器中断内函数*/
void TMR_CallIntFnct(TMR_ID tmrid)
{
    if(tmrid < MAX_TMR)
    {
        ReloadTmr(tmrid);
        TmrIntFnct[tmrid]();
    }
}

/*立即调用计时器中断外函数*/
void TMR_CallFnct(TMR_ID tmrid)
{
    if(tmrid < MAX_TMR)
    {
        ReloadTmr(tmrid);
        TmrFnct[tmrid]();
    }
}
#endif

/*设置计时器关联函数*/
#ifdef TMR_SET_FNCT_EN
void TMR_SetFnct(TMR_ID tmrid, void ( *intfnct)(void),
                void ( *fnct)(void))
{
    if(tmrid < MAX_TMR)
    {
        //OS_ENTER_CRITICAL();
        TmrIntFnct[tmrid] = intfnct;
        TmrFnct[tmrid] = fnct;
        //OS_EXIT_CRITICAL();
    }
}
#endif

/*********************************************************************
 *                           长时间延迟函数                          *
 *                                                                   *
 * 功能描述   :    这个函数用于ms至s级的延迟,若使用TMR_LARG_RANG模  *
 *                 式,最长可延时1193小时。                          *
 *                                                                   *
 * 输入参数   : delaylen  延迟时间长度                               *
 *              tmrunit   延时时间单位,微秒:UNIT_US                *
 *                                      毫秒:UNIT_MS                *
 *                                      秒  :UNIT_S                 *
 *              fnct      延时后需调用的函数                         *
 * 返回参数   : 无                                                   *
 * 文件名称   : TIMER.C                                              *
 * 作者       : Liy-tj                                               *
 *********************************************************************/
#ifdef  TMR_DELAY_EN
    #ifdef  TMR_LARG_RANG
void TMR_LongDelay(INT32U delaylen, INT8U tmrunit, void( *fnct)(void))
    #else
void TMR_LongDelay(INT16U delaylen, INT8U tmrunit, void( *fnct)(void))
    #endif
{
    TMR_ID  tmrid;
    //创建长延时计时器    
    tmrid = TMR_Create(delaylen, tmrunit, TMR_MOD_DELAY, NULL, fnct);
    if(tmrid < MAX_TMR)
    {
        TMR_Start(tmrid);
    }
}
#endif

/*********************************************************************
 *                           获取计数值函数                          *
 *                                                                   *
 * 功能描述   :    这个函数返回制定计时器的当前计数值。              *
 *                                                                   *
 * 输入参数   : tmrid     计时器id                                   *
 * 返回参数   : tmrctr    计时器计数值                               *
 * 文件名称   : TIMER.C                                              *
 * 作者       : Liy-tj                                               *
 *********************************************************************/
#ifdef TMR_LARG_RANG
INT32U TMR_GetCtr( TMR_ID tmrid )
#else
INT16U TMR_GetCtr( TMR_ID tmrid )
#endif
{
    if(tmrid < MAX_TMR)
    {
      #ifdef TMR_LARG_RANG
        return (INT32U)((INT32U)TmrInit[tmrid]-TmrCtr[tmrid]);
      #else
        return (TmrInit[tmrid]-TmrCtr[tmrid]);
      #endif
    }
    else
    {
        return (0);
    }
}

/*********************************************************************
 *                     获取计时器运行状态函数                        *
 *                                                                   *
 * 功能描述   :    这个函数返回指定计时器的运行状态。                *
 *                                                                   *
 * 输入参数   : tmrid     计时器id                                   *
 * 返回参数   : sta       计时器运行状态,0:停止,1:运行             *
 * 文件名称   : TIMER.C                                              *
 * 作者       : Liy-tj                                               *
 *********************************************************************/
INT8U  TMR_GetSta(TMR_ID tmrid)
{
    if(tmrid < MAX_TMR)
    {
        return((TmrSta[tmrid]&TMR_RUN)==TMR_RUN);
    }
    return(0);
}

/*********************************************************************
 *                          删除一个计时器                           *
 *                                                                   *
 * 功能描述   :    这个函数从工作计时器数组中删除一个计时器。        *
 *                                                                   *
 * 输入参数   : ptmrid     指向要删除的计时器id的指针                *
 * 返回参数   : 无                                                   *
 * 文件名称   : TIMER.C                                              *
 * 作者       : Liy-tj                                               *
 *********************************************************************/
#ifdef TMR_DELET_EN
void TMR_Delete(TMR_ID *ptmrid)
{
    TMR_ID  tmrid ;
    
    if(ptmrid)
    {
        tmrid = *ptmrid;
        if(tmrid < MAX_TMR)
        {
            //OS_ENTER_CRITICAL();
            TmrSta[tmrid]  = 0x00;
            TmrFnct[tmrid] =0;// NULL;
            TmrIntFnct[tmrid] = 0;//;NULL;
           // OS_EXIT_CRITICAL();
        }
        *ptmrid = MAX_TMR;
    }
}
#endif

/*********************************************************************
 *                          计时器递减任务                           *
 *                                                                   *
 * 功能描述   :    这个函数将遍历整个计时器数组。将其中的计数值减1, *
 *                 直到计数值到零时重置计数值,这时若指向中断内运行  *
 *                 函数指针非空,则直接调用函数;若指向中断外运行函  *
 *                 数指针非空,将触发标志置1。该函数在每个时钟节拍的 *
 *                 中断服务函数里调用一次。                          *
 *                                                                   *
 * 输入参数   : 无                                                   *
 * 返回参数   : 无                                                   *
 * 文件名称   : TIMER.C                                              *
 * 作者       : Liy-tj                                               *
 *********************************************************************/
void TMR_IntTask(void)
{
    TMR_ID  tmrid = 0;

    for(tmrid=0; tmrid<MAX_TMR; tmrid++)       //遍历整个计时器数组
    {
        if(TMR_RUN == (TmrSta[tmrid]&TMR_RUN)) //计时器是否存在,并且运行
        {
            if(0 == TmrCtr[tmrid])
            {
                if(TmrIntFnct[tmrid])      //需要在中断内调用函数
                    TmrIntFnct[tmrid]();
                if(TmrFnct[tmrid])         //需要在中断外调用函数
                    TmrSta[tmrid] |= TMR_FLG_UP; //触发标志置位
                switch(TmrSta[tmrid] & TMR_MOD)
                {
                    case TMR_MOD_CONT:
                        TmrCtr[tmrid] = TmrInit[tmrid];
                    break;
#ifdef TMR_DELAY_EN
                    case TMR_MOD_DELAY:
                        TmrSta[tmrid] &= TMR_FREE;  //此处无break;
#endif
                    case TMR_MOD_ONCE:
                        TmrSta[tmrid] &= TMR_STOP;
                        TmrCtr[tmrid] = TmrInit[tmrid];
                    break;
                    default :
                    break;
                }//end of switch
            }// end of if(0 == TmrCtr[tmrid])
            else
            {
                TmrCtr[tmrid]--;
            }// end of if(0 == TmrCtr[tmrid]) else
        }// end of if(TMR_RUN==(TmrSta[tmrid] & TMR_RUN))
    }// end of for(tmrid=0; tmrid<MAX_TMR; tmrid++)
}

/*********************************************************************
 *                         计时器触发任务                            *
 *                                                                   *
 * 功能描述   :    这个函数将遍历整个计时器数组,若某个计时器的触发  *
 *                 标志为1,则调用该计时器指向的中断外运行函数(指针 *
 *                 非空),同时将触发表志复位。                      *
 *                 该函数在中断外的监控循环中调用。                  *
 *                                                                   *
 * 输入参数   : 无                                                   *
 * 返回参数   : 无                                                   *
 * 文件名称   : TIMER.C                                              *
 * 作者       : Liy-tj                                               *
 *********************************************************************/
void TMR_Task(void)
{
    TMR_ID  tmrid;
    
    for(tmrid=0; tmrid<MAX_TMR; tmrid++)       //遍历整个计时器链表
    {
        //OS_ENTER_CRITICAL();
        if(TmrSta[tmrid]&TMR_FLG_UP)
        {
            if(TmrFnct[tmrid])
            {
                //OS_EXIT_CRITICAL();
                TmrFnct[tmrid]();
            }
            else
            {
               // OS_EXIT_CRITICAL();
            }
            TmrSta[tmrid] &= TMR_FLG_DOWN; 
        }
        else
        {
           // OS_EXIT_CRITICAL();
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -