PeripheralDriver_Flagchip_F.../Src/module_driver_aontimer.c

245 lines
7.5 KiB
C

/**
* @file module_driver_aontimer.c
* @author Flagchip
* @brief aontimer driver type definition and API
* @version 2.0.0
* @date 2024-08-20
*
* SDK Version: 2.6.0
*
* @copyright Copyright (c) 2020-2024 Flagchip Semiconductors Co., Ltd.
*
* @details
*/
/********************************************************************************
* Revision History:
*
* Version Date Initials CR# Descriptions
* --------- ---------- ------------ ---------- ---------------
* 0.2.0 2023-2-7 Flagchip076 N/A First version for FC7300
* 2.0.0 2024-8-22 Flagchip120 N/A SDK_2.0
********************************************************************************/
#include "module_driver_aontimer.h"
#include "module_driver_csc.h"
#if AONTIMER_INSTANCE_COUNT > 0U
#ifndef AONTIMER_DEV_ERROR_REPORT
#define AONTIMER_DEV_ERROR_REPORT STD_OFF
#endif
#if AONTIMER_DEV_ERROR_REPORT == STD_ON
#define AONTIMER_ReportDevError(func, error) ReportDevError(AONTIMER_MODULE_ID, func, error)
#endif
/********* Local variable ************/
static AONTIMER_Type * const s_pAontimerBasePtrs[AONTIMER_INSTANCE_COUNT] = AONTIMER_BASE_PTRS;
/**
* @brief Initialize aontimer instance
*
* @param pAontimerHandle the Aontimer instance to use
* @param pInitStruct Aontimer Initialize structure
*/
void AONTIMER_Init(AONTIMER_HandleType* pAontimerHandle, const AONTIMER_InitType *const pInitStruct)
{
AONTIMER_Type * const pAontimer = s_pAontimerBasePtrs[pAontimerHandle->eInstance];
#if AONTIMER_DEV_ERROR_REPORT == STD_ON
uint32_t u32ClockFreq = 0U;
bool bCSC0ClockValid = CSC0_GetCSC0ClockFreq(CSC0_AON_CLK, &u32ClockFreq);
if ((uint32_t)pAontimerHandle->eInstance >= AONTIMER_INSTANCE_COUNT)
{
AONTIMER_ReportDevError(AONTIMER_INIT_ID, AONTIMER_E_PARAM_INSTANCE);
}
else if (NULL == pInitStruct)
{
AONTIMER_ReportDevError(AONTIMER_INIT_ID, AONTIMER_E_PARAM_POINTER);
}
else if (CSC_E_NOT_OK == bCSC0ClockValid)
{
AONTIMER_ReportDevError(AONTIMER_INIT_ID, AONTIMER_E_PARAM_CLOCK);
}
else if (0U == u32ClockFreq)
{
AONTIMER_ReportDevError(AONTIMER_INIT_ID, AONTIMER_E_PARAM_CLOCK);
}
else
{
#endif
/* Disable the Aontimer, and clear control register. */
AONTIMER_HWA_ConfigModule(pAontimer, (uint32_t)0U);
AONTIMER_HWA_ConfigModulePrescale(pAontimer, (uint32_t)0U);
#if AONTIMER_DEBUG_MODE_SUPPORT
AONTIMER->CSR |= AONTIMER_CSR_DBGEN(pInitStruct->eDbgMode);
#endif
if (AONTIMER_PULSE_MODE == pInitStruct->eMode)
{
AONTIMER_HWA_SelectClkSrcOnPulseMode(pAontimer, pInitStruct->ePulseClkSrc);
AONTIMER_HWA_ConfigModulePolarity(pAontimer, pInitStruct->ePulsePol);
AONTIMER_HWA_EnablePulseMode(pAontimer);
AONTIMER_HWA_SetPrescale(pAontimer, pInitStruct->u8PulseFilterWidth);
}
else
{
AONTIMER_HWA_SetPrescale(pAontimer, pInitStruct->u8Prescaler);
}
if (pInitStruct->bBypassEn)
{
AONTIMER_HWA_EnableBypassMode(pAontimer);
}
else
{
AONTIMER_HWA_DisableBypassMode(pAontimer);
}
AONTIMER_HWA_SetModuleRunOnDebug(pAontimer);
AONTIMER_HWA_SelectModuleClkSrc(pAontimer, pInitStruct->eClkSrc);
AONTIMER_HWA_SetModuleCompareValue(pAontimer, (uint32_t)pInitStruct->u16StartValue);
AONTIMER_HWA_DisableTimer(pAontimer);
if (pInitStruct->bIntEn)
{
AONTIMER_HWA_EnableModuleInterrupt(pAontimer);
pAontimerHandle->tSettings.pAontimerCallback = pInitStruct->pAontimerCallback;
}
else
{
AONTIMER_HWA_DisableModuleInterrupt(pAontimer);
pAontimerHandle->tSettings.pAontimerCallback = NULL;
}
#if AONTIMER_DEV_ERROR_REPORT == STD_ON
}
#endif
}
/**
* @brief De-initialize aontimer instance
*
* @param pAontimerHandle the Aontimer instance to use
*/
void AONTIMER_Deinit(AONTIMER_HandleType* pAontimerHandle)
{
AONTIMER_Type * const pAontimer = s_pAontimerBasePtrs[pAontimerHandle->eInstance];
#if AONTIMER_DEV_ERROR_REPORT == STD_ON
if ((uint32_t)pAontimerHandle->eInstance >= AONTIMER_INSTANCE_COUNT)
{
AONTIMER_ReportDevError(AONTIMER_INIT_ID, AONTIMER_E_PARAM_INSTANCE);
}
else
{
#endif
AONTIMER_HWA_ConfigModule(pAontimer, (uint32_t)0U);
AONTIMER_HWA_ConfigModulePrescale(pAontimer, (uint32_t)0U);
AONTIMER_HWA_SetModuleCompareValue(pAontimer, (uint32_t)0xFFFFFFFFU);
pAontimerHandle->tSettings.pAontimerCallback = NULL;
__NVIC_DisableIRQ(AONTIMER0_IRQn);
#if AONTIMER_DEV_ERROR_REPORT == STD_ON
}
#endif
}
/**
* @brief Start Aontimer
*
* @param pAontimerHandle the Aontimer instance to use
*/
void AONTIMER_StartTimer(AONTIMER_HandleType* pAontimerHandle)
{
AONTIMER_Type * const pAontimer = s_pAontimerBasePtrs[pAontimerHandle->eInstance];
#if AONTIMER_DEV_ERROR_REPORT == STD_ON
if ((uint32_t)pAontimerHandle->eInstance >= AONTIMER_INSTANCE_COUNT)
{
AONTIMER_ReportDevError(AONTIMER_INIT_ID, AONTIMER_E_PARAM_INSTANCE);
}
else
{
#endif
AONTIMER_HWA_EnableTimer(pAontimer);
#if AONTIMER_DEV_ERROR_REPORT == STD_ON
}
#endif
}
/**
* @brief Stop Aontimer
*
* @param pAontimerHandle the Aontimer instance to use
*/
void AONTIMER_StopTimer(AONTIMER_HandleType* pAontimerHandle)
{
AONTIMER_Type * const pAontimer = s_pAontimerBasePtrs[pAontimerHandle->eInstance];
#if AONTIMER_DEV_ERROR_REPORT == STD_ON
if ((uint32_t)pAontimerHandle->eInstance >= AONTIMER_INSTANCE_COUNT)
{
AONTIMER_ReportDevError(AONTIMER_INIT_ID, AONTIMER_E_PARAM_INSTANCE);
}
else
{
#endif
AONTIMER_HWA_DisableTimer(pAontimer);
#if AONTIMER_DEV_ERROR_REPORT == STD_ON
}
#endif
}
/**
* @brief Update value of aontimer counter
*
* @param pAontimerHandle the Aontimer instance to use
* @param u16StartValue input value, range : 0~65535
*/
void AONTIMER_UpdateCounterValue(AONTIMER_HandleType* pAontimerHandle, const uint16_t u16StartValue)
{
AONTIMER_Type * const pAontimer = s_pAontimerBasePtrs[pAontimerHandle->eInstance];
#if AONTIMER_DEV_ERROR_REPORT == STD_ON
if ((uint32_t)pAontimerHandle->eInstance >= AONTIMER_INSTANCE_COUNT)
{
AONTIMER_ReportDevError(AONTIMER_INIT_ID, AONTIMER_E_PARAM_INSTANCE);
}
else
{
#endif
if (0U == (AONTIMER->CSR & AONTIMER_CSR_TMS_MASK))
{
AONTIMER_HWA_DisableTimer(pAontimer);
AONTIMER_HWA_SetModuleCompareValue(pAontimer, (uint32_t)u16StartValue);
AONTIMER_HWA_EnableTimer(pAontimer);
}
#if AONTIMER_DEV_ERROR_REPORT == STD_ON
}
#endif
}
/**
* @brief Aontimer common interrupt handle function
*
* @param pAontimerHandle the Aontimer instance to use
*/
void Aontimer_CommonProcessInterrupt(AONTIMER_HandleType* pAontimerHandle)
{
AONTIMER_Type * const pAontimer = s_pAontimerBasePtrs[pAontimerHandle->eInstance];
#if AONTIMER_DEV_ERROR_REPORT == STD_ON
if ((uint32_t)pAontimerHandle->eInstance >= AONTIMER_INSTANCE_COUNT)
{
AONTIMER_ReportDevError(AONTIMER_INIT_ID, AONTIMER_E_PARAM_INSTANCE);
}
else
{
#endif
AONTIMER_HWA_DisableTimer(pAontimer);
if (NULL != pAontimerHandle->tSettings.pAontimerCallback)
{
pAontimerHandle->tSettings.pAontimerCallback(pAontimerHandle);
}
AONTIMER_HWA_EnableTimer(pAontimer);
#if AONTIMER_DEV_ERROR_REPORT == STD_ON
}
#endif
}
#endif