📄 otimer.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 + -