// // Created by cfif on 07.09.22. // #include #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 = 95; if (percent < 10) percent = 5; // Для 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; }