on HAL level it could look like:
uMod is calculated at init level ( and depends by TPM_DRV_SetClock params and BOARD_TPM_FRQ_HZ constant)
#define BOARD_TPM_INSTANCE_0 0
#define BOARD_TPM_CHANNEL_0_0 0
#define BOARD_TPM_CHANNEL_0_1 1
#define BOARD_TPM_CHANNEL_0_2 2
#define BOARD_TPM_MODE kTpmEdgeAlignedPWM
#define BOARD_TPM_FRQ_HZ 120000u
uint16_t uMod;
void BOARD_InitTPM(void)
{
uint32_t freq;
uint32_t val;
tpm_clock_mode_t clkSrc;
TPM_Type *tpmBase = g_tpmBase[BOARD_TPM_INSTANCE_0];
/* Initialize TPM module for PWM generation */
tpm_general_config_t driverInfo_0 = { //TPM 0 configuration structure
.isDBGMode = FALSE,
.isGlobalTimeBase = FALSE,
.isTriggerMode = FALSE,
.isStopCountOnOveflow = FALSE,
.isCountReloadOnTrig = FALSE,
.triggerSource = kTpmTrigSel0,
};
PORT_HAL_SetMuxMode(PORTB,18u,kPortMuxAlt5); /* TPM0_CH0 */
PORT_HAL_SetMuxMode(PORTC, 0u,kPortMuxAlt5); /* TPM0_CH1 */
PORT_HAL_SetMuxMode(PORTC, 1u,kPortMuxAlt5); /* TPM0_CH2 */
// Init TPM
TPM_DRV_Init(BOARD_TPM_INSTANCE_RGB, &driverInfo_0);
// Set clock for TPM COLOR
TPM_DRV_SetClock(BOARD_TPM_INSTANCE_RGB, kTpmClockSourceModuleClk, kTpmDividedBy2);
//instance init
clkSrc = TPM_HAL_GetClockMode(tpmBaseRGB);
/* Disable counter when switching modes */
TPM_HAL_SetClockMode(tpmBase, kTpmClockSourceNoneClk);
TPM_HAL_SetCpwms(tpmBaseRGB, BOARD_TPM_MODE);
/* Restore the clock source */
TPM_HAL_SetClockMode(tpmBase, clkSrc);
#if (BOARD_TPM_MODE == kTpmEdgeAlignedPWM )
val = ((uint32_t) 2 ) << TPM_CnSC_ELSA_SHIFT;
#else
val = ((uint32_t) 1 ) << TPM_CnSC_ELSA_SHIFT;
#endif
val |= (2 << TPM_CnSC_MSA_SHIFT);
TPM_HAL_SetChnMsnbaElsnbaVal(tpmBase, BOARD_TPM_CHANNEL_0_0, val);
TPM_HAL_SetChnMsnbaElsnbaVal(tpmBase, BOARD_TPM_CHANNEL_0_1, val);
TPM_HAL_SetChnMsnbaElsnbaVal(tpmBase, BOARD_TPM_CHANNEL_0_2, val);
/* Wait till mode change is acknowledged */
while (!(TPM_HAL_GetChnMsnbaVal(tpmBaseRGB, BOARD_TPM_CHANNEL_0_0))) { }
while (!(TPM_HAL_GetChnMsnbaVal(tpmBaseRGB, BOARD_TPM_CHANNEL_0_1))) { }
while (!(TPM_HAL_GetChnMsnbaVal(tpmBaseRGB, BOARD_TPM_CHANNEL_0_2))) { }
freq = TPM_DRV_GetClock(BOARD_TPM_INSTANCE_0);
#if (BOARD_TPM_MODE == kTpmEdgeAlignedPWM )
uMod = freq / BOARD_TPM_FRQ_HZ - 1;
TPM_HAL_SetMod(tpmBase, uMod);
#else
uMod = freq / (BOARD_TPM_FRQ_HZ * 2);
TPM_HAL_SetMod(tpmBase, uMod);
#endif
}
void BOARD_TPM_0_0(uint32_t dutyCycle)
{
uint16_t uCnv;
TPM_Type *tpmBase = g_tpmBase[BOARD_TPM_INSTANCE_0];
uCnv = uMod * dutyCycle / 100;
/* For 100% duty cycle */
if(uCnv >= uMod)
{
uCnv = uMod + 1;
}
TPM_HAL_SetChnCountVal(tpmBase, BOARD_TPM_CHANNEL_0_0, uCnv);
}