/******************************************************************************
 *                  Shanghai ChipON Micro-Electronic Co.,Ltd                  *
 ******************************************************************************
 *  $File Name$       : KF32A156_EWDT.c                                	      *
 *  $Author$          : ChipON AE/FAE Group                                   *
 *  $Data$            : 2021-07-08                                            *
 *  $AutoSAR Version  : V1.0	                                              *
 *  $Description$     : This file provides the External Watchdog (EWDT) 	  *
 *  				    peripherals function                          		  *
 ******************************************************************************
 *  Copyright (C) by Shanghai ChipON Micro-Electronic Co.,Ltd                 *
 *  All rights reserved.                                                      *
 *                                                                            *
 *  This software is copyrght protected and proprietary to                    *
 *  Shanghai ChipON Micro-Electronic Co.,Ltd.                                 *
 ******************************************************************************
 *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  *
 *                     		REVISON HISTORY                               	  *
 *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  *
 *  Data       Version  Author        Description                             *
 *  ~~~~~~~~~~ ~~~~~~~~ ~~~~~~~~~~~~  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  *
 *  2021-07-08 00.01.00 FAE Group     new creat                               *
 *                                                                            *
 *                                                                            *
 *****************************************************************************/

/******************************************************************************
**                      		Include Files                                **
******************************************************************************/

#include "kf32a156_ewdt.h"
#include "kf32a156_rst.h"
#include "kf32a156_pclk.h"


/**
  *   ##### 外围看门狗(EWDT)控制功能函数 #####
  */
/**
  * 描述  复位EWDT模块，使能外设时钟。
  * 输入  无。
  * 返回  无。
  */
void
EWDT_Reset (void)
{
    /* 复位EWDT模块 */
    RST_CTL3_Peripheral_Reset_Enable(RST_CTL3_EWDTRST, TRUE);
    RST_CTL3_Peripheral_Reset_Enable(RST_CTL3_EWDTRST, FALSE);
    /* 使能EWDT时钟 */
    PCLK_CTL3_Peripheral_Clock_Enable(PCLK_CTL3_EWDTCLKEN, TRUE);
}

/**
  * 描述  EWDT工作时钟选择。
  * 输入  CLK ： 	EWDT_CLK_INTLF ： 选择INTLF为工作时钟
  * 			EWDT_CLK_SCLK ： 选择SCLK为工作时钟
  * 			EWDT_CLK_LFCLK ： 选择LFCLK为工作时钟
  * 			EWDT_CLK_LP4M ： 选择LP4M为工作时钟
  * 返回  无
  * 注： 低功耗模式下仅可以选择INTLF或LP4M
  */
void
EWDT_CLK_Select(uint32_t CLK)
{
	uint32_t tmpreg = 0;

	/* 参数校验 */
	CHECK_RESTRICTION(CHECK_EWDT_CLK(CLK));

	tmpreg = CLK << EWDT_CTL_CLKS0_POS;
	EWDT_CTL = SFR_Config(EWDT_CTL, ~EWDT_CTL_CLKS, tmpreg);
}

/**
  * 描述  外围看门狗预分频。
  * 输入  DIV : 	EWDT_CLK_DIV1 		: EWDTCLK为所选时钟
  * 			EWDT_CLK_DIV2 		: EWDTCLK为所选时钟/2
  * 			EWDT_CLK_DIV4 		: EWDTCLK为所选时钟/4
  * 			EWDT_CLK_DIV8 		: EWDTCLK为所选时钟/8
  * 			EWDT_CLK_DIV16 		: EWDTCLK为所选时钟/16
  * 			EWDT_CLK_DIV32 		: EWDTCLK为所选时钟/32
  * 			EWDT_CLK_DIV64 		: EWDTCLK为所选时钟/64
  * 			EWDT_CLK_DIV128 	: EWDTCLK为所选时钟/128
  * 			EWDT_CLK_DIV256 	: EWDTCLK为所选时钟/256
  * 			EWDT_CLK_DIV512 	: EWDTCLK为所选时钟/512
  * 			EWDT_CLK_DIV1024 	: EWDTCLK为所选时钟/1024
  * 			EWDT_CLK_DIV2048 	: EWDTCLK为所选时钟/2048
  * 			EWDT_CLK_DIV4096 	: EWDTCLK为所选时钟/4096
  * 			EWDT_CLK_DIV8192 	: EWDTCLK为所选时钟/8192
  * 			EWDT_CLK_DIV16384 	: EWDTCLK为所选时钟/16384
  * 			EWDT_CLK_DIV32768 	: EWDTCLK为所选时钟/32768
  * 			EWDT_CLK_DIV65536 	: EWDTCLK为所选时钟/65536
  * 			EWDT_CLK_DIV131072 	: EWDTCLK为所选时钟/131072
  * 			EWDT_CLK_DIV262144 	: EWDTCLK为所选时钟/262144
  * 返回  无
  */
void
EWDT_Clock_Div_Select(uint32_t CLK_DIV)
{
	uint32_t tmpreg = 0;

	/* 参数校验 */
	CHECK_RESTRICTION(CHECK_EWDT_CLK_DIV(CLK_DIV));

	tmpreg = CLK_DIV << EWDT_CTL_WPS0_POS;
	EWDT_CTL = SFR_Config(EWDT_CTL, ~EWDT_CTL_WPS, tmpreg);
}

/**
  * 描述 EWDTIN输入信号极性选择。
  * 输入  Select : 	EWDT_INTPUT_EFFECTIVE_LOW : EWDTIN输入信号低有效
  * 	 			EWDT_INTPUT_EFFECTIVE_HIGH : EWDTIN输入信号高有效
  * 返回  无。
  */
void
EWDT_Input_Effective_Single_Select(uint32_t Select)
{
	uint32_t tmpreg = 0;

	/* 参数校验 */
	CHECK_RESTRICTION(CHECK_EWDT_INTPUT_EFFECTIVE(Select));

	tmpreg = Select << EWDT_CTL_EWDTIN_POL_POS;
	EWDT_CTL = SFR_Config(EWDT_CTL, ~EWDT_CTL_EWDTIN_POL, tmpreg);
}

/**
  * 描述 EWDTIN输入信号使能。
  * 输入  NewState : 	TRUE : EWDTIN输入信号未使能
  * 	 			FALSE : EWDTIN输入信号未使能
  * 返回  无。
  */
void
EWDT_Input_Single_Enable(FunctionalState NewState)
{
	uint32_t tmpreg = 0;

	/* 参数校验 */
	CHECK_RESTRICTION(CHECK_FUNCTIONAL_STATE(NewState));

	tmpreg = NewState << EWDT_CTL_EWDTIN_EN_POS;
	EWDT_CTL = SFR_Config(EWDT_CTL, ~EWDT_CTL_EWDTIN_EN, tmpreg);
}

/**
  * 描述  EWDT的输出有效信号极性选择。
  * 输入  Select : 	EWDT_RESET_EFFECTIVE_LOW : EWDT产生的复位信号低有效
  * 	 			EWDT_RESET_EFFECTIVE_HIGH : EWDT产生的复位信号高有效
  * 返回  无。
  */
void
EWDT_Output_Effective_Single_Select(uint32_t Select)
{
	uint32_t tmpreg = 0;

	/* 参数校验 */
	CHECK_RESTRICTION(CHECK_EWDT_RESET_EFFECTIVE(Select));

	tmpreg = Select << EWDT_CTL_OUTSEL_POS;
	EWDT_CTL = SFR_Config(EWDT_CTL, ~EWDT_CTL_OUTSEL, tmpreg);
}

/**
  * 描述  外围看门狗下窗口配置。
  * 输入  Threshold : Threshold <= 0x3F
  * 返回  无
  */
void
EWDT_Threshold_Config(uint32_t Threshold)
{
	uint32_t tmpreg = 0;

	/* 参数校验 */
	CHECK_RESTRICTION(CHECK_EWDT_THRESHOLD(Threshold));

	tmpreg = Threshold << EWDT_CTL_WW0_POS;
	EWDT_CTL = SFR_Config(EWDT_CTL, ~EWDT_CTL_WW, tmpreg);
}

/**
  * 描述 外围看门狗使能。
  * 输入  NewState : 	TRUE : 使能外围看门狗功能
  * 	 			FALSE : 禁止外围看门狗功能
  * 返回  无。
  */
void
EWDT_Enable(FunctionalState NewState)
{
	/* 参数校验 */
	CHECK_RESTRICTION(CHECK_FUNCTIONAL_STATE(NewState));

	EWDT_CTL = SFR_Config(EWDT_CTL, ~EWDT_CTL_EWDTEN, NewState);
}

/**
  * 描述 获取外围看门狗计数值。
  * 输入 无
  * 返回  EWDT的计数值。
  */
uint8_t
EWDT_Get_Count_Value(void)
{
	return (EWDT_CNT & EWDT_CNT_WT0);
}

/**
  * 描述 设置外围看门狗计数值。
  * 输入 Value ： Value <= 0x3F
  * 返回  无。
  */
void
EWDT_Set_Count_Value(uint8_t Value)
{
	/* 参数校验 */
	CHECK_RESTRICTION(CHECK_EWDT_COUNT_VALUE(Value));

	EWDT_CNT = SFR_Config(EWDT_CNT, ~EWDT_CNT_WT0, Value);
}


/**
  *   ##### 外围看门狗(EWDT)中断函数 #####
  */


/**
  * 描述  EWDT产生复位信号中断使能。
  * 输入  NewState ： 	TRUE ： 使能EWDT产生复位信号触发中断
  * 					FALSE ： 禁止EWDT产生复位信号触发中断
  * 返回  无
  */
void
EWDT_Reset_Single_INT_Enable(FunctionalState NewState)
{
	uint32_t tmpreg = 0;

	/* 参数校验 */
	CHECK_RESTRICTION(CHECK_FUNCTIONAL_STATE(NewState));

	tmpreg = NewState << EWDT_CTL_EWDTRSTIE_POS;
	EWDT_CTL = SFR_Config(EWDT_CTL, ~EWDT_CTL_EWDTRSTIE, tmpreg);
}

/**
  * 描述 计数器计数到40时中断使能。
  * 输入  NewState : 	TRUE : 计数器计数到40时触发中断
  * 	 			FALSE : 禁止计数器计数到40时触发中断
  * 返回  无。
  */
void
EWDT_Count40_INT_Enable(FunctionalState NewState)
{
	uint32_t tmpreg = 0;

	/* 参数校验 */
	CHECK_RESTRICTION(CHECK_FUNCTIONAL_STATE(NewState));

	tmpreg = NewState << EWDT_CTL_WT40IE_POS;
	EWDT_CTL = SFR_Config(EWDT_CTL, ~EWDT_CTL_WT40IE, tmpreg);
}

/**
  * 描述  获取EWDT发生复位时的中断标志。
  * 输入  无
  * 返回  0 ： EWDT未发生复位
  * 	 1 : EWDT发生复位。
  */
FlagStatus
EWDT_Get_Reset_INT_Flag(void)
{
	return ((EWDT_CTL & EWDT_CTL_EWDTRSTIF) >> EWDT_CTL_EWDTRSTIF_POS);
}

/**
  * 描述  获取外围看门狗计数到40中断标志。
  * 输入  无
  * 返回  无
  */
FlagStatus
EWDT_Get_Count40_INT_Flag(void)
{
	return ((EWDT_CTL & EWDT_CTL_WT40IF) >> EWDT_CTL_WT40IF_POS);
}

/**
  * 描述  清零EWDT产生复位时中断标志。
  * 输入  无
  * 返回  无
  */
void
EWDT_Clear_Reset_INT_Flag(void)
{
	SFR_SET_BIT_ASM(EWDT_CTL, EWDT_CTL_EWDTRSTIC_POS);
	while(EWDT_CTL & EWDT_CTL_EWDTRSTIF);
	SFR_CLR_BIT_ASM(EWDT_CTL, EWDT_CTL_EWDTRSTIC_POS);
}

/**
  * 描述  清零计数器计数到40时中断标志位。
  * 输入  无
  * 返回  无
  */
void
EWDT_Clear_Count40_INT_Flag(void)
{
	SFR_SET_BIT_ASM(EWDT_CTL, EWDT_CTL_WW40IC_POS);
	while(EWDT_CTL & EWDT_CTL_WT40IF);
	SFR_CLR_BIT_ASM(EWDT_CTL, EWDT_CTL_WW40IC_POS);
}


