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

📄 timeer.c

📁 ucos_ii在mini2440上的移植KEIL编译环境
💻 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 + -