📄 timeer.c
字号:
#include "timeer.h"
/*
硬定时
*/
int TIMER_Init(int nTimerID,int nDiv0,int nDiv1)//配置预分频比
{
if(nTimerID > 4 || nTimerID <0 || nDiv0 > 255 || nDiv0 < 0 || nDiv1 < 0 || nDiv1 > 3)
{
return -1;
}
if(nTimerID >=0 && nTimerID <= 1)
{
TCFG0 |= nDiv0 <<0;
}
else if(nTimerID >=2 && nTimerID <= 4)
{
TCFG0 |= nDiv0 <<8;
}
TCFG1 |= (nDiv1 << nTimerID*4);
return 1;
}
int TIMER_Create(int nTimerID, int base_time, F_INTERRUPT_ISR ISR) //配置定时器
{
if(nTimerID > 4 || nTimerID <0 || ISR == NULL || base_time <= 0 || base_time > 65535)
{
return -1;
}
if(nTimerID == 0)
{
TCNTB0=base_time;
TCON |= 1<<1;//手动更新
TCON |= 1<<3;//自动加载
TCON &= ~(1<<1);//清除手动更新
IRQ_Install(INT_TYPE_INT_TIMER0,ISR);
}
else if(nTimerID == 1)
{
TCNTB1=base_time;
TCON |= 1<<9;//手动更新
TCON |= 1<<11;//自动加载
TCON &= ~(1<<9);//清除手动更新
IRQ_Install(INT_TYPE_INT_TIMER1,ISR);
}
else if(nTimerID == 2)
{
TCNTB2=base_time;
TCON |= 1<<13;//手动更新
TCON |= 1<<15;//自动加载
TCON &= ~(1<<13);//清除手动更新
IRQ_Install(INT_TYPE_INT_TIMER2,ISR);
}
else if(nTimerID == 3)
{
TCNTB3=base_time;
TCON |= 1<<17;//手动更新
TCON |= 1<<19;//自动加载
TCON &= ~(1<<17);//清除手动更新
IRQ_Install(INT_TYPE_INT_TIMER3,ISR);
}
else if(nTimerID == 4)
{
TCNTB4=base_time;
TCON |= 1<<21;//手动更新
TCON |= 1<<22;//自动加载
TCON &= ~(1<<21);//清除手动更新
IRQ_Install(INT_TYPE_INT_TIMER4,ISR);
}
return 1;
}
int TIMER_Destory(int nTimerID)//注销定时器中断
{
if(nTimerID > 4 || nTimerID <0 )
{
return -1;
}
if(0 == nTimerID)
{
IRQ_UnInstall(INT_TYPE_INT_TIMER0);
}
else if(1 == nTimerID)
{
IRQ_UnInstall(INT_TYPE_INT_TIMER1);
}
else if(2 == nTimerID)
{
IRQ_UnInstall(INT_TYPE_INT_TIMER2);
}
else if(3 == nTimerID)
{
IRQ_UnInstall(INT_TYPE_INT_TIMER3);
}
else if(4 == nTimerID)
{
IRQ_UnInstall(INT_TYPE_INT_TIMER4);
}
return 1;
}
int TIMER_Start(int nTimerID)//启动定时器
{
if(nTimerID > 4 || nTimerID <0 )
{
return -1;
}
if(0 == nTimerID)
{
TCON |= 1<<0;
}
else if(1 == nTimerID)
{
TCON |= 1<<8;
}
else if(2 == nTimerID)
{
TCON |= 1<<12;
}
else if(3 == nTimerID)
{
TCON |= 1<<16;
}
else if(4 == nTimerID)
{
TCON |= 1<<20;
}
//TCON |=0X01 << (nTimerID*4+((nTimerID == 0) ? 0:4));
return 1;
}
int TIMER_Stop(int nTimerID)//停止定时器
{
if(nTimerID > 4 || nTimerID <0 )
{
return -1;
}
if(0 == nTimerID)
{
TCON &=~(1<<0);
}
else if(1 == nTimerID)
{
TCON &=~(1<<8);
}
else if(2 == nTimerID)
{
TCON &=~(1<<12);
}
else if(3 == nTimerID)
{
TCON &=~(1<<16);
}
else if(4 == nTimerID)
{
TCON &=~(1<<20);
}
return 1;
}
/*
软定时
*/
TIMER_TS_t timer_ts[TIMER_TS_NUM]={0};//软定时器组
void TIMER_TS_Manger(void)//软定时需要硬定时的回调
{
int nTimerId;
for(nTimerId = 0; nTimerId < TIMER_TS_NUM ; nTimerId++)
{
if( timer_ts[nTimerId].isCreate == 1 && timer_ts[nTimerId].isAble ==1)
{
if(timer_ts[nTimerId].Tcnt > 0)
{
timer_ts[nTimerId].Tcnt--;
if(timer_ts[nTimerId].Tcnt == 0 && timer_ts[nTimerId].TIMER_TS_ISR !=NULL)
{
timer_ts[nTimerId].TIMER_TS_ISR();
if(timer_ts[nTimerId].isAutoload == 1)
{
timer_ts[nTimerId].Tcnt = timer_ts[nTimerId].Tcntb;
}
}
}
}
}
}
int TIMER_TS_Init(int nTimerID,int nDiv0,int nDiv1, int base_time, F_INTERRUPT_ISR ISR ,char is_ts)
{
//对软定时器进行初始化
if(is_ts == 1)
{
memset(timer_ts,0,sizeof(timer_ts));
}
//创建硬定时
TIMER_Init(nTimerID,nDiv0,nDiv1);
TIMER_Create(nTimerID,base_time,ISR);
TIMER_Start(nTimerID);
return 1;
}
int TIMER_TS_Create( int Tcntb, int isAutoload, F_INTERRUPT_ISR ts_ISR)
{
int nTimerId;
for(nTimerId = 0; nTimerId < TIMER_TS_NUM ; nTimerId++)
{
if(timer_ts[nTimerId].isCreate == 0)
{
timer_ts[nTimerId].isCreate = 1;
timer_ts[nTimerId].Tcntb = Tcntb;
timer_ts[nTimerId].Tcnt = timer_ts[nTimerId].Tcntb;
timer_ts[nTimerId].isAutoload = isAutoload;
timer_ts[nTimerId].TIMER_TS_ISR = ts_ISR;
timer_ts[nTimerId].isAble = 0;
return nTimerId;
}
}
return -1;
}
int TIMER_TS_Start(int ts_nTimerID)
{
if((ts_nTimerID >= 0 && ts_nTimerID < TIMER_TS_NUM) && timer_ts[ts_nTimerID].isCreate ==1)
{
timer_ts[ts_nTimerID].isAble = 1;
timer_ts[ts_nTimerID].Tcnt = timer_ts[ts_nTimerID].Tcntb;
return 1;
}
else
return -1;
}
int TIMER_TS_Destory(int ts_nTimerID)
{
if((ts_nTimerID >= 0 && ts_nTimerID < TIMER_TS_NUM) && timer_ts[ts_nTimerID].isCreate ==1)
{
memset(&timer_ts[ts_nTimerID],0,sizeof(TIMER_TS_t));
return 1;
}
else
return -1;
}
int TIMER_TS_Stop(int ts_nTimerID)
{
if((ts_nTimerID >= 0 && ts_nTimerID < TIMER_TS_NUM) && timer_ts[ts_nTimerID].isCreate ==1 && timer_ts[ts_nTimerID].isAble ==1)
{
timer_ts[ts_nTimerID].isAble = 0;
return 1;
}
else
return -1;
}
int TIMER_TS_ResetTimeout(int ts_nTimerID, int nTimerOut)
{
if((ts_nTimerID >= 0 && ts_nTimerID < TIMER_TS_NUM) && timer_ts[ts_nTimerID].isCreate ==1)
{
timer_ts[ts_nTimerID].Tcntb = nTimerOut;
return 1;
}
else
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -