AnsweredAssumed Answered

MKL28Z lptmr0 vs. lptmr1 interchangeable?

Question asked by M I on Sep 3, 2019
Latest reply on Sep 10, 2019 by M I



I'm hoping to setup more than one timers in the system we're developing such that one will be 1 seconds tick while others or in milliseconds tick, etc.


I've imported the lptmr SDK project, which uses LPTMR0 & manipulated it a little bit to do what I need for use in 4 factors, some in seconds, and counting to minutes, with lowest time in seconds.


Since MKL28Z claims to have both LPTMR0 and LPTMR1,  I tried swapping everything in this imported simple lptmr project from lptmr0 to lptmr1 values, e.g. based register address, interrupt #, interrupt handler pointer.


I know I replaced all in the definitions but the rest of the function calls and configuration settings I kept AS IT IS for lptmr0 also in lptmr1.


PROBLEM:   In using lptmr1, it hangs... it does not behave or do anything as how it did when using lptmr0.


Are these 2 interchangeable?


I noticed this though on MKL28Z7.h which I'm not sure effects the problem:

<partial quote of device interrupts>


  LPTMR0_IRQn                  = 26,               /**< LPTMR0 interrupt */
  RTC_Seconds_IRQn             = 27,               /**< RTC seconds */
  INTMUX0_0_IRQn               = 28,               /**< INTMUX0 channel 0 interrupt */
  INTMUX0_1_IRQn               = 29,               /**< INTMUX0 channel 1 interrupt */
  INTMUX0_2_IRQn               = 30,               /**< INTMUX0 channel 2 interrupt */
  INTMUX0_3_IRQn               = 31,               /**< INTMUX0 channel 3 interrupt */
  LPTMR1_IRQn                  = 32,               /**< LPTMR1 interrupt  (INTMUX source IRQ0) */


Notice LPTMR0_IRQn = 26, solely for lptmr0 interrupt.     However, LPTMR1_IRQn = 32 is "shared" with INTMUX source IRQ0.

I'm not sure which in this project triggers IRQ0 & if so could that be what's causing lptmr1 not to work?


Worst comes to worst, and I'm just stuck with LPTMR0,  since I can declare a config structure, e.g.

    lptmr_config_t lptmrConfig;


Can I declare several such lptmr_config data structures and just vary each by the prescaler value for each structure so some ticks in seconds while others are faster in milliseconds or such?  E.g.

config->prescalerClockSource = kLPTMR_PrescalerClock_1;   // or _0 thru _3


>>> Addition:   Also if I only use LPTMR0 with several data configured timer structures, how do I know which triggered the LPTMR0_IRQHandler()?  inside the interrupt handler?   The problem I have with MKL28Z is I don't see any "timer handle" or "timer label" to know which triggered what, like we do it in other MCU's.   

Or maybe someone knows how that is done in MKL28Z? because I don't.


>>> More addition:  In further studing the lptmr SDK project example,  I see that it setup the time period (called LPTMR_SetTimerPeriod()) once for a single lptmr data config structure.   Does that mean I can only also setup for ONE (1) timer data structure & run one lptmr0 timer in the system only at a time?    And in order to refine to ticks in milliseconds I should use other PrescalerClock that's not 1 second but use the faster milliseconds divider & just do "counters" to "simulate" which completed 100 millisecond vs. 1 second vs. 10 minutes, etc?


Please advise.


Thanks for the help.