// // Created by cfif on 07.09.22. // #include #include "PwmCaptureFlagchip.h" #include "PwmFlagchip.h" void Get_Set_Tpu_PwmCaptureCallback(tPwmCaptureFlagchip *env) { if (env->etpu_captureconfig_tbl.eMeasureMode == TPU_PeriodMeasurement) { TPU_CaptureMeasPeriodServiceReq(env->TPU_CAPTURE_CHANNEL, &env->etpu_captureconfig_tbl); } else { TPU_CaptureMeasActivePeriodServiceReq(env->TPU_CAPTURE_CHANNEL, &env->etpu_captureconfig_tbl); } tPwmCaptureData data; data.ActiveTime = env->etpu_captureconfig_tbl.u32ActiveTime; data.PeriodTime = env->etpu_captureconfig_tbl.u32PeriodTime; osMessageQueuePut(env->q_u32PeriodActiveTime, &data, 0, 0); } void PWM_Capture_Initial( tPwmCaptureFlagchip *env, bool isDeInit, uint8_t TPU_CAPTURE_CHANNEL, uint8 TPU_PRIORITY, TPU_EventCallbackType Bsp_Tpu_PwmCallback, TPU_TCR1OverflowCallbackType Bsp_Tpu_OverflowCallBack) { env->q_u32PeriodActiveTime = osMessageQueueNew(1, sizeof(tPwmCaptureData), NULL); env->etpu_captureconfig_tbl.u32PeriodTime = 0u; env->etpu_captureconfig_tbl.eMeasureMode = TPU_DutyMeasurementActiveHigh; env->etpu_captureconfig_tbl.eInputType = TPUE_DETECT_FALLING_EDGE_ONLY; env->etpu_captureconfig_tbl.u32SampleTime = PERIOD_TICKS * 4;//80000; // Ensure sample time > period env->etpu_captureconfig_tbl.u32ActiveTime = 0; env->etpu_captureconfig_tbl.LastTime = 0; env->etpu_captureconfig_tbl.StartTime = 0; env->etpu_Int_config_tbl.bEventIntEn = (bool) true; env->etpu_Int_config_tbl.bTCR1OverFlowEventIntEn = (bool) true; env->etpu_Int_config_tbl.bTCR2OverFlowEventIntEn = (bool) false; env->etpu_Int_config_tbl.pEventNotify = Bsp_Tpu_PwmCallback; env->etpu_Int_config_tbl.pHSANotify = NULL; env->etpu_Int_config_tbl.pTCR1OverflowNotify = Bsp_Tpu_OverflowCallBack; env->etpu_Int_config_tbl.pTCR2OverflowNotify = NULL; env->etpu_Int_config_tbl.eChTrigType = TPUH_TDL1_OR_TDL2_EVENT_NOT_GATED_BY_TSR; env->TPU_CAPTURE_CHANNEL = TPU_CAPTURE_CHANNEL; if (isDeInit) { TPU_DeInit(); } TPU_Init(); TPU_CaptureModeInit(TPU_CAPTURE_CHANNEL, &env->etpu_captureconfig_tbl); TPU_InitChannelInterrupt(TPU_CAPTURE_CHANNEL, &env->etpu_Int_config_tbl); if (TPU_CAPTURE_CHANNEL <= 7) { NVIC_SetPriority(TPU0_CH0_7_IRQn, TPU_PRIORITY); NVIC_EnableIRQ(TPU0_CH0_7_IRQn); } else if (TPU_CAPTURE_CHANNEL <= 15) { NVIC_SetPriority(TPU0_CH8_15_IRQn, TPU_PRIORITY); NVIC_EnableIRQ(TPU0_CH8_15_IRQn); } else if (TPU_CAPTURE_CHANNEL <= 23) { NVIC_SetPriority(TPU0_CH16_23_IRQn, TPU_PRIORITY); NVIC_EnableIRQ(TPU0_CH16_23_IRQn); } else if (TPU_CAPTURE_CHANNEL <= 31) { NVIC_SetPriority(TPU0_CH24_31_IRQn, TPU_PRIORITY); NVIC_EnableIRQ(TPU0_CH24_31_IRQn); } } static uint8_t vGetPwm(tPwmCaptureFlagchip *env) { uint8_t percent = 0; tPwmCaptureData data; osStatus_t cPeriodActiveTime = osMessageQueueGet(env->q_u32PeriodActiveTime, &data, 0, 1000); if (cPeriodActiveTime == osOK) { if ((data.ActiveTime == 0) || (data.PeriodTime == 0)) { cPeriodActiveTime = osMessageQueueGet(env->q_u32PeriodActiveTime, &data, 0, 1000); if (cPeriodActiveTime == osOK) { percent = data.ActiveTime * 100 / data.PeriodTime; } } else { percent = data.ActiveTime * 100 / data.PeriodTime; } } else { } return percent; } tPwmCaptureIO vPwmCaptureGetIo(tPwmCaptureFlagchip *env) { tPwmCaptureIO io = { .env = env, .getPwm = (PwmIOCaptureTransaction) vGetPwm, }; return io; }