#include "wttimer.h"

/*WT_TIME 	= Twtclk * (wttime+1) * 16384
						= (wdttime+1) * 0.5s
wdttime :0 ~ 63
*/


void WT_Init(uint8_t wttime)
{
	WTCON  = wttime << 2;
	CLKEN1 |= 0x02;  //wt时钟使能
	INTCTRL |= 0xC0; 	//选择P21中断源为WT匹配信号
	IEN0 |= 0x04;    //使能WT唤醒定时器中断
	EA = 1;
	WTCON |= 0x01;
//进入STOP前需要清零外部中断标志位IE0/1/2/3，允许STOP模式下ILRC运行
//进入STOP模式前确保WTCLR为0，否则可能无法唤醒STOP模式
}



void Wake_wt(uint8_t time)//P4.0输出每方波
{
	WT_Init(time);//(time+1)*0.5s唤醒，time = 0~63
	while(1)
	{
//		CLKCFG |= 0x10;//复位状态默认允许，必要时可关闭
		TCON &= 0xF5;		//清除外部中断1标志位		IE1 = 0;
//		TCON = 0x00;
		PCON |= 0x02;
//		WTCON &= 0xFE;//退出STOP关闭wt使能
		if(P4 == 0x01)
			P4 = 0x00;
		else
			P4 = 0x01;
	}
}

void Wake_wdt(uint8_t count)//count*32ms为唤醒时间
{
	uint8_t i;
	WDTTimer_Init(255);//(time+1)* 0.000125s唤醒，time = 0~255
	while(1)
	{
//		CLKCFG |= 0x10;		//STOP模式下辅时钟使能
		TCON &= 0xFD;		//清除外部中断0标志位	IE0 = 0;
		for(i=0;i<count;i++)
		{
			PCON |= 0x02;		//进入STOP停机模式
//		IEN0 &= 0xFE;    //退出STOP关闭wdt中断使能，例程会在看门狗计数满时复位
			WDT_RLD();//每次唤醒必须喂狗，否则一直计数会触发看门狗复位
		}
		
		if(P4 == 0x01)
			P4 = 0x00;
		else
			P4 = 0x01;

	}
}



/*使用外部中断源需保证对应端口为输入模式*/
/*进入STOP前需要清零外部中断标志位IE0/1/2/3*/
void WT_Test(void)
{
	P4CR |= 0xff;
	P4 = 0x01;
	delay_ms(200);
	P4 = 0x00;
//	Wake_wt(1);
	Wake_wdt(255);


}
