//*****************************************************   
//Copyright (c) 2021, 苏州华芯微电子股份有限公司
//All rights reserved                                 
//
//文件名称: HS16F3211_GREEN_WAKEUP_TC0
//摘    要: HS16F3211进入绿色模式，定时器TC0唤醒功能演示
//  		程序进入绿色模式，TC0溢出唤醒绿色模式  500MS 唤醒一次 
//            
//当前版本: 1.0                                      
//作    者: 华芯微MCU组
//完成日期: 2021.09.14
//*****************************************************   

#include 	<hs16f3211.h> 

//***********************宏定义*****************************
#define  unchar     unsigned char 
#define  unint      unsigned int
#define  unlong     unsigned long
#define  DemoPortOut	FPB0
#define  DemoPortOut1	FPB1

#define	NOP()		asm("NOP")    
#define	CLRWDT()	asm("clrwdt")    
#define	SLEEP()		asm("sleep")    



/*-------------------------------------------------
 *  函数名：GPIO_Init
 *	功能：  GPIO设置
 *  输入：  无
 *  输出：  无
 --------------------------------------------------*/	
void GPIO_Init(void) 
{ 
	OPTION = 0b00000010;//Bit7 INT1EDG, 外部中断1触发方式 0 INT1引脚下降沿触发
                        //Bit6 INTEDG, 外部中断 触发方式 0 INT引脚下降沿触发
                        //Bit5 T0CS, TMR0时钟源选择位 0 内部指令时钟
                        //Bit4 T0SE, TMR0时钟源边沿选择位 0 T0CKI引脚下降沿触发计数
                        //Bit1 PSA, 预分频分配位 0 预分频器分配给TMR0
                        //Bit2:0 PS[2:0], 预分频配置 010 '8分频
    PORTA = 0b00000000;	
    IOSTA = 0b00000000;	//PA输入输出 0-输出 1-输入
                        //PA口->全输出

    PORTB = 0b00000000;	
    IOSTB = 0b00000000;	//PB输入输出 0-输出 1-输入
                        //PB口->全输出
}


//**************中断处理**********************************
void interrupt ISR(void)  //空
{
   
}

/*-------------------------------------------------
 *  函数名：delay_ms
 *	功能：  写入参数 x,可以延时xMS
 *  输入参数：  x
 --------------------------------------------------*/	
void delay_ms(unint x)
{
	unint i,j;
	for(i=0;i<x;i++)
	{	
		for(j=0;j<140;j++);
	}
}


/*-------------------------------------------------
 *  函数名：TC0_GREEN_WAKEUP_SET
 *	功能：  500MS唤醒一次绿色模式。(进入绿色休眠模式后，TC0时钟时钟来源为 Fosc=8M )
 *  TC0L和TC0H重装载值计算方法 ：绿色模式后,TC0时钟来源只能选择Fosc, Fosc时钟=8MHZ ,  若选择128分频. TC0时钟为1/16MHZ ,采用16位计数模式 计时500MS      
             : 唤醒时间 = （TC0时钟/分频数）*（65536-计数器初值）；        计数值 = 500000us/16us;   计数值 = 31250
             ：所以  计数器初值 TC0L = (65536-15625)/256 = 0XEE; 
             ：					TC0H = (65536-15625)%256 = 0X85; 
             :注意:在绿色模式唤醒设置中，TC0时钟必须选择Fosc, 否则TC0不工作
                   配置：时钟选择Fosc：  TC0M.3 = 1   即    TCCKS=1
             
 --------------------------------------------------*/	
void TC0_GREEN_WAKEUP_SET(void) 
{  		                
		TC0M = 0x0C;//20; 	//选择 16位计数器，128分频  ,时钟选择Fosc
						//0000 1100;//Fcpu 128'  -16bit-  
						
		             	//Bit7 TC0TR, TC0启动控制位 0 禁止TC0定时器
                        //Bit6:4 TC0S[2:0], TC0分频选择位 000 128分频
                        //Bit3 TC0时钟信号选择位, 0 TC0时钟来自Fcpu
                        //BIT2 T16SEL,1  16位溢出位选择 0 低8位为溢出位
                        //BIT1 BUZ, BUZ输出使能位 0 关闭BUZ输出
                        //BIT0 PWM0, PWM0输出使能位 0 关闭PWM0输出
                        
        TC0L=0XEE; 		//定时器TC0计数器低八位初始值               
        TC0H=0X85;      //定时器TC0计数器高八位初始值  
           
           
		FTC0IF=0; 		//   TC0溢出中断标志位，TC0溢出时被置位，软件复位  
		FTC0IE=1; 		//   使能溢出中断   ;必须选择使能溢出，不置1无法唤醒绿色模式
		FTC0TR=1; 		//   开启TC0定时器   
		FGIE=0;   		//   不开TC0中断,只进行TC0计时绿色模式唤醒,不处理中断函数
		
}


/*-------------------------------------------------
 *  函数名：GREEN_ENB
 *	功能：  进入绿色模式
 *  输入：  无
 *  输出：  无
 --------------------------------------------------*/	
void GREEN_ENB(void)
{
	FGREENEN=1;       //OSCM.5 绿色模式使能位
}

//****主函数****//
void main(void) 
{
    GPIO_Init();
    TC0_GREEN_WAKEUP_SET(); //TC0绿色唤醒设置  ;设置唤醒时间500MS唤醒一次
    while(1)
    {
    	GREEN_ENB();    //进入绿色模式 
	    TC0L=0XEE; 		//定时器TC0计数器低八位初始值               
        TC0H=0X85; 		//定时器TC0计数器高八位初始值  
         				//保证下次绿色唤醒时间为500MS,需要对 TC0L和TC0H赋一次初值
    }
}
