From 1b3d136707d675aff749ca641840f6eab8dee5f6 Mon Sep 17 00:00:00 2001 From: cfif Date: Thu, 15 Jan 2026 12:08:29 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Inc/PwmCaptureFlagchip.h | 14 +++++--- Src/PwmCaptureFlagchip.c | 70 ++++++++++++++++++++++++++++++---------- 2 files changed, 63 insertions(+), 21 deletions(-) diff --git a/Inc/PwmCaptureFlagchip.h b/Inc/PwmCaptureFlagchip.h index 3345f31..7439aa5 100644 --- a/Inc/PwmCaptureFlagchip.h +++ b/Inc/PwmCaptureFlagchip.h @@ -10,6 +10,11 @@ #include "fc7xxx_driver_tpu.h" #include "interrupt_manager.h" +typedef struct { + uint32_t ActiveTime; + uint32_t PeriodTime; +} tPwmCaptureData; + typedef struct { TPU_InterruptCfgType etpu_Int_config_tbl; @@ -17,19 +22,20 @@ typedef struct { uint8_t TPU_CAPTURE_CHANNEL; + osMessageQueueId_t q_u32PeriodActiveTime; + } tPwmCaptureFlagchip; void PWM_Capture_Initial( tPwmCaptureFlagchip *env, - uint32_t PeriodTime, - uint32_t ActiveTime, + bool isDeInit, uint8_t TPU_CAPTURE_CHANNEL, - uint8 TPU0_CH_PRIORITY, + uint8 TPU_PRIORITY, TPU_EventCallbackType Bsp_Tpu_PwmCallback, TPU_TCR1OverflowCallbackType Bsp_Tpu_OverflowCallBack); -tPwmIO vPwmCaptureGetIo(tPwmCaptureFlagchip *env); +tPwmCaptureIO vPwmCaptureGetIo(tPwmCaptureFlagchip *env); void Get_Set_Tpu_PwmCaptureCallback(tPwmCaptureFlagchip *env); diff --git a/Src/PwmCaptureFlagchip.c b/Src/PwmCaptureFlagchip.c index 7b1f473..16ed337 100644 --- a/Src/PwmCaptureFlagchip.c +++ b/Src/PwmCaptureFlagchip.c @@ -3,7 +3,7 @@ // #include #include "PwmCaptureFlagchip.h" - +#include "PwmFlagchip.h" void Get_Set_Tpu_PwmCaptureCallback(tPwmCaptureFlagchip *env) { if (env->etpu_captureconfig_tbl.eMeasureMode == TPU_PeriodMeasurement) { @@ -11,22 +11,28 @@ void Get_Set_Tpu_PwmCaptureCallback(tPwmCaptureFlagchip *env) { } 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, - uint32_t PeriodTime, - uint32_t ActiveTime, + bool isDeInit, uint8_t TPU_CAPTURE_CHANNEL, - uint8 TPU0_CH_PRIORITY, + 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 = 80000; // Ensure sample time > period + 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; @@ -42,34 +48,64 @@ void PWM_Capture_Initial( env->TPU_CAPTURE_CHANNEL = TPU_CAPTURE_CHANNEL; - - TPU_DeInit(); + 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); - NVIC_SetPriority(TPU0_CH0_7_IRQn, 1); } else if (TPU_CAPTURE_CHANNEL <= 15) { + NVIC_SetPriority(TPU0_CH8_15_IRQn, TPU_PRIORITY); NVIC_EnableIRQ(TPU0_CH8_15_IRQn); - NVIC_SetPriority(TPU0_CH8_15_IRQn, 2); } else if (TPU_CAPTURE_CHANNEL <= 23) { + NVIC_SetPriority(TPU0_CH16_23_IRQn, TPU_PRIORITY); NVIC_EnableIRQ(TPU0_CH16_23_IRQn); - NVIC_SetPriority(TPU0_CH16_23_IRQn, 3); } else if (TPU_CAPTURE_CHANNEL <= 31) { + NVIC_SetPriority(TPU0_CH24_31_IRQn, TPU_PRIORITY); NVIC_EnableIRQ(TPU0_CH24_31_IRQn); - NVIC_SetPriority(TPU0_CH24_31_IRQn, 4); } } -/* -tPwmIO vPwmCaptureGetIo(tPwmCaptureFlagchip *env) { - tPwmIO io = { + +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, - .run = (PwmIOTransaction) vPwmRun, - .setActivePercent = (PwmIOTransactionSetActivePercent) setActivePercent + .getPwm = (PwmIOCaptureTransaction) vGetPwm, }; + return io; } - */ \ No newline at end of file