//*****************************************************   
//Copyright (c) 2024, 苏州华芯微电子股份有限公司
//All rights reserved                                 
//
//文件名称: HS16F1880_GREEN_WDT_WAKEUP 
//摘    要: HS16F1880_GREEN_WDT_WAKEUP功能演示
//  	    程序进入绿色模式后，WDT看门狗唤醒绿色模式,
//         看门狗复位时间仅由烧录配置：288ms；512ms；766ms；1024ms；
//当前版本: 1.0                                      
//作    者: 华芯微MCU组
//完成日期: 2025.08.7
//*****************************************************   
//*****************************************************   
//Files include 
#include 	"hs16p1880.h" 
#include 	"main.h"		


//***********************宏定义*****************************
#define  unchar     unsigned char 
#define  unint      unsigned int
#define  unlong     unsigned long

#define  u8     	unsigned char 
#define  u16      	unsigned int
#define  u32     	unsigned long


#define  led1		PB0
//#define	 NOP()		asm("NOP")   
//#define	CLRWDT()	asm("clrwdt")   


void GREEN_SET(void);
void WDT_WAKEUP_INIT(void);
//**所有中断统一入口，没有优先级区分，只能靠软件查询顺序排优先级***//
void interrupt myIsr(void)
{
	//=====================
	//空
	INTFLAG=0X00;
	//=====================
}


void main(void) 
{
	sys_gpio_init(); //系统寄存器和GPIO配置
	clr_all_ram();   //清所有ram
	WDT_WAKEUP_INIT();//看门狗初始化
	CLRWDT;	   		//清看门狗

	while(1)
	{
		CLRWDT;	//清看门狗
		led1=1;
		DelayMs(10);
		led1=0;
		DelayMs(10);
		GREEN_SET();
		
	} 
}


//;***********************************************************
//;函数名：GREEN_SLEEP_SET
//;功能：  进入绿色模式,
//;引脚：
//;备注： 进入绿色模式   “GREENEN = 1” 
//;       该函数进入绿色模式之前，关闭看门狗，设置低速时钟作为系统时钟；  看门狗复位，程序从程序起始位置开始运行
//;***********************************************************
void GREEN_SET(void)
{
	WDTE=1;	//;打开看门狗
	OSCM = 0x53;    //;Bit6：WAKEMODE：睡眠唤醒后系统时钟选择位;0=InsideLowRC,1=HighRC
					//;Bit5：GREENEN：绿色模式使能位		;0=GeneralMode，1=GreenMode
					//;Bit4：SLT0CON：TC0低速时钟控制位(用于唤醒睡眠、绿色);0=HighRC,1=LowRC
					//;Bit3：SLCON：内外低速时钟控制位	;0=OpenLowRC,1=CloseLowRC
					//;Bit2：XTSEL：内外低速选择位		;0=InsideLowRC,1=OutSideLowRC
					//;Bit1：STPHX：内部高速振荡器控制位	;0=Work,1=Stop
					//;Bit0：CLKMD：系统时钟模式控制位	;0=GeneralMode，1=LowMode
	NOP;
	GREENEN=1;
	NOP;
}
	

//;***********************************************************
//;函数名：WDT_WAKEUP_INIT
//;功能：  初始化看门狗
//;引脚：
//;备注：  看门狗复位时间仅由烧录配置：288ms；512ms；766ms；1024ms；
//;***********************************************************
void WDT_WAKEUP_INIT(void)
{
	CLRWDT;
	 
//;option attentions 
	OPTION= 0b00000000; //-000 0000
			//;Bit7：INT1EDG：外部中断1触发方式选择位（PB1）;0-falling edge, 1-rising edge
			//;Bit6：INTEDG：外部中断触发方式选择位（PB0）	;0-falling edge, 1-rising edge
		
		
	
//;PCON 
	PCON  = 0b10100000;	//100- ----	
			//;Bit7：WDTE: WDT（看门狗定时器）使能位	;0-DIS, 1-EN
		
			//;Bit5：LVREN: 低电压复位使能位			;0-DIS, 1-EN			
}

 
//****GPIO configuration****//
void sys_gpio_init(void)
{
	OPTION= 0b00000000;//0000 0000	
			//;Bit7：INT1EDG：外部中断1触发方式选择位（PB1）;0-falling edge, 1-rising edge
			//;Bit6：INTEDG：外部中断触发方式选择位（PB0）	;0-falling edge, 1-rising edge
	
	
	PCON  = 0b10100000;	//101- ----		
			//;Bit7：WDTE: WDT（看门狗定时器）使能位	;0-DIS, 1-EN
		
			//;Bit5：LVREN: 低电压复位使能位			;0-DIS, 1-EN
	
	INTEN=0X00;//
	//PORTB //----------------------------------------------------------------------
	PORTB = 0b00000000;	//0000 0000 :PORTB数据寄存器
	TRISB = 0b00000000;	//--00 0000 :PORTB输入输出配置寄存器 (0-OUT;1-IN)
	WUCON = 0b00000000;	//--00 0000	:PORTB变化中断唤醒寄存器 (1-EN;0=DIS)
	ODCON = 0b00000000;	//--00 0000 :PORTB开漏寄存器 (1-EN;0-DIS)
	PHCON = 0b11111111;	//--11 1111 :PORTB上拉寄存器 (1-DIS;0-EN)
	
	PDCON = 0b11111111;	//0000 ---- :bit7:4 PORTB3:0下拉寄存器;1-DIS;0-EN
	PDCON1= 0b11111111;	//---- --11 :bit1:0 PORTB5:4下拉寄存器;1-DIS;0-EN
	//----------------------------------------------------------------------
	
	
	//;--------唤醒后，时钟改为高速RC时钟-----------------------------------
	OSCM=0x40;   	//;Bit6：WAKEMODE：睡眠唤醒后系统时钟选择位;0=InsideLowRC,1=HighRC
					//;Bit5：GREENEN：绿色模式使能位		;0=GeneralMode，1=GreenMode
					//;Bit4：SLT0CON：TC0低速时钟控制位(用于唤醒睡眠、绿色);0=HighRC,1=LowRC
					//;Bit3：SLCON：内外低速时钟控制位	;0=OpenLowRC,1=CloseLowRC
					//;Bit2：XTSEL：内外低速选择位		;0=InsideLowRC,1=OutSideLowRC
					//;Bit1：STPHX：内部高速振荡器控制位	;0=Work,1=Stop
					//;Bit0：CLKMD：系统时钟模式控制位	;0=GeneralMode，1=LowMode
	WDTE=1;    //;打开看门狗
}


//****************************************************  
//清除所有ram 
//C中嵌入ASM，指令操作特殊寄存器前面需要加下划线“_”;
//****************************************************    
void clr_all_ram(void)
{
	STATUS &= 0x1F;
#asm  
	MOVLW	0X3F
	MOVWF	040H
	MOVLW	0X7F
	MOVWF	_FSR
	
BANK0_RAM_CLR_LOOP:	
	CLRF	_INDF
	DECF	_FSR,F
	DECFSZ	040H,F
	GOTO	BANK0_RAM_CLR_LOOP
#endasm
}

/*-------------------------------------------------
 *  函数名：DelayMs
 *	功能：  软件延时函数
 *  输入：  延时时间 单位 MS 存在一定的误差 8M2分频情况下，未开优化
 *  输出：  无
 --------------------------------------------------*/	
void DelayMs(unsigned char delayMs)
{
	unsigned int delay_us;
	while(delayMs--)
	{
		delay_us=285;
		while(delay_us--);
	}
}


//****delay function****// 
//;Fcpu=1MHz;DelayUs = 11+7x     
void DelayUs(unsigned char delayUs)
{      
	while(delayUs--);    
} 