/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
	FileName:HS23P2721_Template.c  
	ProjectName:  *WorkMode*配置使用说明*
	FunctionDesc:  
	CreateDate: 20210423 
	Version: V2.0 
	Author:  
	ModifyHistory:  
	Remark:  
	Copyright (c) 2021   苏州华芯微电子股份有限公司 
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ 
  
//RAM: 96*8bit
//ROM: 2K×16
//STACK: 5-level
//***********************************************************
 
#include	"HS23P2721.h" 
#include	"main.h" 


/****WorkMode****功能说明****/   
/**
系统工作模式：1.普通模式；2.低速模式；3.省点模式；4.绿色模式  
<1>普通模式<系统高速工作模式>
	<1.1>普通模式可以进入任一种工作模式；
	<1.2>睡眠唤醒进入普通模式；
	<1.3>普通模式切到绿色模式，唤醒后返回普通模式；
	<1.4>低速模式可以切到普通模式；
	
<2>低速模式<系统低速工作模式>	
	<2.1>低速模式切到睡眠模式，唤醒后进入到普通模式；
	<2.2>低速模式切到绿色模式，唤醒后返回低速模式；
	<2.3>普通模式可以切到低速模式；
	
<3>省电模式<睡眠模式>(唤醒源:P0电平变换触发)
	<3.1>睡眠唤醒进入普通模式;
	
<4>绿色模式(系统时钟保持工作，功耗大于睡眠模式)(唤醒源:P0/P4/P5电平变换触发;定时器)
	<4.1>普通模式切到绿色模式，唤醒返回到普通模式;
	<4.2>低速模式切到绿色模式，唤醒返回到低速模式;
	<4.3>唤醒源:P0电平变换触发和TC0定时器;
	<4.4>绿色模式下，PWM和BUZ功能仍然有效，但是定时器溢出不能唤醒系统;
**/   


/****SLEEP****功能说明****/
/** 	 
<1>省电模式<睡眠模式>
	<1.1>P0电平变换触发;p00-emm
	<1.3>P01外部中断;
	 
<2>绿色模式(系统时钟保持工作，功耗大于睡眠模式)
	<2.1>P0电平变换触发;
	<2.2>看门狗溢出复位;emm
	<2.3>看门狗溢出复位;
	<2.2>TC0定时器定时唤醒;
**/   


/*Function statment<<=========================================================*/ 
void GpioInit(void); 
void RAM_CLR(void);

void GpioOut(void);

void WeakPinInit(void);

void BEFORE_SLEEP_WORK(void);

void TC0_Init(void);

void P00_SLEEP_WEAK(void);
void INT1_SLEEP_WEAK(void);

void DelayUs(unsigned char delayUs);

void WorkMODE(unsigned char mode);
#define	WorkMODE_SLEEP	0x00
#define	WorkMODE_GREEN	0x01
#define	WorkMODE_LOWER	0x02
#define	WorkMODE_Slow2Normal	0x03
#define	WorkMODE_Normal	0x04


/*Interrupt entrance function <<====================================================*/ 
void __interrupt[0x08] isr(void) 
{ 
	//INT1:外部中断（P0.1）请求标志
	if(FINT1IF)
	{
		FINT1IF = 0;				//0-DIS,1-EN
		
		//P5:P5端口寄存器
		P5 = P5^0xff;				//---1 1---
									//0-OUT , 1-IN
	}	 	
} 
 
/*Main function<<===========================================================*/ 
void main(void) 
{ 
	GpioInit(); 
	RAM_CLR();
	/*1.1.P0电平变换;唤醒睡眠*/
	//P00_SLEEP_WEAK();//P00端口唤醒睡眠 模式
	//SLEEPMODE;
	
	/*1.2.看门狗溢出唤醒复位;Config配置选项，将看门狗配置-AlwaysOn-*/
	//BEFORE_SLEEP_WORK();
	//SLEEPMODE;
	
	/*1.3.P01外部中断;唤醒睡眠*/
	//BEFORE_SLEEP_WORK();
	//INT1_SLEEP_WEAK();//外部中断唤醒睡眠 模式
	//SLEEPMODE;
	
	/*2.1.P0电平变换;唤醒绿色*/
	//P00_SLEEP_WEAK();
	//GREENMODE;
	
	/*2.2.看门狗溢出唤醒复位;Config配置选项，将看门狗配置-AlwaysOn-*/
	//BEFORE_SLEEP_WORK();
	//GREENMODE;
	
	/*2.3.P01外部中断;唤醒绿色*/
	//BEFORE_SLEEP_WORK();
	//INT1_SLEEP_WEAK();//外部中断唤醒绿色 模式
	//GREENMODE;
	
	/*2.3.TC0定时器唤醒;唤醒睡眠*/
	BEFORE_SLEEP_WORK();
	TC0_Init();
	
	WorkMODE(WorkMODE_LOWER);
	
	while(1) 
	{ 	
		//WDTR:看门狗定时器
		WDTR = 0x5A;				/*clear watchdog timer*/ 
 		
 		//P0:P0端口寄存器
		P0 = P0^0xff;				//---0 0000
		
		DelayUs(40);
		//#endif 
		/*		...		*/														 
	} 
} 

//****INT1唤醒睡眠模式****
void INT1_SLEEP_WEAK(void)
{
	/*INT对应P01口配置输入带上拉*/ 
	//P0M:P0端口模式控制寄存器
	P0M=0xfd;						//1111 1101 ;InOut;0=in / 1=out  
	
	//P0UR:P0端口上拉寄存器
	P0UR=0x02;						//0000 0010 ;UpPull;0=dis / 1=en  
	
	//INT1:外部中断（P0.1）请求标志
	FINT1IF = 0; 					//0-DIS,1-EN
	
	//INT1IE:INT1 外部中断（P0.1）控制位
	FINT1IE = 1; 					//0-DIS,1-EN
	
	//FGIE:全局中断控制位
	FGIE = 1;						//0-DIS,1-EN
}

//****P00唤醒睡眠模式****
void P00_SLEEP_WEAK(void)
{
	WeakPinInit();
	BEFORE_SLEEP_WORK();
}
//****BeforeSleepWork****
void BEFORE_SLEEP_WORK(void)
{
	unsigned long Temp;
	Temp = 0xfff0;
	while(Temp--)
	{
		//WDTR:看门狗定时器
		WDTR = 0x5A;				/*clear watchdog timer*/ 
		
		//P5:P5端口寄存器
		P5 = P5^0xff;				//---1 1---
									//0-OUT , 1-IN
									
		DelayUs(5);
	}
}
//****按键初始化****//
//*P00*输入*上拉*带唤醒*
void WeakPinInit(void)
{
	//P0M:P0端口模式控制寄存器
	P0M=0xFe;		//---1 1100 ;InOut;	0=in / 1=out    
	
	//P0UR:P0端口上拉寄存器
	P0UR=0x01;		//---0 0010 ;UpPull;0=dis / 1=en 
}

//*TC0 initial sub function<<=================================================
void TC0_Init(void)
{
	/*TC0_Mode_Timer*/
	//TC0C:定时/计数器 0 的 8 位数据
	TC0C = 0x56;
	
	//TC0R:定时/计数器 0 自动装载位
	TC0R = 0x56;
	
	PWMS = 0x00;	//---- 0000
					//Bit0:PWMS0：PWM0输出端口选择
							//0-P54输出PWM0（前提PWMS1=0）
							//1-P41输出PWM0
						//Bit1:PWMS2：PWM2输出端口选择
							//0-P01输出PWM2
							//1-P40输出PWM2(前提PWMS3=0)
						//Bit2&Bit3:PWM3输出端口选择
							//00：P44输出PWM3 
							//01：P40输出PWM3 
							//10：P54输出PWM3 
							//11：P54和P40同时输出PWM3	
							
	//T0M:TC0、TC1 和 TC2 的时钟源选择及绿色模式唤醒寄存器						
	T0M  = 0x02;	//---0 001-
					//Bit1:TC0GN-TC0 绿色模式功能唤醒控制
						//0-DIS，1-EN
					//Bit2:TC0X8-TC0 内部时钟选择控制位
						//0-TC0 内部时钟来至 FCPU，TC0RATE=FCPU/2~FCPU/256
						//1-TC0 内部时钟来至 FHOSC，TC0RATE=FOSC/1~FOSC/128
					//Bit3:TC1X8-TC1 内部时钟选择控制位
						//0-TC1 内部时钟来至 FCPU，TC0RATE=FCPU/2~FCPU/256
						//1-TC1 内部时钟来至 FHOSC，TC0RATE=FOSC/1~FOSC/128
					//Bit4:TC2X8-TC2 内部时钟选择控制位
						//0-TC2 内部时钟来至 FCPU，TC0RATE=FCPU/2~FCPU/256
						//1-TC2 内部时钟来至 FHOSC，TC0RATE=FOSC/1~FOSC/128
	
	//TC0M:定时/计数器 0 模式控制位
	TC0M = 0x84;	//1111 0100
					//Bit0:PWMEN：PWM 输出控制
						//0-禁止 PWM 输出
						//1-使能 PWM 输出，PWM 输出占空比由 TC0OUT 和 ALOAD0 控制
					//Bit1:TCOUT：TC 超时输出信号控制。仅当 PWMEN = 0 时有效
						//0-禁止，P5.4 或者 P5.3 或者 P0.1 作为输入/输出口
						//1-使能，P5.4 或者 P5.3 或者 P0.1 输出 TCOUT 信号。可用作驱动 Buzzer
					//Bit2:ALOAD:自动装载控制。仅当 PWMEN = 0 时有效
						//0-DIS,1-EN
					//Bit3:TnCKS:TC 时钟信号控制位
						//0-内部时钟（Fcpu 或 Fosc）
						//1-外部时钟，T0CK 或 T1CK 或 T2CK 输入
					//Bit4~Bit6:TPS[2:0]:TC 分频选择位
						//TPS[2:0]    	TCnX8=0    		 TCnX8=1
						//	000			Fcpu / 256		Fosc / 128
						//	001			Fcpu / 128		Fosc / 64
						//	010			Fcpu / 64		Fosc / 32
						//	011			Fcpu / 32		Fosc / 16
						//	100			Fcpu / 16		Fosc / 8
						//	101			Fcpu / 8		Fosc / 4
						//	110			Fcpu / 4		Fosc / 2
						//	111			Fcpu / 2		Fosc / 1
					//Bit7:TR：TC 启动控制位
						//0-DIS,1-EN	
	
	//TC0IF:TC0 中断请求标志
	FTC0IF = 0;		//0-DIS,1-EN
	
	//FTC0IEN:TC0 中断控制位
	FTC0IEN = 0;	//0-DIS,1-EN
	
	//FGIE:全局中断控制位
	FGIE = 0;		//0-DIS,1-EN
	
}


//****系统工作模式设置****//
void WorkMODE(unsigned char mode)
{
	if(mode == WorkMODE_SLEEP)
	{
		SLEEPMODE;	//__asm{SleepMode};//两者等价
	}
	else if(mode == WorkMODE_GREEN)
	{
		GREENMODE;	//__asm{GreenMode};//两者等价
	}
	else if(mode == WorkMODE_LOWER)
	{
		SLOWMODE;	//__asm{SlowMode};//两者等价
	}
	else if(mode == WorkMODE_Slow2Normal)
	{
		SLOW2NORMAL;	//__asm{Slow2Normal};//两者等价
	}
}


/*Gpio initial sub function<<=================================================
;-------初始化IO--P0M P4M P5M------------------ 
;PnM:0-InPut ;1-OutPut 
;PnUR:0-DisUpPull;1-EnUpPull
Gpio initial sub function<<==================================================*/
void GpioInit(void) 
{
		//P0:P0端口寄存器
	P0=0X00;					//---0 0000
								//0-L , 1-H
								
	//P0UR:P0端口上拉寄存器
	P0UR=0X00;					//---0 0000
								//0-DIS, 1-EN
								
	//P0M:P0端口模式控制寄存器						
	P0M = 0XFF;					//---1 1111
								//0-IN,1-OUT
								
	//P4:P4端口寄存器							
	P4=0X00;					//---0 0000
								//0-L , 1-H
								
	//P4UR:P4端口上拉寄存器							
	P4UR=0X00;					//---0 0000
								//0-DIS, 1-EN
								
	//P4M:P4端口模式控制寄存器							
	P4M = 0XFF;					//---1 1111
								//0-IN,1-OUT
								
	//P5:P5端口寄存器						
	P5=0X00;					//---0 0---
								//0-L , 1-H
								
	//P5UR:P5端口上拉寄存器
	P5UR=0X00;					//---0 0---
	
	//P5M:P5端口模式控制寄存器
	P5M = 0XFF; 				//---1 1---
								//0-IN,1-OUT
	
} 
 

/***************************************************************
函数名：RAM_CLR
传参：
返回值：
功能：清 RAM,0~5f可间接寻址
引脚：
***************************************************************/
void RAM_CLR(void)
{
	__asm
	{
		B0MOV 	Y, #0
		B0MOV	Z, #5FH
	CLR_RAM:
		CLR		@YZ
		DECMS	Z
		JMP		CLR_RAM
		CLR		@YZ
	}
	return ;
}


/***************************************************************
函数名：DELAY
传参：DELAY_CNT：循环体的循环次数
返回值：无
功能：延时
引脚：无
***************************************************************/
void DelayUs(unsigned char delayUs)
{
	while(delayUs--);
}


 
 
 
 
 
 
 
 
