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

📄 otimer.c

📁 定时器管理
💻 C
字号:
/************************************************
** Name      : OTimer.c
** Describ   : 定时器
** CreateBy  : 彭恩文
** LastModify: 彭恩文
** modified by , 11/2/2003
*************************************************/
#include "sfr62a.h"
#include "config.h"
#include "public.h"
#include "string.h"
#include "io.h"
#include "spi.h"
#include "OTimer.h"
#include "serial.h"
#include "sdcmd.h"
#include "sdcrc.h"
#include "sddriver.h"
#include "sdconfig.h"
#include "uni2gb.h"
#include "fat32.h"



/***********************************
** 主时钟计数器值,选取F32为时钟源
** (x+1)*(32/clk) = time
***********************************/
#ifdef    Crystal_Frequency14M7456
#define OTimer_Macro_Quick10msA0       0x11FF    /* 14.7456M晶振,10ms定时器中断定时值 */
#define OTimer_Macro_Quick5msA0        0x8FF    /* 14.7456M晶振,5ms定时器中断定时值 */
#define OTimer_Macro_Quick50msA0       0x59FF    /* 14.7456M晶振,50ms定时器中断定时值 */	
#endif
/***********************************
** 主时钟计数器值,选取F8为时钟源
** (x+1)*(8/clk) = time
***********************************/
#ifdef  Crystal_Frequency9M216
#define OTimer_Macro_Quick10msA0       0x2CFF    /* 9.216M晶振,10ms定时器中断定时值 */
#define OTimer_Macro_Quick5msA0        0x167F    /* 9.216M晶振,5ms定时器中断定时值 */
#define OTimer_Macro_Quick50msA0       0xE0FF    /* 9.216M晶振,50ms定时器中断定时值 */
#endif		
#ifdef    Crystal_Frequency7M3728
#define OTimer_Macro_Quick10msA0       0x23FF    /* 7.3728M晶振,10ms定时器中断定时值 */
#define OTimer_Macro_Quick5msA0        0x11FF    /* 7.3728M晶振,5ms定时器中断定时值 */
#define OTimer_Macro_Quick50msA0       0xB3FF    /* 7.3728M晶振,50ms定时器中断定时值 */
#endif
#ifdef    Crystal_Frequency6M
#define OTimer_Macro_Quick10msA0       0x1D4B    /* 6M晶振,10ms定时器中断定时值 */
#define OTimer_Macro_Quick5msA0        0x0EA5    /* 6M晶振,5ms定时器中断定时值 */
#define OTimer_Macro_Quick50msA0       0x927B    /* 6M晶振,50ms定时器中断定时值 */
#endif

extern WORD near WDT_FLAG;
BYTE near  OTimer_RD_10msCounter    ;  /* 10ms计数器 */
BYTE near  OTimer_RD_100msCounter	  ;  /* 100ms级计数器 */
WORD near  OTimer_RD_Counter;            /* 秒级系统计数器 */

WORD near  OTimer_RD_DelayCounters   ;   /* 延时计数器 */


DWORD near  OTimer_RD_Status;           /* 逻辑定时器状态 1:发生了  0:未发生 */
DWORD near  OTimer_RD_Enable;           /* 逻辑定时器允许位 1:启动  0:为启动 */
DWORD near  OTimer_RD_Mode;             /* 逻辑定时器模式 1:重载   0:单次 */
WORD near  OTimer_RD_Interval[OTimer_Macro_MaxLogicTimerNum];   /* 逻辑定时器定时值 */
WORD near  OTimer_RD_DecCounter[OTimer_Macro_MaxLogicTimerNum]; /* 逻辑定时器定时值,减计数 */

/************************************************
** Name      : 定时器初始化. 
** Date      : 13:45PM  11/02/2003
*************************************************/
void Sys_TimerInit ()    
{
    ta0ic &= 0x00; /* 禁止TA0中断 */
    ta0s = 0;      /* 停止计数 */
#ifdef     Crystal_Frequency14M7456
	ta0mr = (ta0mr & 0) | 0x80; /* 定时方式,不输出脉冲,不使用门控功能,F32作时钟源 */
#else
  	ta0mr = (ta0mr & 0) | 0x40; /* 定时方式,不输出脉冲,不使用门控功能,F8作时钟源 */
#endif
  	ta0 = OTimer_Macro_Quick50msA0;
// 	ta0 = OTimer_Macro_Quick10msA0;
	OTimer_RD_Status = 0;
    OTimer_RD_Enable = 0;
	OTimer_RD_10msCounter = 0;
	OTimer_RD_100msCounter = 0;
	OTimer_RD_Counter = 0;
	OTimer_RD_DelayCounters = 0;

    ta0ic |= 0x01; /* 允许TA0中断 优先级为1 */
    ta0s = 1;      /* 启动计数 */
    ISET;
    return ;
}

/************************************************
** Name      : Sys_TimerReqire
** Describ   : 逻辑定时器申请
*************************************************/
void Sys_TimerRequest (BYTE  OTimerID, WORD  Interval, BYTE Mode)     
{
	DWORD temp_ret;
    temp_ret = 1;
    /* 申请空余定时器 */
    if(OTimerID >= OTimer_Macro_MaxLogicTimerNum)
    {
        return;
    }	
    TA0_INT_Level0;
    if (Interval == 0)  /* 立即执行 */
	{
		OTimer_RD_Status |= (temp_ret << OTimerID);
   		TA0_INT_Level1;
        return;
	}    

    OTimer_RD_Interval[OTimerID] = Interval;
    OTimer_RD_DecCounter[OTimerID] = Interval;
	OTimer_RD_Enable |= (temp_ret << OTimerID);
	OTimer_RD_Status &= ((temp_ret << OTimerID) ^ 0xFFFFFFFF);
	if(Mode == 0)
	    OTimer_RD_Mode &= ((temp_ret << OTimerID) ^ 0xFFFFFFFF);
	else
	    OTimer_RD_Mode |= (temp_ret << OTimerID);
    TA0_INT_Level1;
    return ;
}

/************************************************
** Name      : OTimer_RP_Interrupt
** Describ   : 定时器1中断服务程序
*************************************************/
void OTimer_RP_Interrupt(void);
#pragma INTERRUPT  OTimer_RP_Interrupt 
void  OTimer_RP_Interrupt()
{
	BYTE i;
	DWORD temp_ret;

ta0int_start:
	ICLR;
	ir_ta0ic = 0;
	ISET;
	WDT_FLAG++;
	if(WDT_FLAG  <= 200)  
	{
		WDT = ~WDT;
	}
	
	OTimer_RD_10msCounter ++;
	if (OTimer_RD_10msCounter != 2)
	{
		goto ta0int_rep;
	}
    OTimer_RD_10msCounter = 0;
    OTimer_RD_100msCounter ++ ;
    if (OTimer_RD_100msCounter == 10)  
    {
	    OTimer_RD_100msCounter = 0;
        OTimer_RD_Counter ++ ; /* 秒级系统计数器 */
	}
	    /* 每100ms做以下工作 */
	OTimer_RD_DelayCounters ++;                  /* delay函数以100ms为单位 */
	temp_ret = 1;
	for(i = 0; i < OTimer_Macro_MaxLogicTimerNum; i++)
	{
	  	if(((OTimer_RD_Enable >> i) & 1) == 1)         /* 已经申请了的定时器 */
	   	{
	   		OTimer_RD_DecCounter[i] --;
	   		if(OTimer_RD_DecCounter[i] == 0)    /* 定时到 */
	   		{
	   			OTimer_RD_Status |= (temp_ret << i);
	   			if(((OTimer_RD_Mode >> i) & 1) == 1)  /* 重载定时器 */
	   			{
	   				OTimer_RD_DecCounter[i] = OTimer_RD_Interval[i];
	   			}	
	   			else /* 释放定时器 */
	   			{
	   				OTimer_RD_Enable &= ((temp_ret << i) ^ 0xFFFFFFFF);
	   			}	
	   		}	
	   	}	
	}	
ta0int_rep:
	if(ir_ta0ic) goto ta0int_start;
	else return;
}	


/************************************************
** Name      : Sys_TimerRelease. 
** Describ   : 释放指定逻辑定时器.
*************************************************/
void Sys_TimerRelease (BYTE  OTimerID)    
{
	DWORD  temp_ret  ;
	temp_ret = 1;
    if(OTimerID >= OTimer_Macro_MaxLogicTimerNum)
    {
        return;
    }	
    TA0_INT_Level0;
    OTimer_RD_Enable &= ((temp_ret << OTimerID) ^ 0xFFFFFFFF);
    OTimer_RD_Status &= ((temp_ret << OTimerID) ^ 0xFFFFFFFF);
    TA0_INT_Level1;
    return ;
}

/************************************************
** Name      : Sys_TimerRestart. 
** Describ   : 指定逻辑定时器重新定时.
*************************************************/
void Sys_TimerRestart (BYTE  OTimerID)    
{
	DWORD  temp_ret  ;

	temp_ret = 1;
    if(OTimerID >= OTimer_Macro_MaxLogicTimerNum)
    {
        return;
    }	
    TA0_INT_Level0;
    OTimer_RD_Status &= ((temp_ret << OTimerID) ^ 0xFFFFFFFF);
    OTimer_RD_DecCounter[OTimerID] = OTimer_RD_Interval[OTimerID];
    TA0_INT_Level1;
    return ;
}

/************************************************
** Name      : delay. 
** Describ   : 延时.
*************************************************/
void delay (WORD  DelayTime)  
{
	DelayTime /= 100;  /* 以0.1秒为单位 */
	TA0_INT_Level0;
    OTimer_RD_DelayCounters = 0;
    TA0_INT_Level1;
    while (OTimer_RD_DelayCounters < DelayTime)
    {
		WAIT;
    }
}

/************************************************
** Name      : 清除定时器. 
** Describ   : 清除所有逻辑定时器. (不建议使用)
** Input	  : 无
** Output    : 无
*************************************************/
void Sys_TimerClear()    
{
	TA0_INT_Level0;
    OTimer_RD_Enable = 0;
    OTimer_RD_Status = 0;
	TA0_INT_Level1;
}

/**********************************
**        逻辑定时器查询
** 输入:无
** 输出:逻辑定时器号
**********************************/
DWORD Analyse_OTimerID()
{
	BYTE i;
	DWORD temp_ret,temp_buffer;
	DWORD temp_status;

	TA0_INT_Level0;
	temp_ret = 1;
	temp_buffer = OTimer_RD_Status;
	temp_status = OTimer_RD_Status;
	for(i = 0; i < OTimer_Macro_MaxLogicTimerNum; i++)
	{
		if((temp_buffer & 1) == 1)
		{
			OTimer_RD_Status &= ((temp_ret << i) ^ 0xFFFFFFFF);
		}
		temp_buffer >>= 1;
	}	
	TA0_INT_Level1;
	return(temp_status);
}



/***************************************************
Name      : Sys_WDTTimerInit. 
Describ   : 初始化监视定时器
Input	  : 无
Output    : 无
***************************************************/
/*void Sys_WDTTimerInit(void)
{
	wdc7 = 1;          /* 128分频 */
/*	wdts = 0xFF;       /* 写监视定时器启动寄存器,看门狗开始工作,与写入值无关 */
/*}
*/
/*************************************************
** Name:       OTimer_RP_Interrupt
** Descrip:    监视定时器中断服务程序
** Input:	    无
** Output:     无
*************************************************/
void Sys_WDTTimer_Interrupt();
#pragma INTERRUPT  Sys_WDTTimer_Interrupt 
void Sys_WDTTimer_Interrupt()
{
	while(1)
	{
		prc1 = 1;
		pm03 = 1;  /* 软件复位 */
		prc1 = 0;
	}
}

⌨️ 快捷键说明

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