Обновление

This commit is contained in:
cfif 2026-01-15 12:08:29 +03:00
parent 497d5664c9
commit 1b3d136707
2 changed files with 63 additions and 21 deletions

View File

@ -10,6 +10,11 @@
#include "fc7xxx_driver_tpu.h" #include "fc7xxx_driver_tpu.h"
#include "interrupt_manager.h" #include "interrupt_manager.h"
typedef struct {
uint32_t ActiveTime;
uint32_t PeriodTime;
} tPwmCaptureData;
typedef struct { typedef struct {
TPU_InterruptCfgType etpu_Int_config_tbl; TPU_InterruptCfgType etpu_Int_config_tbl;
@ -17,19 +22,20 @@ typedef struct {
uint8_t TPU_CAPTURE_CHANNEL; uint8_t TPU_CAPTURE_CHANNEL;
osMessageQueueId_t q_u32PeriodActiveTime;
} tPwmCaptureFlagchip; } tPwmCaptureFlagchip;
void PWM_Capture_Initial( void PWM_Capture_Initial(
tPwmCaptureFlagchip *env, tPwmCaptureFlagchip *env,
uint32_t PeriodTime, bool isDeInit,
uint32_t ActiveTime,
uint8_t TPU_CAPTURE_CHANNEL, uint8_t TPU_CAPTURE_CHANNEL,
uint8 TPU0_CH_PRIORITY, uint8 TPU_PRIORITY,
TPU_EventCallbackType Bsp_Tpu_PwmCallback, TPU_EventCallbackType Bsp_Tpu_PwmCallback,
TPU_TCR1OverflowCallbackType Bsp_Tpu_OverflowCallBack); TPU_TCR1OverflowCallbackType Bsp_Tpu_OverflowCallBack);
tPwmIO vPwmCaptureGetIo(tPwmCaptureFlagchip *env); tPwmCaptureIO vPwmCaptureGetIo(tPwmCaptureFlagchip *env);
void Get_Set_Tpu_PwmCaptureCallback(tPwmCaptureFlagchip *env); void Get_Set_Tpu_PwmCaptureCallback(tPwmCaptureFlagchip *env);

View File

@ -3,7 +3,7 @@
// //
#include <SystemDelayInterface.h> #include <SystemDelayInterface.h>
#include "PwmCaptureFlagchip.h" #include "PwmCaptureFlagchip.h"
#include "PwmFlagchip.h"
void Get_Set_Tpu_PwmCaptureCallback(tPwmCaptureFlagchip *env) { void Get_Set_Tpu_PwmCaptureCallback(tPwmCaptureFlagchip *env) {
if (env->etpu_captureconfig_tbl.eMeasureMode == TPU_PeriodMeasurement) { if (env->etpu_captureconfig_tbl.eMeasureMode == TPU_PeriodMeasurement) {
@ -11,22 +11,28 @@ void Get_Set_Tpu_PwmCaptureCallback(tPwmCaptureFlagchip *env) {
} else { } else {
TPU_CaptureMeasActivePeriodServiceReq(env->TPU_CAPTURE_CHANNEL, &env->etpu_captureconfig_tbl); 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( void PWM_Capture_Initial(
tPwmCaptureFlagchip *env, tPwmCaptureFlagchip *env,
uint32_t PeriodTime, bool isDeInit,
uint32_t ActiveTime,
uint8_t TPU_CAPTURE_CHANNEL, uint8_t TPU_CAPTURE_CHANNEL,
uint8 TPU0_CH_PRIORITY, uint8 TPU_PRIORITY,
TPU_EventCallbackType Bsp_Tpu_PwmCallback, TPU_EventCallbackType Bsp_Tpu_PwmCallback,
TPU_TCR1OverflowCallbackType Bsp_Tpu_OverflowCallBack) { TPU_TCR1OverflowCallbackType Bsp_Tpu_OverflowCallBack) {
env->q_u32PeriodActiveTime = osMessageQueueNew(1, sizeof(tPwmCaptureData), NULL);
env->etpu_captureconfig_tbl.u32PeriodTime = 0u; env->etpu_captureconfig_tbl.u32PeriodTime = 0u;
env->etpu_captureconfig_tbl.eMeasureMode = TPU_DutyMeasurementActiveHigh; env->etpu_captureconfig_tbl.eMeasureMode = TPU_DutyMeasurementActiveHigh;
env->etpu_captureconfig_tbl.eInputType = TPUE_DETECT_FALLING_EDGE_ONLY; 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.u32ActiveTime = 0;
env->etpu_captureconfig_tbl.LastTime = 0; env->etpu_captureconfig_tbl.LastTime = 0;
env->etpu_captureconfig_tbl.StartTime = 0; env->etpu_captureconfig_tbl.StartTime = 0;
@ -42,34 +48,64 @@ void PWM_Capture_Initial(
env->TPU_CAPTURE_CHANNEL = TPU_CAPTURE_CHANNEL; env->TPU_CAPTURE_CHANNEL = TPU_CAPTURE_CHANNEL;
if (isDeInit) {
TPU_DeInit(); TPU_DeInit();
}
TPU_Init(); TPU_Init();
TPU_CaptureModeInit(TPU_CAPTURE_CHANNEL, &env->etpu_captureconfig_tbl); TPU_CaptureModeInit(TPU_CAPTURE_CHANNEL, &env->etpu_captureconfig_tbl);
TPU_InitChannelInterrupt(TPU_CAPTURE_CHANNEL, &env->etpu_Int_config_tbl); TPU_InitChannelInterrupt(TPU_CAPTURE_CHANNEL, &env->etpu_Int_config_tbl);
if (TPU_CAPTURE_CHANNEL <= 7) { if (TPU_CAPTURE_CHANNEL <= 7) {
NVIC_SetPriority(TPU0_CH0_7_IRQn, TPU_PRIORITY);
NVIC_EnableIRQ(TPU0_CH0_7_IRQn); NVIC_EnableIRQ(TPU0_CH0_7_IRQn);
NVIC_SetPriority(TPU0_CH0_7_IRQn, 1);
} else if (TPU_CAPTURE_CHANNEL <= 15) { } else if (TPU_CAPTURE_CHANNEL <= 15) {
NVIC_SetPriority(TPU0_CH8_15_IRQn, TPU_PRIORITY);
NVIC_EnableIRQ(TPU0_CH8_15_IRQn); NVIC_EnableIRQ(TPU0_CH8_15_IRQn);
NVIC_SetPriority(TPU0_CH8_15_IRQn, 2);
} else if (TPU_CAPTURE_CHANNEL <= 23) { } else if (TPU_CAPTURE_CHANNEL <= 23) {
NVIC_SetPriority(TPU0_CH16_23_IRQn, TPU_PRIORITY);
NVIC_EnableIRQ(TPU0_CH16_23_IRQn); NVIC_EnableIRQ(TPU0_CH16_23_IRQn);
NVIC_SetPriority(TPU0_CH16_23_IRQn, 3);
} else if (TPU_CAPTURE_CHANNEL <= 31) { } else if (TPU_CAPTURE_CHANNEL <= 31) {
NVIC_SetPriority(TPU0_CH24_31_IRQn, TPU_PRIORITY);
NVIC_EnableIRQ(TPU0_CH24_31_IRQn); NVIC_EnableIRQ(TPU0_CH24_31_IRQn);
NVIC_SetPriority(TPU0_CH24_31_IRQn, 4);
} }
} }
/*
tPwmIO vPwmCaptureGetIo(tPwmCaptureFlagchip *env) { static uint8_t vGetPwm(tPwmCaptureFlagchip *env) {
tPwmIO io = {
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, .env = env,
.run = (PwmIOTransaction) vPwmRun, .getPwm = (PwmIOCaptureTransaction) vGetPwm,
.setActivePercent = (PwmIOTransactionSetActivePercent) setActivePercent
}; };
return io; return io;
} }
*/