?? timer.c
字號:
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;
#ifdef TMR_INTR_FNCT_EN
TmrIntFnct[tmrid] = intfnct;
#endif
OS_EXIT_CRITICAL();
}
}
#endif
#ifdef TMR_CALL_FNCT_EN
#ifdef TMR_INTR_FNCT_EN
/*立即調用計時器中斷內函數*/
void TMR_CallIntFnct(TMR_ID tmrid)
{
if(tmrid < MAX_TMR)
{
ReloadTmr(tmrid);
TmrIntFnct[tmrid]();
}
}
#endif
/*立即調用計時器中斷外函數*/
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();
#ifdef TMR_INTR_FNCT_EN
TmrIntFnct[tmrid] = intfnct;
#endif
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] = NULL;
#ifdef TMR_INTR_FNCT_EN
TmrIntFnct[tmrid] = NULL;
#endif
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])
{
#ifdef TMR_INTR_FNCT_EN
if(TmrIntFnct[tmrid]) //需要在中斷內調用函數
TmrIntFnct[tmrid]();
#endif
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 + -