// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// File name    : PIT_drv.c
// Version      : V0.1
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#include "debug.h"
#include "PIT_drv.h"

/*******************************************************************************
* Function Name  : PIT_IRQHandler
* Description    : PIT interrupt hanfler
* Input          : None
*
* Output         : None
* Return         : None
******************************************************************************/

void PIT1_IRQHandler(void)
{
	if (PIT1->PCSR & PCSR_PIF)// pit
	{
		PIT1->PCSR |= PIT_PIF;
		
		// Put user code here 
		printf("PIT1 IRQ Handler\r\n");
	}
}

void PIT2_IRQHandler(void)
{
	if (PIT2->PCSR & PCSR_PIF)//pit
	{
		PIT2->PCSR |= PIT_PIF;
		
		// Put user code here
		printf("PIT2 IRQ Handler\r\n");		
	}
}

/******************************************************************************
* Function Name  : PIT_Init
* Description    : PIT initialization
* Input          : - Prescaler PIT divider
*                  - ReloadCounterVal:PIT initialize value
*
* Output         : None
* Return         : None
******************************************************************************/
void PIT_Init(PIT_TypeDef *PITx,PIT_CLKDIV Prescaler, UINT32 reloadCounterVal,bool intEnable)
{
	PITx->PCSR &= (~PCSR_EN);
	if (PITx==PIT1) NVIC_Init(3, 3, PIT1_IRQn, 2); 
	else NVIC_Init(3, 3, PIT2_IRQn, 2);
	
	if(intEnable == TRUE)
		PITx->PCSR = (Prescaler<<8)|PCSR_OVW|PCSR_PIE|PCSR_RLD|PCSR_PDBG; //中断模式
	else
		PITx->PCSR = (Prescaler<<8)|PCSR_OVW|PCSR_RLD;    //普通模式

	PITx->PMR = reloadCounterVal;
	PITx->PCSR |= PCSR_EN;
}

/******************************************************************************
* Function Name  : PIT_Enable
* Description    : Enable or disable PIT
* Input          : - *PITx: PIT port (PIT1 or PIT2)
*                  - state: 0: Disable, 1: Enable
*
* Output         : None
* Return         : None
******************************************************************************/
void PIT_Enable(PIT_TypeDef *PITx, bool state)
{
	if (state==TRUE) PITx->PCSR |= PCSR_EN;
	else PITx->PCSR &=~PCSR_EN;
}


/*******************************************************************************
* Function Name  : PIT_IntEnable
* Description    : Enable or disable PIT interrupt function
* Input          : - *PITx: PIT port (PIT1 or PIT2)
* Input          : - Enable or disable PIT interrupt
*
* Output         : None
* Return         : None
******************************************************************************/
void PIT_IntEnable(PIT_TypeDef *PITx,bool state)
{
	if (state==TRUE) PITx->PCSR |= PCSR_PIE; 
	else PITx->PCSR &= ~PCSR_PIE; 
}

/*******************************************************************************
* Function Name  : PIT_ReadCounterValue
* Description    : Read PIT counter value
* Input          : *PITx: PIT port (PIT1 or PIT2)
*
* Output         : None
* Return         : Counter value
******************************************************************************/
UINT32 PIT_ReadCounter(PIT_TypeDef *PITx)
{
	return PITx->PCNTR;
}

void PIT_WriteCounter(PIT_TypeDef *PITx, u32 value)
{
	PITx->PCSR &= ~(PCSR_EN|PCSR_OVW|PCSR_RLD);
	PITx->PMR  = value;
	PITx->PCSR |= (PCSR_OVW|PCSR_RLD);
	PITx->PCSR |= PCSR_EN;
}
