Fabrice TOCCI

Kinetis KW24D512 -  KSDK_1.3.0 -  LPTMR

Discussion created by Fabrice TOCCI on Jan 18, 2017

Hi,

I have to use a timer to get a real time counter for my application.
I started from KSDK_1.3.0/iar  lptmr driver example code to get a sample code.

 

My need is to have a count period at least egal to 26ms.

 

In LPTMR example driver/ main.c,

I have selected .prescalerClockSource = kClockLptmrSrcOsc0erClk, as source clock. Timer LSB is so 1µs.

To get 26ms for the timer period, I called LPTMR_DRV_SetTimerPeriodUs(LPTMR_INSTANCE,26000);

 

But that was not working.
With that code I can configure the timer for a maximum count period of 16,383ms!!!

 

I had a look to the status reported by settimerperiod function and it was kStatus_LPTMR_TimerPeriodUsTooLarge!!!

 

In fsl_lptmr_driver.c , lptmr_status_t LPTMR_DRV_SetTimerPeriodUs(uint32_t instance, uint32_t us), there is a some code to verify tick_count
before to calling LPTMR_HAL_SetCompareValue(base, tick_count - 1);  

 

It verifies that tick_count is smaller than 16bits but the compare value in LPTMR_HAL_SetCompareValue(LPTMR_Type * base,  uint32_t compareValue)
is 32bits width!!!

 

I changed the code like that in fsl_lptmr_driver.c:
    /* CMR register is 32 Bits */
    if (tick_count > 0xFFFFFFFFU)
    {
        return kStatus_LPTMR_TimerPeriodUsTooLarge;
    }
    
And now it works fine!! :))

Outcomes