//*****************************************************   
//Copyright (c) 2021, 苏州华芯微电子股份有限公司
//All rights reserved                                 
//
//文件名称: HS16F3211_GREEN_WAKEUP_INT
//摘    要: HS16F3211进入绿色模式后，INT0 中断唤醒绿色模式演示  (PB0下降沿触发外部中断绿色模式唤醒)
//  		程序进入绿色模式，外部给PB0(INT0)下降沿唤醒绿色模式
//
//当前版本: 1.0                                      
//作    者: 华芯微MCU组
//完成日期: 2021.09.13
//*****************************************************   

#include 	<hs16f3211.h> 

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

#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 = 0b00000011;	//PB输入输出 0-输出 1-输入          //PB0 , PB1 作为外部中断输入口使用时必须配置为输入
                        //PB口->全输出
                        
    PHCON = 0b11111100;  //在外部中断模式中   中断管脚不要悬空.               
                        
                        
}


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

/*-------------------------------------------------
 *  函数名：EXIT_GREEN_WAKEUP_INIT
 *	功能：  PB0 配置为外部中断,下降沿触发模式
 *          PB0，PB1作为外部中断绿色模式唤醒使用时，必须配置为输入
 *  输入：  无
 *  输出：  无
 *  INT0绿色模式唤醒参数配置  
 *          OPTION.6=0:  即INTEDG=0   INT0配置为下降沿触发外部中断；         //INTEDG=1 :上升沿触发
            INTEN.2=1 ： 即FINTIE=1    使能外部中断INT0；   
            PCON.6=1  :  即EIS=1       PB0设置为外部中断输入口，屏蔽普通IO功能。 
//------------------------------------------------------------------------  
 *  INT1绿色模式唤醒参数配置  
 *          OPTION.6=0:  即INT1EDG=0   INT0配置为下降沿触发外部中断；         //INT1EDG=1 :上升沿触发
            INT1EN.5=1 ：即FINT1IE=1    使能外部中断INT0；                 
//-------------------------------------------------------------------------                  
 *          本函数只配置INT0中断,下降沿唤醒绿色模式           
 --------------------------------------------------*/	
void EXIT_GREEN_WAKEUP_INIT(void)
{
	OPTION= 0b00000000; //-000 0001    外部中断唤醒配置为下降沿触发
						//bit7:INT1EDG:外部中断触发控制位;  1:PB1上升沿触发中断  0:PB1下降沿触发中断
						//bit6:INTEDG:外部中断触发控制位;   1:PB0上升沿触发中断  0:PB0下降沿触发中断
						//bit5:T0CS:TMR0时钟源边沿选择位;1=下降沿;0=上升沿;
						//bit4:T0SE:TMR0时钟源选择位;1=外部T0CKI引脚,IOB2/T0CKI也会被强制设置为输入;0=内部指令时钟;
						//bit3:PSA:预分频分配位;1=预分频器分配给WDT;0=预分频器分配给TMR0;
						//bit2~0:PS2~PS0:预分频比率选择位
	
	PCON  = 0b01000000;	//010- ----   PCON.6=1  :  即EIS=1         PB0设置为外部中断模式
						//bit7:WDTE:看门狗使能位;1-EN;0-DIS
						//bit6:EIS:INT引脚定义位;1=INT;0=IOB0引脚，INT功能屏蔽
						//bit5:LVDTE:低电压检测使能位
	
	FINTIF = 0;			//INTIF: 外部中断标志位，软件复位				
	FINTIE = 1;			//INTIE: 外部中断使能位(1=EN,0=DIS)	
	                    //必须置1，否则INT0无法唤醒绿色模式
	FGIE  = 0;			//GIE:全局中断使能位       //不管FGIE是否置1，都会唤醒绿色模式     
	                   	
}

/*-------------------------------------------------
 *  函数名：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++);
	}
}

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



//****主函数****//
void main(void) 
{
    GPIO_Init();         //IO初始化            
    EXIT_GREEN_WAKEUP_INIT();  //外部中断唤醒绿色模式初始化
    while(1)
    {
	    NOP();    
		GREEN_ENB(); 	// 进入绿色模式		
    }
}
