mirror of https://github.com/ARMmbed/mbed-os.git
Merge pull request #7716 from MateuszMaz/#issue5119_pwm_fix
Fix issue #5119, changed pwmout_api.pull/7803/head
commit
c4e814d9cc
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue