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
MateuszM 2018-08-07 09:31:52 +02:00
parent 8f7024a226
commit b5d23c3f26
1 changed files with 19 additions and 2 deletions

View File

@ -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);
} }