518 lines
24 KiB
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) */
|