Pwm_Flagchip_FC7240/Src/PwmFlagchip.c

111 lines
3.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// Created by cfif on 07.09.22.
//
#include <SystemDelayInterface.h>
#include "PwmFlagchip.h"
void Get_Set_Tpu_PwmCallback(tPwmFlagchip *env) {
if (env->updatePending) {
env->etpu_pwmconfig_tbl.u32ActiveTime = env->pendingActiveTime;
env->updatePending = false;
}
TPU_PwmServiceReq(env->TPU_PWM_CHANNEL, env->etpu_pwmconfig_tbl.u32ActiveTime,
env->etpu_pwmconfig_tbl.u32PeriodTime);
}
void PWM_Initial(
tPwmFlagchip *env,
bool isDeInit,
uint32_t PeriodTime,
uint32_t ActiveTime,
uint8_t TPU_PWM_CHANNEL,
uint8 TPU_PRIORITY,
TPU_EventCallbackType Bsp_Tpu_PwmCallback,
TPU_TCR1OverflowCallbackType Bsp_Tpu_OverflowCallBack) {
//env->q_u32ActiveTime = osMessageQueueNew(1, sizeof(uint32_t), NULL);
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) false;
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;
if (isDeInit) {
TPU_DeInit();
}
TPU_Init();
TPU_PwmModeInit(TPU_PWM_CHANNEL, &env->etpu_pwmconfig_tbl);
TPU_InitChannelInterrupt(TPU_PWM_CHANNEL, &env->etpu_Int_config_tbl);
if (TPU_PWM_CHANNEL <= 7) {
NVIC_SetPriority(TPU0_CH0_7_IRQn, TPU_PRIORITY);
NVIC_EnableIRQ(TPU0_CH0_7_IRQn);
} else if (TPU_PWM_CHANNEL <= 15) {
NVIC_SetPriority(TPU0_CH8_15_IRQn, TPU_PRIORITY);
NVIC_EnableIRQ(TPU0_CH8_15_IRQn);
} else if (TPU_PWM_CHANNEL <= 23) {
NVIC_SetPriority(TPU0_CH16_23_IRQn, TPU_PRIORITY);
NVIC_EnableIRQ(TPU0_CH16_23_IRQn);
} else if (TPU_PWM_CHANNEL <= 31) {
NVIC_SetPriority(TPU0_CH24_31_IRQn, TPU_PRIORITY);
NVIC_EnableIRQ(TPU0_CH24_31_IRQn);
}
}
static void vPwmRun(tPwmFlagchip *env) {
TPU_StartChannel();
}
static void setActivePercent(tPwmFlagchip *env, uint8_t percent) {
uint8_t final_percent;
// Ограничения
if (percent > 90)
percent = 90;
if (percent < 10)
percent = 10;
// Для active LOW (bActiveHigh = false) нужна инверсия
// 10% → 90%, 20% → 80% и т.д.
if (env->etpu_pwmconfig_tbl.bActiveHigh == false) {
final_percent = 100 - percent;
} else {
final_percent = percent;
}
// Расчет времени активности в тактах
uint32_t activeTime = env->etpu_pwmconfig_tbl.u32PeriodTime * final_percent / 100;
// Не обновляем напрямую, а ставим флаг
env->pendingActiveTime = activeTime;
env->updatePending = true;
}
tPwmIO vPwmGetIo(tPwmFlagchip *env) {
tPwmIO io = {
.env = env,
.run = (PwmIOTransaction) vPwmRun,
.setActivePercent = (PwmIOTransactionSetActivePercent) setActivePercent
};
return io;
}