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

📄 timers.c

📁 定时器的做法
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                                   深圳博威科技有限公司
**                                        软 件 部
**                                        产品一部 
**
**                       
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: timers.c
**创   建   人: 黄城
**最后修改日期: 2008年5月22日
**描        述: 计时器
**              
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 黄城
** 版  本: v01.01
** 日 期: 2008年5月22日
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define TIMERS_GLOBE

#include "config.h"
#include "timers.h"
#include "glob.h"

/*********************************************************************************************************
** 函数名称: Timer0Init
** 功能描述: 定时器0初始化
** 输 入: 无
**
** 输 出: 无
**         
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2004年2月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Timer1Init(void)
{
    extern void Timer1_Handler(void);
    
    T1IR = 0xffffffff;
    T1TC = 0;     //计时器清零
    T1TCR = 0x01; //计时器使能
    T1MCR = 0x03; //
    T1MR0 = (Fpclk / OS_TICKS_PER_SEC);//5ms一次中断
    
    /* 设置timer1中断允许 */
    VICIntSelect = 0x00000000;        // 设置所有通道为IRQ中断
    VICVectCntl14 = 0x25;          // timer1通道分配到IRQ slot 14;
    VICVectAddr14 = (int)Timer1_Handler;        // 设置I2C中断向量地址  
    VICIntEnable |= 0x0020;              // 使能I2C中断   
}



/*********************************************************************************************************
** 函数名称: IRQ_Timer1
** 功能描述: 时间中断1的中断服务函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 
**
** 作 者: 黄城
** 日 期: 2008年5月22日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

void  Timer1_Exception(void)
{
static	  TIMERS *p = NULL;
	
//OSIntEnter();
OS_ENTER_CRITICAL();
    T1IR = 0x01;
    VICVectAddr = 0;            // 通知中断控制器中断结束
   
   if(EnTimersHead.nextT != NULL)
   {
     p = EnTimersHead.nextT;//到达第一个计时器
	 if((uint32)p < 0x80000000)
   	 {
   	  while(1);
      }
   }
   else//系统没有启动计时器
   {
   	return;
   }

   do//遍历计时器
   {  
   	  if(OFF == p->u8_state)
      {
      	(p->u32_RealTtimer)++;
      }
      if(p->u32_RealTtimer >= p->u32_ONTime)//ON 计时到达
      {
      	p->u8_state = ON;
      } 
	  if(p->nextT != NULL)
	  {
	 if((uint32)(p->nextT) < 0x80000000)
   	 {
   	  while(1);
      }
		p = p->nextT;	//下一个
	  }
	  else
	  {
	    break;
	  }
	 }while(NULL != p);
//OSIntExit();
OS_EXIT_CRITICAL();
}

/*********************************************************************************************************
** 函数名称: InitTimerList()
** 功能描述: 初始化时间链表
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 
**
** 作 者: 黄城
** 日 期: 2008年5月22日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void InitTimerList(void)
{
	uint8 err = 0;
	
	EnTimersHead.u8_nob = 0;//
  EnTimersHead.u8_state = OFF;  
  EnTimersHead.u32_ONTime = 0xffffffff;
  EnTimersHead.u32_RealTtimer = ZERO;
  EnTimersHead.nextT = NULL;
  
  g_TimersGroup.u8_Sum = G_TMIER_NUM;
  g_TimersGroup.u8_SumFree = G_TMIER_NUM;
	//初始化计时器分区
	g_pTimersBlock = OSMemCreate(g_u16_dynSpaceTimer, (G_TMIER_NUM+S_TMIER_NUM), sizeof(TIMERS),&err);
	
}
/*********************************************************************************************************
** 函数名称: EnableTimer()
** 功能描述: 使能一个计时器
** 输 入: 
	TimerHead------计时器的指针头
	u8_no----------要使能的计时器序号
	u32_ONTime-----计时到达极限
	TimerPool------新计时器的空间
** 输 出: 新计时器的指针
** 全局变量: g_TimersGroup
** 调用模块: 
** u8_no == 0XFF//表示是静态计时器
** 作 者: 黄城
** 日 期: 2008年5月22日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
TIMERS *EnableTimer(TIMERS *TimerHead, uint8 u8_no, uint32 u32_ONTime, OS_MEM *TimerPool)
{
	uint8 err = 0;
	
	TIMERS *pNewTimer = NULL;
  
  OS_ENTER_CRITICAL();
	if(((u8_no > G_TMIER_NUM)||(u8_no == 0XFF))||
	    (TimerPool == NULL)||(u32_ONTime < 1))
	{
		//return (TIMERS)NULL;
		DETECT_ERROR;
	}
	
	pNewTimer = (TIMERS*)OSMemGet(TimerPool, &err);//申请新计数器
	if( NULL == pNewTimer)//申请失败
	{ 
		DETECT_ERROR;
	}
	else//申请成功
	{	
		pNewTimer->u8_nob = u8_no;
		pNewTimer->u8_state = OFF;
    pNewTimer->u32_ONTime = u32_ONTime;
	  pNewTimer->u32_RealTtimer = ZERO;
		pNewTimer->nextT = NULL;
		
		while(NULL != TimerHead->nextT)//查找计时器链表尾巴
		{
			TimerHead = TimerHead->nextT;
		}
		TimerHead->nextT = pNewTimer;
		g_TimersGroup.u8_SumFree--;   //空闲计时器减一
		
		OS_EXIT_CRITICAL();
		return pNewTimer;
	}
}
/*********************************************************************************************************
** 函数名称: DisableTimer()
** 功能描述: 禁能一个计时器
** 输 入: 
	TimerHead------计时器的指针头
	pp_TimerDised----------要删除的指针的指针
	u32_ONTime-----计时到达极限
	TimerPool------新计时器的空间
** 输 出: 新计时器的指针
** 全局变量: g_TimersGroup
** 调用模块: 
**
** 作 者: 黄城
** 日 期: 2008年5月22日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 DisableTimer(TIMERS *TimerHead, TIMERS **pp_TimerDised, OS_MEM *TimerPool)
{
	uint8 err = 0;

	err = err; //避免编译告警
  OS_ENTER_CRITICAL();
	if((NULL == TimerHead)||(TimerPool == NULL)
	   ||(pp_TimerDised == NULL)||(*pp_TimerDised == NULL))
	{
		//return FALSE;
		DETECT_ERROR;
	}
	
	while(NULL != TimerHead->nextT)//查找要删除的计时器
	{
		if(TimerHead->nextT == *pp_TimerDised)//找到
		{
			if((*pp_TimerDised)->nextT != NULL)
			{
			  TimerHead->nextT = (*pp_TimerDised)->nextT;//删除节点
	    if((uint32)((*pp_TimerDised)->nextT) < 0x80000000)
   	  {
   	    while(1);
      }
			}
			else
			{
				TimerHead->nextT = NULL;
			}
			err = OSMemPut(TimerPool, (*pp_TimerDised));//释放内存
			if(err == ZERO)
			{
			  *pp_TimerDised = NULL;
			  g_TimersGroup.u8_SumFree++;   //空闲计时器加一
			  OS_EXIT_CRITICAL();
			  return TRUE;
			}
			else
			{
				OS_EXIT_CRITICAL();
			  return FALSE;
			}
		}
		TimerHead = TimerHead->nextT;
	}
	OS_EXIT_CRITICAL();
	return FALSE;
}

/*********************************************************************************************************
** 函数名称: RsetTimer()
** 功能描述: 复位一个计时器
** 输 入: 
	TimerHead------计时器的指针头
	p_TimerRset----要复位的指针的指针
	u8_type--------复位类型  (1:只复位状态 2:只复位实时计时器 3:都复位)
** 输 出: 新计时器的指针
** 全局变量: g_TimersGroup
** 调用模块: 
**
** 作 者: 黄城
** 日 期: 2008年5月29日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 RsetTimeruint8(TIMERS *TimerHead, TIMERS const *p_TimerRset, uint8 const u8_type)
{
	if((NULL == TimerHead)||(NULL ==p_TimerRset)
	   ||(u8_type > 4)||(u8_type < 1))
	{
		DETECT_ERROR;
	}
	
	while(NULL != TimerHead->nextT)
	{
		if(TimerHead->nextT == p_TimerRset)//找到
		{
			switch(u8_type)
			{
				case RESET_STATE:
					TimerHead->nextT->u8_state = OFF;
					return TRUE;
				case RESET_REAL:
					TimerHead->nextT->u32_RealTtimer = ZERO;
					return TRUE;
				case RESET_ALL:
					TimerHead->nextT->u8_state = OFF;
					TimerHead->nextT->u32_RealTtimer = ZERO;
        default:
        	 return FALSE;
			}
		}
		else//
		{
			TimerHead = TimerHead->nextT;
		}
	}
	return FALSE;
}




/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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