📄 timer.c
字号:
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 + -