/******************************************************************************
;  *   	@MCU				 : MC51F003A4
;  *   	@Create Date         : 2021.10.11
;  *   	@Author/Corporation  : Martin/SinoMCU
;  *   	@晟矽微技术支持QQ 	 : 2048615934
;  *    @晟矽微官网		     : http://www.sinomcu.com/
;  *   	@Copyright           : 2020 SINOMCU Corporation,All Rights Reserved.
;  *----------------------Abstract Description---------------------------------
;  *			          定义                              		
******************************************************************************/
#include "TIMER.h"

/************************************************
;  *    @Function Name       : Timer2_Init
;  *    @Description         : T2配置
;  *    @IN_Parameter      	 :
;  *    @Return parameter    :
;  ***********************************************/
void Timer2_Init(void)
{
#if (TIMER_MODE == 0) //方式0 16位自动重载
	//demo使用,为清楚了解,分开写,实际操作整个寄存器更节约rom
	T2CON1 |= DEF_SET_BIT0; //使能T2
	T2CON &= ~DEF_SET_BIT1; //内部时钟

	T2CON &= ~DEF_SET_BIT0;
	T2CON1 &= ~DEF_SET_BIT6;
	T2CON1 &= ~DEF_SET_BIT5; //000  方式0

	T2MOD |= DEF_SET_BIT7; //自动重载
	T2MOD &= 0x8F;
	T2MOD |= 0x20;			//FT2=Fsys/16
	T2MOD &= ~DEF_SET_BIT3; //IO不翻转
	TR2 = 0;
	//无论是读或者写 TL2/TH2(RCAPL2/RCAPH2)的值,必须先停止(TR2=0),否则 T2 将产生不可预知的情况。
	//写操作时:必须先写 TL2(RCAPL2),再写TH2(RCAPH2),否则TL2(RCAPL2)的值不能立即反映到内部counter上,
	//读操作时:必须先读 TL2(RCAPL2),再读TH2(RCAPH2),否则将读取到错误的值
	TL2 = (65536 - 1000) % 256;
	TH2 = (65536 - 1000) / 256;
	RCAPL2 = (65536 - 1000) % 256;
	RCAPH2 = (65536 - 1000) / 256; //1ms
	TR2 = 1;
	IE1 |= DEF_SET_BIT0; //使能中断
#endif

#if (TIMER_MODE == 1)		//方式1 输入捕获
	T2CON1 |= DEF_SET_BIT0; //使能T2
	T2CON |= DEF_SET_BIT3;  //使能T2EX
	T2CON &= ~DEF_SET_BIT1; //内部时钟

	//	T2MOD|=DEF_SET_BIT7;		//自动重载
	T2CON |= DEF_SET_BIT0;
	T2CON1 &= ~DEF_SET_BIT6;
	T2CON1 &= ~DEF_SET_BIT5; //  方式1 输入捕获

	T2MOD &= 0x8F;
	T2MOD |= 0x40;			//FT2=Fsys/64
	T2MOD &= ~DEF_SET_BIT3; //IO不翻转
							//	T2CON1&=~DEF_SET_BIT2;		//下降沿触发
	T2CON1 |= DEF_SET_BIT2; //上升沿

	//	TR2=1;
	IE1 |= DEF_SET_BIT0; //使能中断
#endif

#if (TIMER_MODE == 3)		//方式3 16位比较输出
	T2CON1 |= DEF_SET_BIT0; //使能T2
	T2CON &= ~DEF_SET_BIT1; //内部时钟
	T2CON &= ~DEF_SET_BIT0;

	T2CON &= ~DEF_SET_BIT0;
	T2CON1 |= DEF_SET_BIT6;
	T2CON1 &= ~DEF_SET_BIT5; //  方式3

	T2MOD |= DEF_SET_BIT7; //自动重载
	T2MOD &= 0x8F;
	T2MOD |= 0x20;		   //FT2=Fsys/16
	T2MOD |= DEF_SET_BIT3; //IO输出
	T2MOD |= DEF_SET_BIT2;
	T2MOD &= ~DEF_SET_BIT1; //初始值低电平
							//	T2MOD&=~DEF_SET_BIT2;
							//	T2MOD|=DEF_SET_BIT1;		//初始值H电平

	T2CON1 &= ~DEF_SET_BIT7; //触发翻转
	TR2 = 0;
	//无论是读或者写 TL2/TH2(RCAPL2/RCAPH2)的值,必须先停止(TR2=0),否则 T2 将产生不可预知的情况。
	//写操作时:必须先写 TL2(RCAPL2),再写TH2(RCAPH2),否则TL2(RCAPL2)的值不能立即反映到内部counter上,
	//读操作时:必须先读 TL2(RCAPL2),再读TH2(RCAPH2),否则将读取到错误的值
	TL2 = 0;
	TH2 = 0;
	RCAPL2 = 1000 % 256;
	RCAPH2 = 1000 / 256; //1ms
	TR2 = 1;
	IE1 |= DEF_SET_BIT0; //使能中断	根据使用选择
#endif
}
void Timer2_ISR(void) interrupt T2_IRQn
{
	SFR_INTERRUPT_BUFF_BIT_T2 = SFRSL0;		//进中断缓存SFR
	
#if (TIMER_MODE == 0) //方式0 16位自动重载
	SLK_SFR0();
	if (TF2 == 1)
	{
		TF2 = 0;
		LED1 = !LED1;
	}
#endif

#if (TIMER_MODE == 1) //方式1 输入捕获
	SLK_SFR0();
	if (TF2 == 1)	 //时间过长  溢出
	{
		TF2 = 0;
		High_Overflow_Num++;
		//printf("T2_Overflow\r\n");
	}
	if (EXTF2 == 1)
	{
		if (FLAG_T2_UP == 0)
		{
			TR2 = 1;
			FLAG_T2_UP = 1;			 //捕捉到上升沿
			T2CON1 &= ~DEF_SET_BIT2; //下降沿触发
			//printf("T2up\r\n");
		}
		else //捕捉到下降沿
		{
			TR2 = 0;		  //关闭定时器
			FLAG_T2_DOWN = 1; //捕捉完成
		}
		//		if(Flag_T2_Down==0)
		//		{
		//			TR2=1;
		//			Flag_T2_Down=1;			//捕捉到下
		//			T2CON1|=DEF_SET_BIT2;		//上
		//			printf("T2down\r\n");
		//		}else			//捕捉到上降沿
		//		{
		//			TR2=0;
		//			Flag_T2_Up=1;
		//		}
		EXTF2 = 0;
	}
#endif

#if (TIMER_MODE == 3) //方式3
	SLK_SFR0();
	if (TF2 == 1)
	{
		TF2 = 0;
		LED1 = !LED1;
	}
#endif
	
	SFRSL0 = SFR_INTERRUPT_BUFF_BIT_T2;		//退出中断还原SFR
}

/**************************** end of file *********************************************/
