70 #if (defined (PWM_OVER_ETIMER))
75 #if (defined(PWM_OVER_FTM))
77 static ftm_state_t FtmState[NO_OF_FTM_INSTS_FOR_PWM];
79 static uint32_t FtmStateInstanceMapping[NO_OF_FTM_INSTS_FOR_PWM];
81 static bool FtmStateIsAllocated[NO_OF_FTM_INSTS_FOR_PWM];
90 static uint8_t PwmAllocateState(
bool* isAllocated, uint32_t* instanceMapping,
const pwm_instance_t *
const instance, uint8_t numberOfinstances)
94 for (i = 0;i < numberOfinstances;i++)
96 if (isAllocated[i] ==
false)
98 instanceMapping[i] = instance->
instIdx;
99 isAllocated[i] =
true;
112 static void PwmFreeState(
bool* isAllocated,
const uint32_t* instanceMapping,
const pwm_instance_t *
const instance, uint8_t numberOfinstances)
116 for (i = 0;i < numberOfinstances;i++)
118 if (instanceMapping[i] == instance->
instIdx)
120 isAllocated[i] =
false;
141 #if (defined(PWM_OVER_FTM))
148 uint32_t dutyPercent;
270 index = PwmAllocateState(FtmStateIsAllocated, FtmStateInstanceMapping, instance, NO_OF_FTM_INSTS_FOR_PWM);
285 #if (defined(PWM_OVER_EMIOS))
286 if (instance->
instType == PWM_INST_TYPE_EMIOS)
289 emios_common_param_t pwmGlobalConfig =
299 EMIOS_DRV_InitGlobal((uint8_t)instance->
instIdx, &pwmGlobalConfig);
302 emios_mc_mode_param_t pwmTimebaseConfig =
304 EMIOS_MODE_MCB_UP_COUNTER_EXT_CLK,
306 EMIOS_CLOCK_DIVID_BY_1,
308 EMIOS_INPUT_FILTER_BYPASS,
310 EMIOS_TRIGGER_EDGE_FALLING
313 emios_pwm_param_t pwmChannelConfig=
315 EMIOS_MODE_OPWMCB_TRAIL_EDGE_DEADTIME_FLAGX1,
316 EMIOS_CLOCK_DIVID_BY_1,
318 EMIOS_NEGATIVE_PULSE,
333 pwmTimebaseConfig.mode = EMIOS_MODE_MCB_UP_COUNTER_INT_CLK;
334 pwmChannelConfig.mode = EMIOS_MODE_OPWMB_FLAGX1;
340 pwmTimebaseConfig.mode = EMIOS_MODE_MCB_UPDOWN_CNT_FLAGX1_INT_CLK;
341 pwmChannelConfig.mode = EMIOS_MODE_OPWMCB_TRAIL_EDGE_DEADTIME_FLAGX1;
349 pwmTimebaseConfig.internalPrescalerEn =
true;
350 pwmTimebaseConfig.internalPrescaler = ((pwm_emios_timebase_t*)(config->
pwmChannels[i].
timebase))->internalPrescaler;
355 (void)EMIOS_DRV_MC_InitCounterMode((uint8_t)instance->
instIdx, (uint8_t)((pwm_emios_timebase_t*)(config->
pwmChannels[i].
timebase))->name, &pwmTimebaseConfig);
360 pwmChannelConfig.timebase = EMIOS_BUS_SEL_A;
364 pwmChannelConfig.timebase = EMIOS_BUS_SEL_F;
368 pwmChannelConfig.timebase = EMIOS_BUS_SEL_BCDE;
374 pwmChannelConfig.outputActiveMode = EMIOS_POSITIVE_PULSE;
378 pwmChannelConfig.outputActiveMode = EMIOS_NEGATIVE_PULSE;
388 EMIOS_DRV_EnableGlobalEmios((uint8_t)(instance->
instIdx));
394 #if (defined (PWM_OVER_ETIMER))
395 if (instance->
instType == PWM_INST_TYPE_ETIMER)
401 etimer_user_channel_config_t etimerPwmPalCfg = {
402 .timerMode = ETIMER_MODE_VARIABLE_PWM,
403 .coreSettings = ETIMER_COUNTER_NORMAL,
406 .samples = ETIMER_FILT_CNT_3,
411 .source = ETIMER_IN_SRC_CLK_DIV_32,
412 .polarity = ETIMER_POLARITY_POSITIVE,
416 .source = ETIMER_IN_SRC_CNT0_IN,
417 .polarity = ETIMER_POLARITY_POSITIVE,
422 .polarity = ETIMER_POLARITY_POSITIVE,
424 .countDirection = ETIMER_COUNT_UP,
432 ETIMER_CLC_FROM_CMPLD1_WHEN_COMP1,
433 ETIMER_CLC_FROM_CMPLD2_WHEN_COMP2,
435 .compareOutputControl = ETIMER_OUTMODE_SOFTWARE,
436 .compareMode = ETIMER_CMPMODE_COMP1_UP_COMP2_UP,
439 ETIMER_CPTMODE_DISABLED,
440 ETIMER_CPTMODE_DISABLED,
443 .interruptEnableMask = 0,
447 ETIMER_DRV_Init(instance->
instIdx);
459 if( (((pwm_etimer_timebase_t *)(config->
pwmChannels[i].
timebase))->halfClkPeriod) ==
true )
461 etimerPwmPalCfg.coreSettings = ETIMER_COUNTER_BOTHEDGE;
465 etimerPwmPalCfg.coreSettings = ETIMER_COUNTER_NORMAL;
468 etimerPwmPalCfg.primaryInput.polarity = ((pwm_etimer_timebase_t *)(config->
pwmChannels[i].
timebase))->pwmClkSrc.polarity;
469 etimerPwmPalCfg.primaryInput.source = ((pwm_etimer_timebase_t *)(config->
pwmChannels[i].
timebase))->pwmClkSrc.source;
473 etimerPwmPalCfg.outputPin.enable =
true;
477 etimerPwmPalCfg.outputPin.enable =
false;
482 etimerPwmPalCfg.outputPin.polarity = ETIMER_POLARITY_POSITIVE;
486 etimerPwmPalCfg.outputPin.polarity = ETIMER_POLARITY_NEGATIVE;
497 ETIMER_DRV_StartTimerChannels(instance->
instIdx, enmask);
521 #if (defined(PWM_OVER_FTM))
530 #if (defined(PWM_OVER_EMIOS))
531 if (instance->
instType == PWM_INST_TYPE_EMIOS)
533 if ((eMIOS[instance->
instIdx]->UC[channel].C & eMIOS_C_MODE_MASK) == (uint32_t)EMIOS_MODE_OPWMB_FLAGX1)
535 eMIOS[instance->
instIdx]->UC[channel].B = duty;
539 eMIOS[instance->
instIdx]->UC[channel].A = duty;
546 #if (defined (PWM_OVER_ETIMER))
547 uint16_t comp1,comp2;
548 if (instance->
instType == PWM_INST_TYPE_ETIMER)
551 ETIMER_DRV_GetCompareThresholdBuffered(instance->
instIdx, channel, &comp1, &comp2);
553 if(duty<=(comp1+comp2))
556 ETIMER_DRV_SetCompareThresholdBuffered(instance->
instIdx, channel, duty, ((comp1+comp2)-duty));
590 #if (defined(PWM_OVER_FTM))
600 #if (defined(PWM_OVER_EMIOS))
601 if (instance->
instType == PWM_INST_TYPE_EMIOS)
603 switch (((eMIOS[instance->
instIdx]->UC[channel].C) & eMIOS_C_BSL_MASK) >> eMIOS_C_BSL_SHIFT)
606 eMIOS[instance->
instIdx]->UC[BUS_A].A = period;
611 eMIOS[instance->
instIdx]->UC[BUS_B].A = period;
613 else if (channel <= 15U)
615 eMIOS[instance->
instIdx]->UC[BUS_C].A = period;
617 else if (channel <= 23U)
619 eMIOS[instance->
instIdx]->UC[BUS_D].A = period;
621 else if (channel <= 31U)
623 eMIOS[instance->
instIdx]->UC[BUS_E].A = period;
631 eMIOS[instance->
instIdx]->UC[BUS_F].A = period;
641 #if (defined (PWM_OVER_ETIMER))
642 uint16_t comp1,comp2;
643 if (instance->
instType == PWM_INST_TYPE_ETIMER)
646 ETIMER_DRV_GetCompareThresholdBuffered(instance->
instIdx, channel, &comp1, &comp2);
651 ETIMER_DRV_SetCompareThresholdBuffered(instance->
instIdx, channel, comp1, (period-comp1));
685 #if (defined(PWM_OVER_FTM))
694 #if (defined(PWM_OVER_EMIOS))
695 if (instance->
instType == PWM_INST_TYPE_EMIOS)
702 #if (defined (PWM_OVER_ETIMER))
703 if (instance->
instType == PWM_INST_TYPE_ETIMER)
729 #if (defined(PWM_OVER_FTM))
734 PwmFreeState(FtmStateIsAllocated, FtmStateInstanceMapping, instance, NO_OF_FTM_INSTS_FOR_PWM);
740 #if (defined(PWM_OVER_EMIOS))
741 if (instance->
instType == PWM_INST_TYPE_EMIOS)
744 for (index = 0U; index < 32U; index++)
747 EMIOS_DRV_DeInitChannel((uint8_t)instance->
instIdx,
755 #if (defined (PWM_OVER_ETIMER))
756 if (instance->
instType == PWM_INST_TYPE_ETIMER)
759 ETIMER_DRV_Deinit(instance->
instIdx);
ftm_reg_update_t initCounterSync
ftm_pwm_sync_t syncMethod
status_t FTM_DRV_DeinitPwm(uint32_t instance)
Stops all PWM channels .
FlexTimer state structure of the driver.
FlexTimer driver independent PWM parameter.
ftm_safe_state_polarity_t levelSelect
#define FEATURE_FTM_CHANNEL_COUNT
Configuration structure that the user needs to set.
status_t PWM_UpdatePeriod(const pwm_instance_t *const instance, uint8_t channel, uint32_t period)
Update period for specific a specific channel. This function changes period for all channels which sh...
This structure is the configuration for initialization of PWM channels. Implements : pwm_global_confi...
bool enableSecondChannelOutput
status_t PWM_Init(const pwm_instance_t *const instance, const pwm_global_config_t *config)
Initialize PWM channels based on config parameter.
status_t FTM_DRV_UpdatePwmPeriod(uint32_t instance, ftm_pwm_update_option_t typeOfUpdate, uint32_t newValue, bool softwareTrigger)
This function will update the new period in the frequency or in the counter value into mode register ...
uint8_t numberOfPwmChannels
ftm_deadtime_ps_t deadTimePrescaler
uint8_t nNumCombinedPwmChannels
#define FTM_MAX_DUTY_CYCLE
Maximum value for PWM duty cycle.
uint32_t FTM_DRV_GetFrequency(uint32_t instance)
Retrieves the frequency of the clock source feeding the FTM counter.
status_t PWM_Deinit(const pwm_instance_t *const instance)
Uninitialised PWM instance.
ftm_pwm_sync_mode_t syncPoint
status_t
Status return codes. Common error codes will be a unified enumeration (C enum) that will contain all ...
bool enableComplementaryChannel
ftm_second_channel_polarity_t secondChannelPolarity
uint16_t uDutyCyclePercent
FlexTimer driver combined PWM parameter.
uint8_t nNumIndependentPwmChannels
pwm_complementarty_mode_t complementaryChannelPolarity
FlexTimer driver PWM parameters.
ftm_reg_update_t inverterSync
ftm_independent_ch_param_t * pwmIndependentChannelConfig
pwm_channel_type_t channelType
ftm_config_mode_t ftmMode
pwm_channel_t * pwmChannels
status_t FTM_DRV_Deinit(uint32_t instance)
Shuts down the FTM driver.
ftm_reg_update_t maskRegSync
status_t FTM_DRV_UpdatePwmChannel(uint32_t instance, uint8_t channel, ftm_pwm_update_option_t typeOfUpdate, uint16_t firstEdge, uint16_t secondEdge, bool softwareTrigger)
This function updates the waveform output in PWM mode (duty cycle and phase).
status_t PWM_UpdateDuty(const pwm_instance_t *const instance, uint8_t channel, uint32_t duty)
Update duty cycle. The measurement unit for duty is clock ticks.
status_t FTM_DRV_Init(uint32_t instance, const ftm_user_config_t *info, ftm_state_t *state)
Initializes the FTM driver.
status_t PWM_OverwriteOutputChannels(const pwm_instance_t *const instance, uint32_t channelsMask, uint32_t channelsValues)
This function change the output value for some channels. channelsMask select which channels will be o...
Structure storing PAL instance information.
bool enableExternalTrigger
status_t FTM_DRV_InitPwm(uint32_t instance, const ftm_pwm_param_t *param)
Configures the duty cycle and frequency and starts outputting the PWM on all channels configured in p...
ftm_clock_source_t ftmClockSource
FlexTimer driver PWM Fault parameter.
ftm_pwm_fault_param_t * faultConfig
ftm_reg_update_t outRegSync
ftm_combined_ch_param_t * pwmCombinedChannelConfig
status_t FTM_DRV_SetAllChnSoftwareOutputControl(uint32_t instance, uint8_t channelMask, uint8_t channelValueMask)
This function will control list of channels by software to force the output to specified value...
ftm_clock_ps_t ftmPrescaler