/*******************************************************************************
* @Copyright (c)    :(C)2020, Qingdao ieslab Co., Ltd
* @FileName         :hc32_rtcc_driver.c
* @Author           :Kv-L
* @Version          :V1.0
* @Date             :2020-07-01 15:30:52
* @Description      :the function of the entity of GP22Gas_rtcc_driver.c
*******************************************************************************/
#ifdef __cplusplus
extern "C"
{
#endif

/* Includes ------------------------------------------------------------------*/
#include "UWater_lptimer_driver.h"


/* Private variables ---------------------------------------------------------*/
u8 lpTimer_flag = FALSE;

/* Private function prototypes -----------------------------------------------*/

//用于定时,基本定时器使用基时2个32.768CLK
void LPTimer0Init(u8 Rtc_Clk_Source, u32 time)
{
	stc_lptim_cfg_t    stcLptCfg;
	  
    DDL_ZERO_STRUCT(stcLptCfg);

    ///< 使能LPTIM0 外设时钟
    Sysctrl_SetPeripheralGate(SysctrlPeripheralLpTim0, TRUE);

	stcLptCfg.enPrs    = LptimPrsDiv256;		//256分频   32768/256 = 128
    stcLptCfg.enGate   = LptimGateLow;
    stcLptCfg.enGatep  = LptimGatePLow;
	if(Rtc_Clk_Source)//内部低速时钟
	{
		stcLptCfg.enTcksel = LptimRcl;         	//选择内部低速 RC 时钟 RCL 32768  或  38400  ，本机选择32768(Clk_Init中配置)
	}
	else//外部低速时钟
	{
	    stcLptCfg.enTcksel = LptimXtl;         //选择外部低速 RC 时钟 RCL   32768  或  38400  ，本机选择32768
	}
    //stcLptCfg.enTcksel = LptimXtl;         		//选择外部低速 RC 时钟 RCL   32768  或  38400  ，本机选择32768
	//stcLptCfg.enTcksel = LptimRcl;         		//选择内部低速 RC 时钟 RCL   32768  或  38400  ，本机选择32768
    stcLptCfg.enTogen  = LptimTogEnLow;
    stcLptCfg.enCt     = LptimTimerFun;         //定时器功能
    stcLptCfg.enMd     = LptimMode2;            //工作模式为模式2：自动重装载16位计数器/定时器
    stcLptCfg.u16Arr   = 65536 - time;          //预装载寄存器值
    Lptim_Init(M0P_LPTIMER0, &stcLptCfg);
	  
    Lptim_ClrItStatus(M0P_LPTIMER0);   //清除中断标志位
    Lptim_ConfIt(M0P_LPTIMER0, TRUE);  //允许LPTIMER中断
    EnableNvic(LPTIM_0_1_IRQn, IrqLevel3, TRUE);
	  
	Lptim_Cmd(M0P_LPTIMER0, TRUE);
		
//		while (!M0P_LPTIMER0->CR_f.WT_FLAG)
//		{
//				;
//		}
//		M0P_LPTIMER0->ARR = 65536 - time;
//		M0P_LPTIMER0->CNT = 0;
//		M0P_LPTIMER0->CR = 0x422;   //中断使能 时钟选择XTL 16位定时重载方式
//		M0P_LPTIMER0->CR_f.PRS = 2; //1
//		M0P_LPTIMER0->ICLR = 0;
//		EnableNvic(LPTIM_0_1_IRQn, IrqLevel3, TRUE);
}
/****************************************************************************
Function:    LPTimer1Init
Description: 低功耗时钟1初始化
Input:
Return:
Others:
*****************************************************************************/
void LPTimer1Init(u8 Rtc_Clk_Source)
{
	stc_lptim_cfg_t    stcLptCfg;
	  
    DDL_ZERO_STRUCT(stcLptCfg);

    ///< 使能LPTIM1 外设时钟
    Sysctrl_SetPeripheralGate(SysctrlPeripheralLpTim1, TRUE);

	stcLptCfg.enPrs    = LptimPrsDiv256;		//256分频   32768/256 = 128
    stcLptCfg.enGate   = LptimGateLow;
    stcLptCfg.enGatep  = LptimGatePLow;
	
	if(Rtc_Clk_Source)//内部低速时钟
	{
		stcLptCfg.enTcksel = LptimRcl;         	//选择内部低速 RC 时钟 RCL 32768  或  38400  ，本机选择32768(Clk_Init中配置)
	}
	else//外部低速时钟
	{
	    stcLptCfg.enTcksel = LptimXtl;         //选择外部低速 RC 时钟 RCL   32768  或  38400  ，本机选择32768
	}
    stcLptCfg.enTogen  = LptimTogEnLow;
    stcLptCfg.enCt     = LptimTimerFun;         //计时器功能
    stcLptCfg.enMd     = LptimMode1;            //工作模式为模式1：16 位自由计数模式
    stcLptCfg.u16Arr   = 0;                     //预装载寄存器值
    Lptim_Init(M0P_LPTIMER1, &stcLptCfg);
	  
    Lptim_ClrItStatus(M0P_LPTIMER1);   //清除中断标志位
    Lptim_ConfIt(M0P_LPTIMER1, FALSE);  //取消LPTIMER1中断
    EnableNvic(LPTIM_0_1_IRQn, IrqLevel3, TRUE);
	  
	Lptim_Cmd(M0P_LPTIMER1, TRUE);	
}
/*************************************************
Function:  u32 LPTimerGetTick(u8 timerNum)
Description: 获取当前计数器的数值
Input：
Return:
Others:
*************************************************/
u16 LPTimer1GetTick()
{
    u16 b;
    b = M0P_LPTIMER1->CNT;
    return b ;
}

void LPTimer0_Work(u8 enCmd)
{
	if (enCmd == TRUE)
	{
		Sysctrl_SetPeripheralGate(SysctrlPeripheralLpTim0, TRUE);
		Lptim_Cmd(M0P_LPTIMER0, TRUE);
	}
	else
	{
		Sysctrl_SetPeripheralGate(SysctrlPeripheralLpTim0, FALSE);  //关时钟
		Lptim_Cmd(M0P_LPTIMER0, FALSE);
	}
}

u8 GetLpTimerFlag(void)
{
	return lpTimer_flag;
}

void ClearLpTimerFlag(void)
{
	lpTimer_flag = FALSE;
}
/*******************************************************************************
* @fun_name     LpTim0_IRQHandler
* @brief        
* @param[in]    None
* @param[out]   None
* @retval       None
* @other        None
*******************************************************************************/
void LpTim0_IRQHandler(void)
{
	if(Lptim_GetItStatus(M0P_LPTIMER0))
	{
		Lptim_ClrItStatus(M0P_LPTIMER0);
		lpTimer_flag = TRUE;		
	}
}

/*******************************************************************************
* @fun_name     LpTim0WakeSleep
* @brief        唤醒后处理
* @param[in]    None
* @param[out]   None
* @retval       None
* @other        None
*******************************************************************************/
void LpTim0WakeSleep(void)
{
    ;//唤醒不开启LpTime0，使用前再开启。
}

/*******************************************************************************
* @fun_name     LPTPreSleep
* @brief        LPT休眠前处理
* @param[in]    None
* @param[out]   None
* @retval       None
* @other        None
*******************************************************************************/
void LpTime0PreSleep(void)
{
    Lptim_Cmd(M0P_LPTIMER0, FALSE);
    Sysctrl_SetPeripheralGate(SysctrlPeripheralLpTim0, FALSE);  //关时钟
}
/*******************************************************************************
* @fun_name     LpTim0IfSleep
* @brief        是否允许休眠
* @param[in]    None
* @param[out]   None
* @retval       None
* @other        None
*******************************************************************************/
u8 LpTime0IfSleep(void)
{
    return TRUE;
}
#ifdef __cplusplus
}
#endif
