/*
  ******************************************************************************
  * @file    apt32f102_gpt.c
  * @author  APT AE Team
  * @version V1.08
  * @date    2021/06/21
  ******************************************************************************
  *THIS SOFTWARE WHICH IS FOR ILLUSTRATIVE PURPOSES ONLY WHICH PROVIDES 
  *CUSTOMER WITH CODING INFORMATION REGARDING THEIR PRODUCTS.
  *APT CHIP SHALL NOT BE HELD RESPONSIBILITY ADN LIABILITY FOR ANY DIRECT, 
  *INDIRECT DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT OF 
  *SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION 
  *CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.AND APT CHIP RESERVES 
  *THE RIGHT TO MAKE CHANGES IN THE SOFTWARE WITHOUT NOTIFICATION
  ******************************************************************************
  */

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


/*************************************************************/
//GPT RESET CLEAR ALL REGISTER
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/  
void GPT_DeInit(void)
{
	GPT0->CEDR 		= 0xBE980000;
	GPT0->RSSR 		= GPT_RESET_VALUE;
	GPT0->PSCR 		= GPT_RESET_VALUE;
	GPT0->CR 		= 0X00010010;
	GPT0->SYNCR 	= GPT_RESET_VALUE;
	GPT0->GLDCR 	= GPT_RESET_VALUE;
	GPT0->GLDCFG 	= GPT_RESET_VALUE;
	GPT0->GLDCR2 	= GPT_RESET_VALUE;
	GPT0->PRDR 		= GPT_RESET_VALUE;
	GPT0->CMPA 		= GPT_RESET_VALUE;
	GPT0->CMPB 		= GPT_RESET_VALUE;
	GPT0->CMPLDR 	= 0X00002490;
	GPT0->CNT 		= GPT_RESET_VALUE;
	GPT0->AQLDR 	= 0X00000024;
	GPT0->AQCRA 	= GPT_RESET_VALUE;
	GPT0->AQCRB 	= GPT_RESET_VALUE;
	GPT0->AQOSF	 	= 0X00000100;
	GPT0->AQCSF 	= GPT_RESET_VALUE;
	GPT0->TRGFTCR 	= GPT_RESET_VALUE;
	GPT0->TRGFTWR	= GPT_RESET_VALUE;
	GPT0->EVTRG 	= GPT_RESET_VALUE;
	GPT0->EVPS 		= GPT_RESET_VALUE;
	GPT0->EVCNTINIT = GPT_RESET_VALUE;
	GPT0->EVSWF 	= GPT_RESET_VALUE;
	GPT0->RISR		= GPT_RESET_VALUE;
	GPT0->MISR 		= GPT_RESET_VALUE;
	GPT0->IMCR 		= GPT_RESET_VALUE;
	GPT0->ICR 		= GPT_RESET_VALUE;
	GPT0->REGLINK 	= GPT_RESET_VALUE;
}
/*************************************************************/
//GPT IO Init
//EntryParameter:GPT_CHA_PB01,GPT_CHA_PA09,GPT_CHA_PA010,GPT_CHB_PA010,GPT_CHB_PA011,GPT_CHB_PB00,GPT_CHB_PB01
//ReturnValue:NONE
/*************************************************************/
void GPT_IO_Init(GPT_IOSET_TypeDef IONAME)
{
	if(IONAME==GPT_CHA_PB01)
	{
		GPIOB0->CONLR=(GPIOB0->CONLR & 0XFFFFFF0F)|0x00000050;
	}
	if(IONAME==GPT_CHA_PA09)
	{
		GPIOA0->CONHR=(GPIOA0->CONHR & 0XFFFFFF0F)|0x00000050;
	}
	if(IONAME==GPT_CHA_PA010)
	{
		GPIOA0->CONHR=(GPIOA0->CONHR & 0XFFFFF0FF)|0x00000600;
	}
	if(IONAME==GPT_CHB_PA010)
	{
		GPIOA0->CONHR=(GPIOA0->CONHR & 0XFFFFF0FF)|0x00000700;
	}
	if(IONAME==GPT_CHB_PA011)
	{
		GPIOA0->CONHR=(GPIOA0->CONHR & 0XFFFF0FFF)|0x00006000;
	}
	if(IONAME==GPT_CHB_PB00)
	{
		GPIOB0->CONLR=(GPIOB0->CONLR & 0XFFFFFFF0)|0x00000004;
	}
	if(IONAME==GPT_CHB_PB01)
	{
		GPIOB0->CONLR=(GPIOB0->CONLR & 0XFFFFFF0F)|0x00000060;
	}
}

/*************************************************************/
//GPT Init
//EntryParameter:
//ReturnValue:NONE
/*************************************************************/
void GPT_Configure(GPT_CLK_TypeDef GPTCLKX,GPT_CSS_TypeDef GCSSX,GPT_SHDWSTP_TypeDef GSHDWSTPX,U16_T GPSCX)
{
	GPT0->CEDR = GPTCLKX| GCSSX|GSHDWSTPX;
	GPT0->PSCR=GPSCX;
}
/*************************************************************/
//GPT Wave control Init
//EntryParameter:
//ReturnValue:NONE
/*************************************************************/
//GPT0->CR = (0X0<<0)|(0x00<<2)|(0x01<<3)|(0x00<<4)|(0X00<<6)|(0x01<<18)|(0x00<<9)|(0X00<<10)|(0x00<<11)|(0x00<<13) ;	
//GPT0->CMPLDR=(0X00<<0)|(0X00<<1)|(0X03<<4)|(0X03<<7);
void GPT_WaveCtrl_Configure(GPT_CNTMD_TypeDef GCNTMDX,GPT_SWSYN_TypeDef GSWSYNX,GPT_IDLEST_TypeDef GIDLEX,GPT_PRDLD0_TypeDef GPRDLD0,GPT_OPM_TypeDef GOPMX,
						GPT_BURST_TypeDef GBURSTX,GPT_CKS_TypeDef GCKS,GPT_CGSRC_TypeDef CGSRCX,GPT_CGFLT_TypeDef CGFLT,GPT_PSCLD_TypeDef PSCLDX)
{
	GPT0->CR =GCNTMDX|GSWSYNX|GIDLEX|GPRDLD0|GOPMX|GBURSTX|GCKS|CGSRCX|CGFLT|PSCLDX|GPT_WAVE_MODE;
}

/*************************************************************/
//GPT Wave control Init
//EntryParameter:
//ReturnValue:NONE
/*************************************************************/
void GPT_WaveLoad_Configure(GPT_SHDWAQA_TypeDef SHDWAQAX,GPT_SHDWAQB_TypeDef SHDWAQBX,GPT_AQLDA_TypeDef AQLDAX, GPT_AQLDB_TypeDef AQLDBX)
{
	GPT0->AQLDR=SHDWAQAX|SHDWAQBX|AQLDAX|AQLDBX;
}
/*************************************************************/
//GPT Wave A OUT Init
//EntryParameter:
//ReturnValue:NONE
/*************************************************************/
void GPT_WaveOut_Configure(GPT_GPTCHX_TypeDef GPTCHX,GPT_CASEL_TypeDef CASELX,GPT_CBSEL_TypeDef CBSELX,U8_T ZROX,U8_T PRDX,U8_T CAUX,
						U8_T CADX,U8_T CBUX,U8_T CBDX,U8_T T1UX,U8_T T1DX,U8_T T2UX,U8_T T2DX)
{
	if(GPTCHX==GPT_CHA)
	{
	GPT0->AQCRA=CASELX|CBSELX|(ZROX<<0)|(PRDX<<2)|(CAUX<<4)|(CADX<<6)|(CBUX<<8)|(CBDX<<10)|(T1UX<<12)|(T1DX<<14)|(T2UX<<16)|(T2DX<<18);
	}
	if(GPTCHX==GPT_CHB)
	{
	GPT0->AQCRB=CASELX|CBSELX|(ZROX<<0)|(PRDX<<2)|(CAUX<<4)|(CADX<<6)|(CBUX<<8)|(CBDX<<10)|(T1UX<<12)|(T1DX<<14)|(T2UX<<16)|(T2DX<<18);
	}
}
/*************************************************************/
//Deinitializes the GPT Caputer Config
//EntryParameter:GPT_CNTMD_SELECTE_X,GPT_CAPMD_SELECTE_X,GPT_LOAD_CMPA_RST_CMD~GPT_LOAD_CMPB_RST_CMD,GPT_STOP_WRAP,GPT_PSCR
//GPT_CNTMD_SELECTE_X:GPT_CNTMD_increase,GPT_CNTMD_decrease,GPT_CNTMD_increaseTOdecrease
//GPT_CAPMD_SELECTE_X:GPT_CAPMD_Once,GPT_CAPMD_Continue
//GPT_LOAD_CMPA_RST_CMD:GPT_LDARST_EN,GPT_LDARST_DIS
//GPT_LOAD_CMPB_RST_CMD:GPT_LDBRST_EN,GPT_LDBRST_DIS
//GPT_STOP_WRAP:0~3
//GPT_PSCR:0~0XFFFF
//ReturnValue:NONE
/*************************************************************/  
void GPT_Capture_Config(GPT_CNTMD_SELECTE_Type GPT_CNTMD_SELECTE_X  , GPT_CAPMD_SELECTE_Type GPT_CAPMD_SELECTE_X , GPT_CAPLDEN_TypeDef CAP_CMD 
					, GPT_LDARST_TypeDef GPT_LOAD_CMPA_RST_CMD , GPT_LDBRST_TypeDef GPT_LOAD_CMPB_RST_CMD , 
					GPT_LOAD_CMPC_RST_CMD_Type GPT_LOAD_CMPC_RST_CMD , GPT_LOAD_CMPD_RST_CMD_Type GPT_LOAD_CMPD_RST_CMD, U8_T GPT_STOP_WRAP )
{
	GPT0->CR=(GPT0->CR&0xf800fec0)|GPT_CNTMD_SELECTE_X|(0x0<<2)|(0x0<<3)|(0x0<<4)|CAP_CMD|GPT_CAPMD_SELECTE_X|(0X0<<16)|(0x0<<18)|(GPT_STOP_WRAP<<21)|
				GPT_LOAD_CMPA_RST_CMD|GPT_LOAD_CMPB_RST_CMD|GPT_LOAD_CMPC_RST_CMD|GPT_LOAD_CMPD_RST_CMD;
}
/*************************************************************/
//GPT SYNC Init
//EntryParameter:
//ReturnValue:NONE
/*************************************************************/
void GPT_SyncSet_Configure(GPT_SYNCENX_TypeDef SYNCENx,GPT_OSTMDX_TypeDef OSTMDx,GPT_TXREARM0_TypeDef TXREARM0x,GPT_TRGO0SEL_TypeDef TRGO0SELx,
							GPT_TRGO1SEL_TypeDef TRGO1SELx,GPT_AREARM_TypeDef AREARMx)
{
	GPT0->SYNCR |= SYNCENx| OSTMDx| TXREARM0x |TRGO0SELx|TRGO1SELx|AREARMx;
}
/*************************************************************/
//GPT Trigger Init
//EntryParameter:
//ReturnValue:NONE
/*************************************************************/
void GPT_Trigger_Configure(GPT_SRCSEL_TypeDef SRCSELx,GPT_BLKINV_TypeDef BLKINVx,GPT_ALIGNMD_TypeDef ALIGNMDx,GPT_CROSSMD_TypeDef CROSSMDx,
						U16_T G_OFFSET_DATA,U16_T G_WINDOW_DATA)
{
	GPT0->TRGFTCR |= SRCSELx| BLKINVx|ALIGNMDx| CROSSMDx;
	GPT0->TRGFTWR |= G_OFFSET_DATA |(G_WINDOW_DATA<<16);
	
}
/*************************************************************/
//GPT Trigger Init
//EntryParameter:
//ReturnValue:NONE
/*************************************************************/
void GPT_EVTRG_Configure(GPT_TRGSRC0_TypeDef TRGSRC0x,GPT_TRGSRC1_TypeDef TRGSRC1x,GPT_ESYN0OE_TypeDef ESYN0OEx,GPT_ESYN1OE_TypeDef ESYN1OEx,
						GPT_CNT0INIT_TypeDef CNT0INITx,GPT_CNT1INIT_TypeDef CNT1INITx,U8_T TRGEV0prd,U8_T TRGEV1prd,U8_T TRGEV0cnt,U8_T TRGEV1cnt)
{
	GPT0->EVTRG |= TRGSRC0x |TRGSRC1x|ESYN0OEx|ESYN1OEx|CNT0INITx|CNT1INITx;
	GPT0->EVPS  |= TRGEV0prd|(TRGEV1prd<<4)|(TRGEV0cnt<<16)|(TRGEV1cnt<<20);
}
/*************************************************************/
//GPT OneceForce Out
//EntryParameter:
//ReturnValue:NONE
/*************************************************************/
void GPT_OneceForce_Out(GPT_CHAFORCE_TypeDef CHAFORCEX,U8_T AFORCE_STATUS,GPT_CHBFORCE_TypeDef CHBFORCEX,U8_T BFORCE_STATUS,GPT_FORCELD_TypeDef FORCELDX)
{
	GPT0->AQOSF =CHAFORCEX|CHBFORCEX|FORCELDX|(AFORCE_STATUS<<1)|(BFORCE_STATUS<<5);
}
/*************************************************************/
//GPT Continue Force Out
//EntryParameter:
//ReturnValue:NONE
/*************************************************************/
void GPT_Force_Out(GPT_FORCEA_TypeDef FORCEAX,GPT_FORCEB_TypeDef FORCEBX)
{
	GPT0->AQCSF =FORCEAX|FORCEBX;
}
/*************************************************************/
//GPT Wave Compare Load Init
//EntryParameter:
//ReturnValue:NONE
/*************************************************************/
void GPT_CmpLoad_Configure(GPT_SHDWCMPA_TypeDef SHDWCMPAX,GPT_SHDWCMPB_TypeDef SHDWCMPBX,GPT_LDAMD_TypeDef LDAMDX,GPT_LDBMD_TypeDef LDBMDX)
{
	GPT0->CMPLDR=SHDWCMPAX|SHDWCMPBX|LDAMDX|LDBMDX;
}
/*************************************************************/
//GPT DEBUG MODE
//EntryParameter:
//ReturnValue:NONE
/*************************************************************/
void GPT_Debug_Mode(FunctionalStatus NewState)
{
	if (NewState != DISABLE)
	{
		GPT0->CEDR  |= GPT_DEBUG_MODE;						
	}
	else
	{
		GPT0->CEDR  &= ~GPT_DEBUG_MODE;					
	}
}
/*************************************************************/
// GPT start
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/ 
void GPT_Start(void)
{
	GPT0->RSSR |= 0X01;
}
/*************************************************************/
// GPT stop
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/ 
void GPT_Stop(void)
{
	GPT0->RSSR &= 0XFFFFFFFE;
}
/*************************************************************/
// GPT soft reset
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/ 
void GPT_Soft_Reset(void)
{
	GPT0->RSSR |= (0X5<<12);
}
/*************************************************************/
// GPT Capture rearm
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/ 
void GPT_Cap_Rearm(void)
{
	GPT0->CR |= (0X01<<19);
}
/*************************************************************/
// GPT MODE
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/ 
void GPT_Mode_CMD(GPT_WAVE_TypeDef WAVEX)
{
	GPT0->CR |= WAVEX;
}
/*************************************************************/
// GPT soft reset at once sync mode
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/ 
void GPT_REARM_Write(void)
{
	GPT0->SYNCR |= (0X1<<16);
}
/*************************************************************/
// GPT soft read at once sync mode
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/ 
U8_T GPT_REARM_Read(void)
{
	uint8_t value = 0;
    uint32_t dat = 0;
    dat=(GPT0->SYNCR)&(1<<16);
    if (dat)								
	{
	    value = 1;
	} 
    return value;
}
/*************************************************************/
//GPT Period / Compare set
//EntryParameter:
//ReturnValue:NONE
/*************************************************************/
void GPT_Period_CMP_Write(U16_T PRDR_DATA,U16_T CMPA_DATA,U16_T CMPB_DATA)
{
	GPT0->PRDR =PRDR_DATA;
	GPT0->CMPA =CMPA_DATA;
	GPT0->CMPB =CMPB_DATA;
}
/*************************************************************/
//GPT read counters
//EntryParameter:
//ReturnValue:NONE
/*************************************************************/
U16_T GPT_PRDR_Read(void)
{
    return GPT0->PRDR;
}
U16_T GPT_CMPA_Read(void)
{
    return GPT0->CMPA;
}
U16_T GPT_CMPB_Read(void)
{
    return GPT0->CMPB;
}
U16_T GPT_CNT_Read(void)
{
    return GPT0->CNT;
}
/*************************************************************/
//GPT inturrpt Configure
//EntryParameter:LPT_IMSCR_X,NewState
//NewState:ENABLE,DISABLE
//ReturnValue:NONE
/*************************************************************/ 
void GPT_ConfigInterrupt_CMD(FunctionalStatus NewState,U32_T GPT_IMSCR_X)
{
	if (NewState != DISABLE)
	{
		GPT0->IMCR  |= GPT_IMSCR_X;						
	}
	else
	{
		GPT0->IMCR  &= ~GPT_IMSCR_X;					
	}
}

/*************************************************************/
//GPT Interrupt enable
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void GPT_INT_ENABLE(void)
{
	INTC_ISER_WRITE(GPT0_INT);
}
/*************************************************************/
//LPT Interrupt disable
//EntryParameter:NONE
//ReturnValue:NONE
/*************************************************************/
void GPT_INT_DISABLE(void)
{
	INTC_ICER_WRITE(GPT0_INT);
}

	