Pwm_Flagchip_FC7240/Src/PwmFlagchip.c

88 lines
2.9 KiB
C

//
// Created by cfif on 07.09.22.
//
#include <SystemDelayInterface.h>
#include "PwmFlagchip.h"
void Get_Set_Tpu_PwmCallback(tPwmFlagchip *env) {
TPU_PwmServiceReq(env->TPU_PWM_CHANNEL, env->etpu_pwmconfig_tbl.u32ActiveTime,
env->etpu_pwmconfig_tbl.u32PeriodTime);
}
void PWM_Initial(
tPwmFlagchip *env,
uint32_t PeriodTime,
uint32_t ActiveTime,
uint8_t TPU_PWM_CHANNEL,
uint8 TPU0_CH_PRIORITY,
TPU_EventCallbackType Bsp_Tpu_PwmCallback,
TPU_TCR1OverflowCallbackType Bsp_Tpu_OverflowCallBack) {
env->etpu_pwmconfig_tbl.eTBS1 = TPUE_EQUAL_ONLY_CAPBASE_TCR1_MATCHBASE_TCR1;
env->etpu_pwmconfig_tbl.eTBS2 = TPUE_EQUAL_ONLY_CAPBASE_TCR1_MATCHBASE_TCR1;
env->etpu_pwmconfig_tbl.bPwmUseTCR1 = (bool) true;
env->etpu_pwmconfig_tbl.bPwmUseTCR2 = (bool) false;
env->etpu_pwmconfig_tbl.u32ActiveTime = ActiveTime;
env->etpu_pwmconfig_tbl.u32PeriodTime = PeriodTime;
env->etpu_pwmconfig_tbl.bActiveHigh = (bool) true;
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_ANY_EVENT_GATED_BY_MSRTSR;
env->TPU_PWM_CHANNEL = TPU_PWM_CHANNEL;
TPU_DeInit();
TPU_Init();
TPU_PwmModeInit(TPU_PWM_CHANNEL, &env->etpu_pwmconfig_tbl);
TPU_InitChannelInterrupt(TPU_PWM_CHANNEL, &env->etpu_Int_config_tbl);
NVIC_SetPriorityGrouping(NVIC_PRIORITY_GROUP_4);
if (TPU_PWM_CHANNEL <= 7) {
NVIC_EnableIRQ(TPU0_CH0_7_IRQn);
NVIC_SetPriority(TPU0_CH0_7_IRQn, TPU0_CH_PRIORITY);
} else if (TPU_PWM_CHANNEL <= 15) {
NVIC_EnableIRQ(TPU0_CH8_15_IRQn);
NVIC_SetPriority(TPU0_CH8_15_IRQn, TPU0_CH_PRIORITY);
} else if (TPU_PWM_CHANNEL <= 23) {
NVIC_EnableIRQ(TPU0_CH16_23_IRQn);
NVIC_SetPriority(TPU0_CH16_23_IRQn, TPU0_CH_PRIORITY);
} else if (TPU_PWM_CHANNEL <= 31) {
NVIC_EnableIRQ(TPU0_CH24_31_IRQn);
NVIC_SetPriority(TPU0_CH24_31_IRQn, TPU0_CH_PRIORITY);
}
}
static void vPwmRun(tPwmFlagchip *env) {
TPU_StartChannel();
}
static void setActivePercent(tPwmFlagchip *env, uint8_t percent) {
if (percent > 100)
percent = 100;
// Расчет времени активности в тактах
env->etpu_pwmconfig_tbl.u32ActiveTime = PERIOD_TICKS * percent / 100;
}
tPwmIO vPwmGetIo(tPwmFlagchip *env) {
tPwmIO io = {
.env = env,
.run = (PwmIOTransaction) vPwmRun,
.setActivePercent = (PwmIOTransactionSetActivePercent) setActivePercent
};
return io;
}