PeripheralDriver_Flagchip_F.../Src/module_driver_eftu_tim.c

518 lines
24 KiB
C

/**
* @file eftu_driver_tim.h
* @author Flagchip
* @brief FC7xxx eFTU TBU driver access layer
* @version 2.0.0
* @date
*
* SDK Version: 2.6.0
*
* @copyright Copyright (c) 2024 Flagchip Semiconductors Co., Ltd.
*
* @details
*/
#include "module_driver_eftu_tim.h"
#if defined(EFTU_INSTANCE_COUNT) && (EFTU_INSTANCE_COUNT > 0)
static EFTU_TIM_Type *const s_pEftuTimBasePtrs[EFTU_INSTANCE_COUNT] = EFTU_TIM_ADDRESS_TAB;
#ifndef TIM_DEV_ERROR_REPORT
#define TIM_DEV_ERROR_REPORT STD_ON
#endif
#if TIM_DEV_ERROR_REPORT == STD_ON
#define TIM_ReportDevError(func, error) ReportDevError(EFTU_TIM_MODULE_ID, func, error)
#endif
/**
* @brief Config Tim edge detect function
* @param pTimHandle Tim processing handle
* @param pInitStruct Tim Signal Detect InitStruct
*/
void EFTU_Tim_EdgeDetectChannelInit(EFTU_TIM_HandleType *pTimHandle, const EFTU_TimSignalDetectConfigStruct *pInitStruct)
{
EFTU_TIM_Type *pTim = s_pEftuTimBasePtrs[pTimHandle->eInstance];
#if TIM_DEV_ERROR_REPORT == STD_ON
if (EFTU_TIM_CH_7 < pInitStruct->eChannelIndex)
{
TIM_ReportDevError(EFTU_TIM_DETECT_ID, EFTU_TIM_E_PARAM_CHANNEL);
}
else
#endif
{
/*FLT config*/
if (pInitStruct->tFilterConfig.bEnFilter == TRUE)
{
EFTU_TIM_HWA_EnableFlt(pTim, (uint8_t)pInitStruct->eChannelIndex); /*enable Flt*/
EFTU_TIM_HWA_SetChFltSrc(pTim, pInitStruct->tFilterConfig.eFliterClock, (uint8_t)pInitStruct->eChannelIndex);
/*rise edge*/
switch (pInitStruct->tFilterConfig.eRisingEdgeMode)
{
case EFTU_TIM_FILTERMODE_IMMEDIATEEDGEPROPAGATION:
{
EFTU_TIM_HWA_DisableChFltRe(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_DisableChFltReCounter(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_DisableChFltReExbit(pTim, (uint8_t)pInitStruct->eChannelIndex);
break;
}
case EFTU_TIM_FILTERMODE_INDIVIDUALDEGLITCHTIMEUPDOWN:
{
EFTU_TIM_HWA_EnableChFltRe(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_DisableChFltReCounter(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_DisableChFltReExbit(pTim, (uint8_t)pInitStruct->eChannelIndex);
break;
}
case EFTU_TIM_FILTERMODE_INDIVIDUALDEGLITCHTIMEHOLD:
{
EFTU_TIM_HWA_EnableChFltRe(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_EnableChFltReCounter(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_DisableChFltReExbit(pTim, (uint8_t)pInitStruct->eChannelIndex);
break;
}
case EFTU_TIM_FILTERMODE_RESETCOUNTR:
{
EFTU_TIM_HWA_EnableChFltRe(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_DisableChFltReCounter(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_EnableChFltReExbit(pTim, (uint8_t)pInitStruct->eChannelIndex);
break;
}
default:
break;
}
/*fall edge*/
switch (pInitStruct->tFilterConfig.eFallingEdgeMode)
{
case EFTU_TIM_FILTERMODE_IMMEDIATEEDGEPROPAGATION:
{
EFTU_TIM_HWA_DisableChFltFe(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_DisableChFltFeCounter(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_DisableChFltFeExbit(pTim, (uint8_t)pInitStruct->eChannelIndex);
break;
}
case EFTU_TIM_FILTERMODE_INDIVIDUALDEGLITCHTIMEUPDOWN:
{
EFTU_TIM_HWA_EnableChFltFe(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_DisableChFltFeCounter(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_DisableChFltFeExbit(pTim, (uint8_t)pInitStruct->eChannelIndex);
break;
}
case EFTU_TIM_FILTERMODE_INDIVIDUALDEGLITCHTIMEHOLD:
{
EFTU_TIM_HWA_EnableChFltFe(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_EnableChFltFeCounter(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_DisableChFltFeExbit(pTim, (uint8_t)pInitStruct->eChannelIndex);
break;
}
case EFTU_TIM_FILTERMODE_RESETCOUNTR:
{
EFTU_TIM_HWA_EnableChFltFe(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_DisableChFltFeCounter(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_EnableChFltFeExbit(pTim, (uint8_t)pInitStruct->eChannelIndex);
break;
}
}
EFTU_TIM_HWA_SetChFltReValue(pTim, pInitStruct->tFilterConfig.u8RisingEdgeFilterTime, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_SetChFltFeValue(pTim, pInitStruct->tFilterConfig.u8FallingEdgeFilterTime, (uint8_t)pInitStruct->eChannelIndex);
if (TRUE == pInitStruct->tFilterConfig.bIrqOnGlitch)
{
EFTU_TIM_HWA_EnIrq(pTim, EFTU_TIM_IRQ_GLITCHDET, (uint8_t)pInitStruct->eChannelIndex);
}
}
/*Timeout configuration*/
EFTU_TIM_HWA_SetTimeoutEdge(pTim, pInitStruct->tTimeouConfig.eTimeOutSensitiveEgde, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_SetTduClk(pTim, pInitStruct->tTimeouConfig.eTimeOutClkSrc, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TOM_HWA_SetimeoutValue(pTim, pInitStruct->tTimeouConfig.u32Timeout, (uint8_t)pInitStruct->eChannelIndex);
if (TRUE == pInitStruct->tTimeouConfig.bIrqOnTimeout)
{
EFTU_TIM_HWA_EnIrq(pTim, EFTU_TIM_IRQ_TODET, (uint8_t)pInitStruct->eChannelIndex);
}
/*F_IN() config*/
switch (pInitStruct->eInputSrc)
{
case EFTU_TIM_INPUT_TIM_IN_X:
{
EFTU_TIM_HWA_ConfigLut(pTim, EFTU_TIM_LUT_DISABLE, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_ClearVal(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_ClearAuxMode(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_ClearchCicrl(pTim, (uint8_t)pInitStruct->eChannelIndex);
break;
}
case EFTU_TIM_INPUT_TIM_IN_X_1:
{
EFTU_TIM_HWA_ConfigLut(pTim, EFTU_TIM_LUT_DISABLE, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_ClearVal(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_ClearAuxMode(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_SetchCicrl(pTim, (uint8_t)pInitStruct->eChannelIndex);
break;
}
case EFTU_TIM_INPUT_TIM_IN_AUX_IN:
{
EFTU_TIM_HWA_ConfigLut(pTim, EFTU_TIM_LUT_DISABLE, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_SetVal(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_ClearAuxMode(pTim, (uint8_t)pInitStruct->eChannelIndex);
break;
}
default:
break;
}
/*Tim channel configuration*/
EFTU_TIM_HWA_SetChannelMode(pTim, EFTU_TIM_MODE_INPUTEVENT, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_SetChannelClockSrc(pTim, pInitStruct->eTimClockSrc, (uint8_t)pInitStruct->eChannelIndex);
if (pInitStruct->bIrqOnNewVal == TRUE)
{
EFTU_TIM_HWA_EnIrq(pTim, EFTU_TIM_IRQ_NEWVAL, (uint8_t)pInitStruct->eChannelIndex);
}
if (pInitStruct->bIrqOnCntOveflow == TRUE)
{
EFTU_TIM_HWA_EnIrq(pTim, EFTU_TIM_IRQ_CNTOFL, (uint8_t)pInitStruct->eChannelIndex);
}
if (pInitStruct->bIrqOnECntOveflow == TRUE)
{
EFTU_TIM_HWA_EnIrq(pTim, EFTU_TIM_IRQ_ECNTOFL, (uint8_t)pInitStruct->eChannelIndex);
}
if (pInitStruct->bIrqOnGprDataOverflow == TRUE)
{
EFTU_TIM_HWA_EnIrq(pTim, EFTU_TIM_IRQ_GPR0OFL, (uint8_t)pInitStruct->eChannelIndex);
}
if (TRUE == pInitStruct->bExtCapEn)
{
EFTU_TIM_HWA_EnableExtCapture(pTim, pInitStruct->bExtCapEn, (uint8_t)pInitStruct->eChannelIndex);
}
if (EFTU_TIM_ACTIVE_BOTHEDGE == pInitStruct->eActiveEdge)
{
EFTU_TIM_HWA_EnIngnoreEdge(pTim, TRUE, (uint8_t)pInitStruct->eChannelIndex);
}
else
{
EFTU_TIM_HWA_ConfigActiveEdge(pTim, pInitStruct->eActiveEdge, (uint8_t)pInitStruct->eChannelIndex);
}
/*Update Global Status*/
pTimHandle->pTim = pTim;
pTimHandle->tTimChnStatus[pInitStruct->eChannelIndex].pTimChannelIrqCallback = pInitStruct->pTimChannelIrqCallback;
}
}
/**
* @brief Config Tim signal measurement function
* @param pTimHandle Tim processing handle
* @param pInitStruct Tim Signal measurement InitStruct
*/
void EFTU_Tim_PwmMeasurementInit(EFTU_TIM_HandleType *pTimHandle, const EFTU_TimSignalMeasurementConfigStruct *pInitStruct)
{
EFTU_TIM_Type *pTim = s_pEftuTimBasePtrs[pTimHandle->eInstance];
#if TIM_DEV_ERROR_REPORT == STD_ON
if (EFTU_TIM_ACTIVE_BOTHEDGE == pInitStruct->eActiveEdge)
{
TIM_ReportDevError(EFTU_TIM_PWM_MEASUREMENT_ID, EFTU_TIM_E_PARAM_INVALID_EDGE);
}
else if (EFTU_TIM_CH_7 < pInitStruct->eChannelIndex)
{
TIM_ReportDevError(EFTU_TIM_PWM_MEASUREMENT_ID, EFTU_TIM_E_PARAM_CHANNEL);
}
else
#endif
{
/*FLT config*/
if (pInitStruct->tFilterConfig.bEnFilter == TRUE)
{
EFTU_TIM_HWA_EnableFlt(pTim, (uint8_t)pInitStruct->eChannelIndex); /*enable Flt*/
EFTU_TIM_HWA_SetChFltSrc(pTim, pInitStruct->tFilterConfig.eFliterClock, (uint8_t)pInitStruct->eChannelIndex);
/*rise edge*/
switch (pInitStruct->tFilterConfig.eRisingEdgeMode)
{
case EFTU_TIM_FILTERMODE_IMMEDIATEEDGEPROPAGATION:
{
EFTU_TIM_HWA_DisableChFltRe(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_DisableChFltReCounter(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_DisableChFltReExbit(pTim, (uint8_t)pInitStruct->eChannelIndex);
break;
}
case EFTU_TIM_FILTERMODE_INDIVIDUALDEGLITCHTIMEUPDOWN:
{
EFTU_TIM_HWA_EnableChFltRe(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_DisableChFltReCounter(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_DisableChFltReExbit(pTim, (uint8_t)pInitStruct->eChannelIndex);
break;
}
case EFTU_TIM_FILTERMODE_INDIVIDUALDEGLITCHTIMEHOLD:
{
EFTU_TIM_HWA_EnableChFltRe(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_EnableChFltReCounter(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_DisableChFltReExbit(pTim, (uint8_t)pInitStruct->eChannelIndex);
break;
}
case EFTU_TIM_FILTERMODE_RESETCOUNTR:
{
EFTU_TIM_HWA_EnableChFltRe(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_DisableChFltReCounter(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_EnableChFltReExbit(pTim, (uint8_t)pInitStruct->eChannelIndex);
break;
}
default:
break;
}
/*fall edge*/
switch (pInitStruct->tFilterConfig.eFallingEdgeMode)
{
case EFTU_TIM_FILTERMODE_IMMEDIATEEDGEPROPAGATION:
{
EFTU_TIM_HWA_DisableChFltFe(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_DisableChFltFeCounter(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_DisableChFltFeExbit(pTim, (uint8_t)pInitStruct->eChannelIndex);
break;
}
case EFTU_TIM_FILTERMODE_INDIVIDUALDEGLITCHTIMEUPDOWN:
{
EFTU_TIM_HWA_EnableChFltFe(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_DisableChFltFeCounter(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_DisableChFltFeExbit(pTim, (uint8_t)pInitStruct->eChannelIndex);
break;
}
case EFTU_TIM_FILTERMODE_INDIVIDUALDEGLITCHTIMEHOLD:
{
EFTU_TIM_HWA_EnableChFltFe(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_EnableChFltFeCounter(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_DisableChFltFeExbit(pTim, (uint8_t)pInitStruct->eChannelIndex);
break;
}
case EFTU_TIM_FILTERMODE_RESETCOUNTR:
{
EFTU_TIM_HWA_EnableChFltFe(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_DisableChFltFeCounter(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_EnableChFltFeExbit(pTim, (uint8_t)pInitStruct->eChannelIndex);
break;
}
}
EFTU_TIM_HWA_SetChFltReValue(pTim, pInitStruct->tFilterConfig.u8RisingEdgeFilterTime, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_SetChFltFeValue(pTim, pInitStruct->tFilterConfig.u8FallingEdgeFilterTime, (uint8_t)pInitStruct->eChannelIndex);
if (TRUE == pInitStruct->tFilterConfig.bIrqOnGlitch)
{
EFTU_TIM_HWA_EnIrq(pTim, EFTU_TIM_IRQ_GLITCHDET, (uint8_t)pInitStruct->eChannelIndex);
}
}
/*Timeout configuration*/
EFTU_TIM_HWA_SetTimeoutEdge(pTim, pInitStruct->tTimeouConfig.eTimeOutSensitiveEgde, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_SetTduClk(pTim, pInitStruct->tTimeouConfig.eTimeOutClkSrc, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TOM_HWA_SetimeoutValue(pTim, pInitStruct->tTimeouConfig.u32Timeout, (uint8_t)pInitStruct->eChannelIndex);
if (TRUE == pInitStruct->tTimeouConfig.bIrqOnTimeout)
{
EFTU_TIM_HWA_EnIrq(pTim, EFTU_TIM_IRQ_TODET, (uint8_t)pInitStruct->eChannelIndex);
}
/*F_IN() config*/
switch (pInitStruct->eInputSrc)
{
case EFTU_TIM_INPUT_TIM_IN_X:
{
EFTU_TIM_HWA_ConfigLut(pTim, EFTU_TIM_LUT_DISABLE, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_ClearVal(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_ClearAuxMode(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_ClearchCicrl(pTim, (uint8_t)pInitStruct->eChannelIndex);
break;
}
case EFTU_TIM_INPUT_TIM_IN_X_1:
{
EFTU_TIM_HWA_ConfigLut(pTim, EFTU_TIM_LUT_DISABLE, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_ClearVal(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_ClearAuxMode(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_SetchCicrl(pTim, (uint8_t)pInitStruct->eChannelIndex);
break;
}
case EFTU_TIM_INPUT_TIM_IN_AUX_IN:
{
EFTU_TIM_HWA_UnLock(pTim);
EFTU_TIM_HWA_ConfigLut(pTim, EFTU_TIM_LUT_DISABLE, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_SetVal(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_ClearAuxMode(pTim, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_Lock(pTim);
break;
}
default:
break;
}
/*Tim channel configuration*/
EFTU_TIM_HWA_SetChannelMode(pTim, EFTU_TIM_MODE_PWMMEASUREMENT, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_SetTbu0BitFiled(pTim, pInitStruct->eTimTbs0align, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_SetChannelClockSrc(pTim, pInitStruct->eTimClockSrc, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_SetCntsSel(pTim, EFTU_TIM_CNTS_CNT, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_SetGPR0Sel(pTim, EFTU_TIM_GPTSEL_CNTS_OR_CNT, (uint8_t)pInitStruct->eChannelIndex);
EFTU_TIM_HWA_SetGPR1Sel(pTim, EFTU_TIM_GPTSEL_CNTS_OR_CNT, (uint8_t)pInitStruct->eChannelIndex);
if (pInitStruct->bIrqOnNewVal == TRUE)
{
EFTU_TIM_HWA_EnIrq(pTim, EFTU_TIM_IRQ_NEWVAL, (uint8_t)pInitStruct->eChannelIndex);
}
if (pInitStruct->bIrqOnCntOveflow == TRUE)
{
EFTU_TIM_HWA_EnIrq(pTim, EFTU_TIM_IRQ_CNTOFL, (uint8_t)pInitStruct->eChannelIndex);
}
if (pInitStruct->bIrqOnECntOveflow == TRUE)
{
EFTU_TIM_HWA_EnIrq(pTim, EFTU_TIM_IRQ_ECNTOFL, (uint8_t)pInitStruct->eChannelIndex);
}
if (pInitStruct->bIrqOnGprDataOverflow == TRUE)
{
EFTU_TIM_HWA_EnIrq(pTim, EFTU_TIM_IRQ_GPR0OFL, (uint8_t)pInitStruct->eChannelIndex);
}
if (TRUE == pInitStruct->bExtCapEn)
{
EFTU_TIM_HWA_EnableExtCapture(pTim, pInitStruct->bExtCapEn, (uint8_t)pInitStruct->eChannelIndex);
}
EFTU_TIM_HWA_ConfigActiveEdge(pTim, pInitStruct->eActiveEdge, (uint8_t)pInitStruct->eChannelIndex);
/*Update Global Status*/
pTimHandle->pTim = pTim;
pTimHandle->tTimChnStatus[pInitStruct->eChannelIndex].pTimChannelIrqCallback = pInitStruct->pTimChannelIrqCallback;
}
}
/**
* @brief Enable Tim channel function
* @param pTimHandle Tim processing handle
* @param eChannelIndex Tim channel Index
*/
void EFTU_Tim_EnableChannel(EFTU_TIM_HandleType *pTimHandle, const EFTU_TIM_ChannelIndex eChannelIndex)
{
EFTU_TIM_Type *pTim = s_pEftuTimBasePtrs[pTimHandle->eInstance];
EFTU_TIM_HWA_EnableChannel(pTim, (uint8_t)eChannelIndex);
}
/**
* @brief Disable Tim channel function
* @param pTimHandle Tim processing handle
* @param eChannelIndex Tim channel Index
*/
void EFTU_Tim_DisableChannel(EFTU_TIM_HandleType *pTimHandle, const EFTU_TIM_ChannelIndex eChannelIndex)
{
EFTU_TIM_Type *pTim = s_pEftuTimBasePtrs[pTimHandle->eInstance];
EFTU_TIM_HWA_DisableChannel(pTim, (uint8_t)eChannelIndex);
}
/**
* @brief Update Tim channel capture value.
* @param pTimHandle Tim processing handle
* @param eChannelIndex Tim channel Index
*/
void EFTU_TimUpdateNewValue(EFTU_TIM_HandleType *pTimHandle, const EFTU_TIM_ChannelIndex eChannelIndex)
{
EFTU_TIM_Type *pTim = s_pEftuTimBasePtrs[pTimHandle->eInstance];
pTimHandle->tTimChnStatus[eChannelIndex].bNewDataIrqStatus = FALSE;
pTimHandle->tTimChnStatus[eChannelIndex].bNewDataIrqStatus = EFTU_TIM_HWA_GetTimeOutEvent(pTim, eChannelIndex);
if (pTimHandle->tTimChnStatus[eChannelIndex].bNewDataIrqStatus == TRUE)
{
pTimHandle->tTimChnStatus[eChannelIndex].u32CntsValue = EFTU_TIM_HWA_GetCntsCnt(pTim, eChannelIndex);
pTimHandle->tTimChnStatus[eChannelIndex].u32CntValue = EFTU_TIM_HWA_GetChCnt(pTim, eChannelIndex);
pTimHandle->tTimChnStatus[eChannelIndex].u32Gpr0Value = EFTU_TIM_HWA_GetChGPR0(pTim, eChannelIndex);
pTimHandle->tTimChnStatus[eChannelIndex].u32Gpr1Value = EFTU_TIM_HWA_GetChGPR1(pTim, eChannelIndex);
pTimHandle->tTimChnStatus[eChannelIndex].u32DataCoherentStatus = EFTU_TIM_HWA_GetChGPR0Ecnt(pTim, eChannelIndex);
EFTU_TIM_HWA_ClearNewValFlag(pTim, eChannelIndex);
}
}
/**
* @brief Tim Interrupt process.
* @param pTimHandle Tim processing handle
* @param u8StartChannelIndex Tim Irq start channel Index
*/
void EFTU_TIM_IrqHandler(EFTU_TIM_HandleType *pTimHandle, uint8_t u8StartChannelIndex)
{
EFTU_TIM_Type *pTim = s_pEftuTimBasePtrs[pTimHandle->eInstance];
for (uint8_t u8ChannelIndex = u8StartChannelIndex; u8ChannelIndex < u8StartChannelIndex + 4U; u8ChannelIndex++)
{
bool bIntFlag = FALSE;
pTimHandle->tTimChnStatus[u8ChannelIndex].bGlitchIrqStatus = FALSE;
pTimHandle->tTimChnStatus[u8ChannelIndex].bEcntOverflowIrqStatus = FALSE;
pTimHandle->tTimChnStatus[u8ChannelIndex].bGprOverflowIrqStatus = FALSE;
pTimHandle->tTimChnStatus[u8ChannelIndex].bTimeOutIrqStatus = FALSE;
pTimHandle->tTimChnStatus[u8ChannelIndex].bOverflowCntIrqStatus = FALSE;
pTimHandle->tTimChnStatus[u8ChannelIndex].bNewDataIrqStatus = FALSE;
if ((EFTU_TIM_HWA_GetGlitchEvent(pTim, u8ChannelIndex)) && (EFTU_TIM_HWA_GetGlitchIrqEnable(pTim, u8ChannelIndex)))
{
pTimHandle->tTimChnStatus[u8ChannelIndex].bGlitchIrqStatus = TRUE;
EFTU_TIM_HWA_ClearGlitchFlag(pTim, u8ChannelIndex);
bIntFlag = TRUE;
}
if ((EFTU_TIM_HWA_GetEcntEvent(pTim, u8ChannelIndex)) && (EFTU_TIM_HWA_GetEcntIrqEnable(pTim, u8ChannelIndex)))
{
pTimHandle->tTimChnStatus[u8ChannelIndex].bEcntOverflowIrqStatus = TRUE;
EFTU_TIM_HWA_ClearEcntFlag(pTim, u8ChannelIndex);
bIntFlag = TRUE;
}
if ((EFTU_TIM_HWA_GetGprOverflowEvent(pTim, u8ChannelIndex)) && (EFTU_TIM_HWA_GetGprOverflowIrqEnable(pTim, u8ChannelIndex)))
{
pTimHandle->tTimChnStatus[u8ChannelIndex].bGprOverflowIrqStatus = TRUE;
EFTU_TIM_HWA_ClearGprOverflowFlag(pTim, u8ChannelIndex);
bIntFlag = TRUE;
}
if ((EFTU_TIM_HWA_GetTimeOutEvent(pTim, u8ChannelIndex)) && (EFTU_TIM_HWA_GetTimeOutIrqEnable(pTim, u8ChannelIndex)))
{
pTimHandle->tTimChnStatus[u8ChannelIndex].bTimeOutIrqStatus = TRUE;
EFTU_TIM_HWA_ClearTimeOutFlag(pTim, u8ChannelIndex);
bIntFlag = TRUE;
}
if ((EFTU_TIM_HWA_GetCntOverflowEvent(pTim, u8ChannelIndex)) && (EFTU_TIM_HWA_GetCntOverflowIrqEnable(pTim, u8ChannelIndex)))
{
pTimHandle->tTimChnStatus[u8ChannelIndex].bOverflowCntIrqStatus = TRUE;
EFTU_TIM_HWA_ClearCntOverflowFlag(pTim, u8ChannelIndex);
bIntFlag = TRUE;
}
/*Update Data*/
if ((EFTU_TIM_HWA_GetNewValEvent(pTim, u8ChannelIndex)) && (EFTU_TIM_HWA_GetNewValIrqEnable(pTim, u8ChannelIndex)))
{
pTimHandle->tTimChnStatus[u8ChannelIndex].bNewDataIrqStatus = TRUE;
EFTU_TIM_HWA_ClearNewValFlag(pTim, u8ChannelIndex);
bIntFlag = TRUE;
pTimHandle->tTimChnStatus[u8ChannelIndex].u32CntsValue = EFTU_TIM_HWA_GetCntsCnt(pTim, u8ChannelIndex);
pTimHandle->tTimChnStatus[u8ChannelIndex].u32CntValue = EFTU_TIM_HWA_GetChCnt(pTim, u8ChannelIndex);
pTimHandle->tTimChnStatus[u8ChannelIndex].u32Gpr0Value = EFTU_TIM_HWA_GetChGPR0(pTim, u8ChannelIndex);
pTimHandle->tTimChnStatus[u8ChannelIndex].u32Gpr1Value = EFTU_TIM_HWA_GetChGPR1(pTim, u8ChannelIndex);
pTimHandle->tTimChnStatus[u8ChannelIndex].u32DataCoherentStatus = EFTU_TIM_HWA_GetChGPR0Ecnt(pTim, u8ChannelIndex);
}
/*Call Notification Callback*/
if ((bIntFlag == TRUE) && (pTimHandle->tTimChnStatus[u8ChannelIndex].pTimChannelIrqCallback != NULL))
{
pTimHandle->tTimChnStatus[u8ChannelIndex].pTimChannelIrqCallback(pTimHandle, u8ChannelIndex);
}
}
}
#endif /* defined(EFTU_INSTANCE_COUNT) && (EFTU_INSTANCE_COUNT > 0) */