From b5d23c3f2689cf92ce01a49d55722d7ad38d8d7c Mon Sep 17 00:00:00 2001 From: MateuszM Date: Tue, 7 Aug 2018 09:31:52 +0200 Subject: [PATCH] Fix issue #5119, changed pwmout_api. The period of pwm we could get was limited to 69.9 ms, because prescaler value was set once only during initialization. base->mod is a 16 bit register, to get longer period we have to slow down the clk. --- .../TARGET_MCU_K64F/pwmout_api.c | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/pwmout_api.c b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/pwmout_api.c index eac2f8eda7..e84da9e1b1 100644 --- a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/pwmout_api.c +++ b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/pwmout_api.c @@ -124,8 +124,25 @@ void pwmout_period_us(pwmout_t* obj, int us) FTM_Type *base = ftm_addrs[obj->pwm_name >> TPM_SHIFT]; float dc = pwmout_read(obj); - // Stop FTM clock to ensure instant update of MOD register - base->MOD = FTM_MOD_MOD((pwm_clock_mhz * (float)us) - 1); + uint32_t pwm_base_clock; + uint32_t clkdiv = 0; + pwm_base_clock = CLOCK_GetFreq(kCLOCK_BusClk); + pwm_clock_mhz = (float)pwm_base_clock / 1000000.0f; + uint32_t mod = (pwm_clock_mhz*(float)us) - 1; + while(mod > 0xFFFF){ + ++clkdiv; + pwm_clock_mhz /= 2.0f; + mod = (pwm_clock_mhz*(float)us) - 1; + if(clkdiv==7){ + break; + } + } + uint32_t SC = base->SC & ~FTM_SC_PS_MASK; + SC |= FTM_SC_PS((ftm_clock_prescale_t)clkdiv); + base->SC = SC; + + //Stop FTM clock to ensure instant update of MOD register + base->MOD = FTM_MOD_MOD(mod); pwmout_write(obj, dc); }