160 lines
6.5 KiB
C
160 lines
6.5 KiB
C
|
||
/********************************** (C) COPYRIGHT *******************************
|
||
* File Name : Timer.C
|
||
* Author : WCH
|
||
* Version : V1.0
|
||
* Date : 2017/01/20
|
||
* Description : CH554 Time 初始化、定时器、计数器赋值、T2捕捉功能开启函数等
|
||
定时器中断函数
|
||
*******************************************************************************/
|
||
#include "CH554.h"
|
||
#include "common.h"
|
||
#include "Timer.h"
|
||
#include "stdio.h"
|
||
#include "USB.h"
|
||
|
||
UINT8 Tim_3ms;
|
||
|
||
#pragma NOAREGS
|
||
|
||
/*******************************************************************************
|
||
* Function Name : mTimer_x_ModInit(UINT8 x ,UINT8 mode)
|
||
* Description : CH554定时计数器x模式设置
|
||
* Input : UINT8 mode,Timer模式选择
|
||
0:模式0,13位定时器,TLn的高3位无效
|
||
1:模式1,16位定时器
|
||
2:模式2,8位自动重装定时器
|
||
3:模式3,两个8位定时器 Timer0
|
||
3:模式3,Timer1停止
|
||
* Output : None
|
||
* Return : 成功 SUCCESS
|
||
失败 FAIL
|
||
*******************************************************************************/
|
||
UINT8 mTimer_x_ModInit(UINT8 x ,UINT8 mode)
|
||
{
|
||
if(x == 0){TMOD = TMOD & 0xf0 | mode;}
|
||
else if(x == 1){TMOD = TMOD & 0x0f | (mode<<4);}
|
||
else if(x == 2){RCLK = 0;TCLK = 0;CP_RL2 = 0;} //16位自动重载定时器
|
||
else return FAIL;
|
||
return SUCCESS;
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : mTimer_x_SetData(UINT8 x,UINT16 dat)
|
||
* Description : CH554Timer0 TH0和TL0赋值
|
||
* Input : UINT16 dat;定时器赋值
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void mTimer_x_SetData(UINT8 x,UINT16 dat)
|
||
{
|
||
UINT16 tmp;
|
||
tmp = 65536 - dat;
|
||
if(x == 0){TL0 = tmp & 0xff;TH0 = (tmp>>8) & 0xff;}
|
||
else if(x == 1){TL1 = tmp & 0xff;TH1 = (tmp>>8) & 0xff;}
|
||
else if(x == 2)
|
||
{
|
||
RCAP2L = TL2 = tmp & 0xff; //16位自动重载定时器
|
||
RCAP2H = TH2 = (tmp>>8) & 0xff;
|
||
}
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CAP2Init(UINT8 mode)
|
||
* Description : CH554定时计数器2 T2EX引脚捕捉功能初始化
|
||
UINT8 mode,边沿捕捉模式选择
|
||
0:T2ex从下降沿到下一个下降沿
|
||
1:T2ex任意边沿之间
|
||
3:T2ex从上升沿到下一个上升沿
|
||
* Input : None
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CAP2Init(UINT8 mode)
|
||
{
|
||
RCLK = 0;
|
||
TCLK = 0;
|
||
C_T2 = 0;
|
||
EXEN2 = 1;
|
||
CP_RL2 = 1; //启动T2ex的捕捉功能
|
||
T2MOD |= mode << 2; //边沿捕捉模式选择
|
||
}
|
||
|
||
/*******************************************************************************
|
||
* Function Name : CAP1Init(UINT8 mode)
|
||
* Description : CH554定时计数器2 T2引脚捕捉功能初始化T2
|
||
UINT8 mode,边沿捕捉模式选择
|
||
0:T2ex从下降沿到下一个下降沿
|
||
1:T2ex任意边沿之间
|
||
3:T2ex从上升沿到下一个上升沿
|
||
* Input : None
|
||
* Output : None
|
||
* Return : None
|
||
*******************************************************************************/
|
||
void CAP1Init(UINT8 mode)
|
||
{
|
||
RCLK = 0;
|
||
TCLK = 0;
|
||
CP_RL2 = 1;
|
||
C_T2 = 0;
|
||
T2MOD = T2MOD & ~T2OE | (mode << 2) | bT2_CAP1_EN; //使能T2引脚捕捉功能,边沿捕捉模式选择
|
||
}
|
||
|
||
#ifdef T0_INT
|
||
/*******************************************************************************
|
||
* Function Name : mTimer0Interrupt()
|
||
* Description : CH554定时计数器0定时计数器中断处理函数
|
||
*******************************************************************************/
|
||
void mTimer0Interrupt( void ) interrupt INT_NO_TMR0 using 1 //timer0中断服务程序,使用寄存器组1
|
||
{ //方式3时,TH0使用Timer1的中断资源
|
||
SCK = ~SCK;
|
||
// mTimer_x_SetData(0,0x0000); //非自动重载方式需重新给TH0和TL0赋值
|
||
}
|
||
#endif
|
||
|
||
#ifdef T1_INT
|
||
/*******************************************************************************
|
||
* Function Name : mTimer1Interrupt()
|
||
* Description : CH554定时计数器0定时计数器中断处理函数
|
||
*******************************************************************************/
|
||
void mTimer1Interrupt( void ) interrupt INT_NO_TMR1 using 2 //timer1中断服务程序,使用寄存器组2
|
||
{ //方式3时,Timer1停止
|
||
SCK = ~SCK;
|
||
// mTimer_x_SetData(1,0x0000); //非自动重载方式需重新给TH1和TL1赋值
|
||
}
|
||
#endif
|
||
|
||
|
||
|
||
/*******************************************************************************
|
||
* Function Name : mTimer2Interrupt()
|
||
* Description : CH554定时计数器0定时计数器中断处理函数
|
||
*******************************************************************************/
|
||
#ifdef T2_INT
|
||
void mTimer2Interrupt(void) interrupt INT_NO_TMR2 using 3 //timer2中断服务程序,使用寄存器组3
|
||
{
|
||
mTimer2RunCTL( 0 ); //关定时器
|
||
#ifdef T2_CAP
|
||
if(EXF2) //T2ex电平变化中断中断标志
|
||
{
|
||
SCK = ~SCK; //P17电平指示监控
|
||
Cap[FLAG++] = RCAP2; //T2EX
|
||
printf("RCAP2 %04x \n",RCAP2);
|
||
EXF2 = 0; //清空T2ex捕捉中断标志
|
||
}
|
||
if(CAP1F) //T2电平捕捉中断标志
|
||
{
|
||
Cap[FLAG++] = T2CAP1; //T2;
|
||
printf("T2CAP1 %04x \n",T2CAP1);
|
||
CAP1F = 0; //清空T2捕捉中断标志
|
||
}
|
||
#endif
|
||
if(TF2)
|
||
{
|
||
Tim_3ms++;
|
||
TF2 = 0; //清空定时器2溢出中断
|
||
}
|
||
mTimer2RunCTL(1); //开定时器
|
||
}
|
||
#endif
|