/**
|
******************************************************************************
|
* @file xl_pit.c
|
* @author Kirk ,xu.wang
|
* @version 4.5.2
|
* @date Fri Mar 26 17:29:12 2021
|
* @brief This file provide function about PIT firmware program
|
******************************************************************************
|
* @attention
|
*
|
* 2019 by Chipways Communications,Inc. All Rights Reserved.
|
* This software is supplied under the terms of a license
|
* agreement or non-disclosure agreement with Chipways.
|
* Passing on and copying of this document,and communication
|
* of its contents is not permitted without prior written
|
* authorization.
|
*
|
* <h2><center>© COPYRIGHT 2019 Chipways</center></h2>
|
******************************************************************************
|
*/
|
|
#if defined(__cplusplus)
|
extern "C" {
|
#endif /* __cplusplus */
|
|
/* Includes ---------------------------------------------------------------*/
|
#include "xl_pit.h"
|
|
/** @addtogroup XL6600_StdPeriph_Driver
|
* @{
|
*/
|
|
/** @defgroup PIT PIT Module
|
* @brief PIT Driver Modules Library
|
* @{
|
*/
|
|
/* Private typedef -----------------------------------------------------------*/
|
/* Private define ------------------------------------------------------------*/
|
#define PIT_CLEAR_MASK ((uint8_t)0x02)
|
/* Private macro -------------------------------------------------------------*/
|
/* Private variables ---------------------------------------------------------*/
|
/* Private function prototypes -----------------------------------------------*/
|
/* Private functions ---------------------------------------------------------*/
|
|
|
/** @defgroup PIT_Private_Functions
|
* @{
|
*/
|
|
/**
|
* @brief PITĬÈϳõʼ»¯
|
* @param None
|
* @retval None
|
*/
|
void PIT_DeInit(void)
|
{
|
/* Deinitializes to default reset values */
|
PIT->CHANNEL[0].CTR = 0x00;
|
PIT->CHANNEL[1].CTR = 0x00;
|
PIT->CHAIN=0x00;
|
}
|
|
/**
|
* @brief PTT³õʼ»¯
|
* @param Channel: PITͨµÀºÅ
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg PIT_Channel0: PITͨµÀ0
|
* @arg PIT_Channel1: PITͨµÀ1
|
* @param PIT_Mode: ģʽѡÔñ
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg PIT_Run_Mode: ×ÔÓÉÔËÐÐģʽ
|
* @arg PIT_Count_Mode: Óû§¶¨Ò弯Êýģʽ
|
* @param CLK_DIV: ʱÖÓ·ÖÆµ(0~65535)
|
* @retval None
|
*/
|
void PIT_Init(uint8_t Channel,uint8_t PIT_Mode,uint16_t CLK_DIV)
|
{
|
uint32_t tmpreg;
|
|
/*---------------------------- PIT CTR Configuration ------------------------*/
|
/* Get the PIT CTR value. */
|
tmpreg = PIT->CHANNEL[Channel].CTR ;
|
|
/* Clear MODE bit Value in CTR register.*/
|
tmpreg &= ~PIT_CLEAR_MASK;
|
|
/* Set the bit MODE in CTR Register. */
|
tmpreg |= (PIT_Mode);
|
|
//Aaron He add clock divider
|
PIT->PIT_DIV[Channel] = CLK_DIV;
|
|
/* Write to PIT CTR Register. */
|
PIT->CHANNEL[Channel].CTR = tmpreg ;
|
}
|
|
/**
|
* @brief PITʹÄÜ
|
* @param Channel: PITͨµÀºÅ
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg PIT_Channel0: PITͨµÀ0
|
* @arg PIT_Channel1: PITͨµÀ1
|
* @param NewState: ʹÄÜ״̬
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg ENABLE: PITʹÄÜ
|
* @arg DISABLE: PITʧÄÜ
|
* @retval None.
|
*/
|
void PIT_EnableCmd(uint8_t Channel,FunctionalState NewState)
|
{
|
if(NewState != DISABLE )
|
{
|
/* Enable PIT bits for PIT. */
|
PIT->CHANNEL[Channel].CTR |= PIT_CTR_EN_MASK;
|
}
|
else
|
{
|
/* Disable PIT bits for PIT. */
|
PIT->CHANNEL[Channel].CTR &= ~PIT_CTR_EN_MASK;
|
}
|
}
|
|
/**
|
* @brief PITÖжÏʹÄÜ
|
* @param Channel: PITͨµÀºÅ
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg PIT_Channel0: PITͨµÀ0
|
* @arg PIT_Channel1: PITͨµÀ1
|
* @param NewState: ʹÄÜ״̬
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg ENABLE: PITʹÄÜ
|
* @arg DISABLE: PITʧÄÜ
|
* @retval None.
|
*/
|
void PIT_InterruptEn(uint8_t Channel,FunctionalState NewState)
|
{
|
if(NewState != DISABLE )
|
{
|
/* ENABLE PIT interrupt for PIT. */
|
PIT->CHANNEL[Channel].CTR &= ~PIT_CTR_IM_MASK;
|
}
|
else
|
{
|
/* DISABLE PIT interrupt for PIT. */
|
PIT->CHANNEL[Channel].CTR |= PIT_CTR_IM_MASK;
|
}
|
}
|
|
/**
|
* @brief ΪPITÉèÖÃÐŵÀÄ£Öµ.
|
* @param Channel: PITͨµÀºÅ
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg PIT_Channel0: PITͨµÀ0
|
* @arg PIT_Channel1: PITͨµÀ1
|
* @param loadVal: ±»¼ÓÔØµ½PITÖеÄÖµ.
|
* @retval None.
|
*/
|
void PIT_SetLoadCount(uint8_t Channel,uint32_t loadVal)
|
{
|
/* Value to be load into PIT. */
|
PIT->CHANNEL[Channel].LC = loadVal ;
|
}
|
|
/**
|
* @brief µÃµ½PITµÄͨµÀµçÁ÷Öµ.
|
* @param Channel: PITͨµÀºÅ
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg PIT_Channel0: PITͨµÀ0
|
* @arg PIT_Channel1: PITͨµÀ1
|
* @retval current Value.·µ»ØµçÁ÷Öµ.
|
*/
|
uint32_t PIT_GetCurrentVal(uint8_t Channel)
|
{
|
uint32_t currentVal;
|
|
/* get the current Value. */
|
currentVal = PIT->CHANNEL[Channel].CV ;
|
|
/* return the value. */
|
return currentVal ;
|
}
|
|
/**
|
* @brief Çå³ýPITÖжÏ.
|
* @param Channel: PITͨµÀºÅ
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg PIT_Channel0: PITͨµÀ0
|
* @arg PIT_Channel1: PITͨµÀ1
|
* @retval None.
|
*/
|
void PIT_ClrInterrupt(uint8_t Channel)
|
{
|
/* clear the interrupt from PIT.*/
|
PIT->CHANNEL[Channel].EOI;
|
}
|
|
/**
|
* @brief ·µ»ØPITµÄÖжÏ״̬.
|
* @param Channel: PITͨµÀºÅ
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg PIT_Channel0: PITͨµÀ0
|
* @arg PIT_Channel1: PITͨµÀ1
|
* @retval interrupt status.·µ»ØÖжÏ״̬.
|
*/
|
ITStatus PIT_GetIntStatus(uint8_t Channel)
|
{
|
/* return interrupt status. */
|
return ((PIT->CHANNEL[Channel].IS & PIT_IS_IS_MASK) == PIT_IS_IS_MASK);
|
}
|
|
/**
|
* @brief »ñÈ¡PITµÄÖжÏ״̬.
|
* @retval ÖжÏ״̬
|
*/
|
uint8_t PIT_GetAllIntStatus(void)
|
{
|
/* return all interrupt status. */
|
return (uint8_t)(PIT->AIS & PIT_AIS_AIS_MASK);
|
}
|
|
/**
|
* @brief Çå³ýËùÓлÖеÄÖжÏ.
|
* @param None
|
* @retval None.
|
*/
|
void PIT_ClrAllInterrupt(void)
|
{
|
/* Dummy reading the register and clear all active interrupts. */
|
(void)(PIT->AEOI);
|
}
|
|
/**
|
* @brief »ñÈ¡ÎÞÆÁ±ÎÖжÏ״̬.
|
* @param None
|
* @retval ·µ»ØÎÞÆÁ±ÎÖжÏ״̬
|
*/
|
uint8_t PIT_GetRawIntStatus(void)
|
{
|
/* return unmasked interrupt status. */
|
return (uint8_t)(PIT->RAWIS & PIT_RAWIS_RAWIS_MASK);
|
}
|
|
|
/**
|
* @brief PIT ¶³½áģʽÆôÓûò½ûÓÃ.
|
* @param NewState: ʹÄÜ״̬
|
* Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ:
|
* @arg ENABLE: ¶³½áģʽʹÄÜ
|
* @arg DISABLE: ¶³½áģʽʧÄÜ
|
* @retval None.
|
*/
|
void PIT_FreezeCmd(FunctionalState NewState)
|
{
|
if(NewState != DISABLE )
|
{
|
/* Timers are stopped in debug mode . */
|
PIT->CHAIN |= PIT_DEBUG_FRZ_MASK;
|
}
|
else
|
{
|
/* Timers continue to run in debug mode . */
|
PIT->CHAIN &= ~PIT_DEBUG_FRZ_MASK;
|
}
|
}
|
|
/**
|
* @}
|
*/
|
|
/**
|
* @}
|
*/
|
|
/**
|
* @}
|
*/
|
|
#ifdef __cplusplus
|
}
|
#endif /* __cplusplus */
|