mirror of https://github.com/ARMmbed/mbed-os.git
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.pull/7716/head
parent
8f7024a226
commit
b5d23c3f26
|
@ -124,8 +124,25 @@ void pwmout_period_us(pwmout_t* obj, int us)
|
||||||
FTM_Type *base = ftm_addrs[obj->pwm_name >> TPM_SHIFT];
|
FTM_Type *base = ftm_addrs[obj->pwm_name >> TPM_SHIFT];
|
||||||
float dc = pwmout_read(obj);
|
float dc = pwmout_read(obj);
|
||||||
|
|
||||||
// Stop FTM clock to ensure instant update of MOD register
|
uint32_t pwm_base_clock;
|
||||||
base->MOD = FTM_MOD_MOD((pwm_clock_mhz * (float)us) - 1);
|
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);
|
pwmout_write(obj, dc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue