
#ifndef _MAIN_C_
#define _MAIN_C_
/*********************************************************************************************************************/
#include "include/ca51f_config.h"		
#include "include/ca51f2sfr.h"
#include "include/ca51f2xsfr.h"
#include "include/gpiodef_f2.h"
#include "include/system_clock.h"

#include "include/uart.h"
#include "include/delay.h"
#include <intrins.h>
/*********************************************************************************************************************/			

#define LVDE(N)		(N<<7)
#define LVDS_reset	(1<<6)
#define LVDS_int	(0<<6)
#define LVDF		(1<<5)

#define LVDTH_1p8V		0
#define LVDTH_2p0V		1
#define LVDTH_2p2V		2
#define LVDTH_2p4V		3
#define LVDTH_2p6V		4
#define LVDTH_2p8V		5
#define LVDTH_3p0V		6
#define LVDTH_3p2V		7
#define LVDTH_3p4V		8
#define LVDTH_3p6V		9
#define LVDTH_3p8V		10
#define LVDTH_4p0V		11
#define LVDTH_4p2V		12
#define LVDTH_4p4V		13
#define LVDTH_4p6V		14
#define LVDTH_4p8V		15

//备注：CA51F2系列，当低电压检测（LVD）中断触发后，若VDD电压持续低于预设值，LVD中断不会反复产生。
void INT4_ISR (void) interrupt 9	//LVD中断服务程序
{
	if(LVDCON & LVDF)
	{
		LVDCON |= LVDF;			    //清除LVD中断标志
	
	/*
		若应用程序中已将LVD设置为中断模式，并通过LVD中断检测来实现掉电存储数据功能，建议在LVD中断服务程序中按照以下步骤操作：
		a. 清除LVD标志
		b. 需要先将LVD设置恢复为复位模式
		   LVDCON = LVDE(1) | LVDS_reset | LVDF | LVDTH_2p2V;			//设置LVD复位电压为2.2V
		c. 进行FLASH的擦写操作以存储数据
	*/		
	}		
}

void main(void)
{
	LVDCON = LVDE(1) | LVDS_reset | LVDF | LVDTH_2p2V;			//设置LVD复位电压为2.2V
#if (SYSCLK_SRC == PLL)
	Sys_Clk_Set_PLL(PLL_Multiple);	//设置系统时钟为PLL，PLL_Multiple为倍频倍数
#endif
	
#ifdef UART0_EN
	Uart0_Initial(UART0_BAUTRATE);	//初始化UART0
#endif
	
#ifdef UART1_EN
	Uart1_Initial(UART1_BAUTRATE);	//初始化UART1
#endif

#ifdef UART2_EN
	Uart2_Initial(UART2_BAUTRATE);	//初始化UART2
#endif

	EA = 1;													//开全局中断

#ifdef PRINT_EN
	uart_printf("LVD Interrupt Demo Code\n");
#endif

/*说明：
	1、若应用中存在将LVD设置为中断模式的需求，在程序开始运行时，仍需先将LVD设置为低电复位模式，延时一定时间后，再将其设置为LVD中断模式。 

	2、若应用中已将LVD设置为中断模式，并且通过LVD中断检测来实现掉电存储数据功能，建议按照以下步骤操作：
	a.在程序开始运行之处，先将LVD设置为低电复位模式。
	b.延时（建议延时100毫秒）
	c.读FLASH
	d.将LVD设置为中断模式（检测电压需依据产品的实际情况进行设置）
	c.当检测到LVD中断时，先清除LVD标志。此时，需要先将LVD设置恢复为复位模式，再进行FLASH的擦写操作以存储数据。 
*/
	Delay_ms(100);

//	LVDCON = LVDE(1) | LVDS_int | LVDF | LVDTH_1p8V;	//设置LVD使能,设置LVD为中断模式,检测电压为1.8V
//	LVDCON = LVDE(1) | LVDS_int | LVDF | LVDTH_2p0V;	//设置LVD使能,设置LVD为中断模式,检测电压为2.0V
//	LVDCON = LVDE(1) | LVDS_int | LVDF | LVDTH_2p2V;	//设置LVD使能,设置LVD为中断模式,检测电压为2.2V
//	LVDCON = LVDE(1) | LVDS_int | LVDF | LVDTH_2p4V;	//设置LVD使能,设置LVD为中断模式,检测电压为2.4V
//	LVDCON = LVDE(1) | LVDS_int | LVDF | LVDTH_2p6V;	//设置LVD使能,设置LVD为中断模式,检测电压为2.6V
//	LVDCON = LVDE(1) | LVDS_int | LVDF | LVDTH_2p8V;	//设置LVD使能,设置LVD为中断模式,检测电压为2.8V
	LVDCON = LVDE(1) | LVDS_int | LVDF | LVDTH_3p0V;	//设置LVD使能,设置LVD为中断模式,检测电压为3.0V	
//	LVDCON = LVDE(1) | LVDS_int | LVDF | LVDTH_3p2V;	//设置LVD使能,设置LVD为中断模式,检测电压为3.2V
//	LVDCON = LVDE(1) | LVDS_int | LVDF | LVDTH_3p4V;	//设置LVD使能,设置LVD为中断模式,检测电压为3.4V
//	LVDCON = LVDE(1) | LVDS_int | LVDF | LVDTH_3p6V;	//设置LVD使能,设置LVD为中断模式,检测电压为3.6V
//	LVDCON = LVDE(1) | LVDS_int | LVDF | LVDTH_3p8V;	//设置LVD使能,设置LVD为中断模式,检测电压为3.8V
//	LVDCON = LVDE(1) | LVDS_int | LVDF | LVDTH_4p0V;	//设置LVD使能,设置LVD为中断模式,检测电压为4.0V
//	LVDCON = LVDE(1) | LVDS_int | LVDF | LVDTH_4p2V;	//设置LVD使能,设置LVD为中断模式,检测电压为4.2V
//	LVDCON = LVDE(1) | LVDS_int | LVDF | LVDTH_4p4V;	//设置LVD使能,设置LVD为中断模式,检测电压为4.4V
//	LVDCON = LVDE(1) | LVDS_int | LVDF | LVDTH_4p8V;	//设置LVD使能,设置LVD为中断模式,检测电压为4.8V
	INT4EN = 1; 								//INT4 中断使能
	
	while(1)
	{

	}
}
#endif
