<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>MQX Software SolutionsのトピックRe: Call a function or task every 10us on Vybrid M4</title>
    <link>https://community.nxp.com/t5/MQX-Software-Solutions/Call-a-function-or-task-every-10us-on-Vybrid-M4/m-p/764935#M17811</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Please refer to following code, it is taken from below thread&lt;/P&gt;&lt;P&gt;&lt;A href="https://community.nxp.com/thread/116150"&gt;Hardware interruptions&lt;/A&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Just a brief explanation here:&lt;/P&gt;&lt;P&gt;First , configure and start a PIT timer, please see function SetPIT/Reset PIT / Start PIT/ StopPIT&amp;nbsp;&amp;nbsp; ;&lt;/P&gt;&lt;P&gt;Next, install the PIT isr&amp;nbsp; to RAM, use _int_install_kernel_isr() to bypass MQX RTOS and let the interrupt be serviced immediately&lt;/P&gt;&lt;P&gt;Next, you can call your function in the PIT isr, see PIT_tick_isr.&lt;/P&gt;&lt;P&gt;One note is, you can't call MQX functions in the isr.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#define PIT_TIMER&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (2)&lt;/P&gt;&lt;P&gt;#define PIT_TMR_INTVEC&amp;nbsp; (INT_PIT0 + PIT_TIMER)&lt;BR /&gt;//some utilities&lt;/P&gt;&lt;P&gt;/*******************************************************************************/&lt;BR /&gt;/* void&amp;nbsp; SetPit(uint_16 rate)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR /&gt;/* Description:-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR /&gt;/* Calculate Hardware timer count on Kinetis for appropriate f (in Hz) */&lt;BR /&gt;/* And jam into PIT register = which resets the PIT counter */&lt;BR /&gt;/* In general, the Peripheral bus clock which is used to drive PIT module&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR /&gt;/* runs at half the main clock speed. (i.e. around 48MHz)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR /&gt;/*******************************************************************************/&lt;BR /&gt;void&amp;nbsp; SetPIT(uint_16 rate)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; PITTimerCounts = BSP_BUS_CLOCK/rate;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; PIT_LDVAL(PIT_TIMER) = PITTimerCounts;&lt;BR /&gt;}&lt;BR /&gt;/*******************************************************************************/&lt;BR /&gt;/* void&amp;nbsp; ResetPIT(void)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR /&gt;/* Description:-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR /&gt;/* jam precalculated count into PIT register = which resets the PIT counter */&lt;BR /&gt;/*******************************************************************************/&lt;BR /&gt;void&amp;nbsp; ResetPIT(void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; PIT_LDVAL(PIT_TIMER) = PITTimerCounts;&lt;BR /&gt;}&lt;BR /&gt;/*******************************************************************************/&lt;BR /&gt;/* void StartPIT(void)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR /&gt;/* Description:-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR /&gt;/* jam precalculated count into PIT register = which resets the PIT counter */&lt;BR /&gt;/* Turn ON PIT in Kinetis and clear state flag */&lt;BR /&gt;/*******************************************************************************/&lt;BR /&gt;void&amp;nbsp; StartPIT(void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp; PIT_LDVAL(PIT_TIMER) = PITTimerCounts;&lt;BR /&gt;&amp;nbsp; PIT_TCTRL(PIT_TIMER) |= PIT_TCTRL_TEN_MASK;//turn on timer&lt;BR /&gt;&amp;nbsp; PIT_Stopped = FALSE;&lt;BR /&gt;}&lt;BR /&gt;/*******************************************************************************/&lt;BR /&gt;/* void StopPRF(void)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR /&gt;/* Description:-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR /&gt;/* Turn off PIT in Kinetis and set state flag */&lt;BR /&gt;/*******************************************************************************/&lt;BR /&gt;void&amp;nbsp; StopPIT(void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp; PIT_TCTRL(PIT_TIMER) &amp;amp;= ~PIT_TCTRL_TEN_MASK;//turn off timer&lt;BR /&gt;&amp;nbsp; PIT_Stopped = TRUE;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;//here is the interrupt handler&lt;/P&gt;&lt;P&gt;#if MQX_ROM_VECTORS&lt;BR /&gt;//MQX_ISR takes a parameter&lt;BR /&gt;void PRF_tick_isr( pointer user_isr_ptr )&lt;BR /&gt;#else&lt;BR /&gt;//kernel ISR is void void&lt;BR /&gt;void PIT_tick_isr( void )&lt;BR /&gt;#endif&lt;BR /&gt;{&lt;BR /&gt;volatile uint_32 tmp;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; tick++;//do stuff here&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; PIT_TFLG(PRF_TIMER) = PIT_TFLG_TIF_MASK; //finally, write a 1 to clear the interrupt&lt;BR /&gt;&amp;nbsp;&amp;nbsp; tmp = PIT_CVAL(PRF_TIMER);//see errata&lt;BR /&gt;}&lt;BR /&gt;/*&lt;BR /&gt;Kinetis e2682: PIT: Does not generate a subsequent interrupt after clearing the interrupt flag&lt;BR /&gt;Errata type: Errata&lt;BR /&gt;Description: The PIT does not generate a subsequent interrupt after clearing the interrupt flag in the ISR&lt;BR /&gt;upon receiving the first interrupt. Thus, the second interrupt will never be triggered.&lt;BR /&gt;Workaround: In order to enable the use of subsequent interrupts from the PIT, the user must access any PIT&lt;BR /&gt;register after clearing the interrupt flag in the ISR.&lt;BR /&gt;*/&lt;BR /&gt;//here the routine to install the interrupt&lt;/P&gt;&lt;P&gt;void&amp;nbsp; InstallTimerInterrupt(void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; StopTimer();//for safety, make sure the timer is disabled.&lt;BR /&gt;#if MQX_ROM_VECTORS&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _int_install_isr(PIT_TMR_INTVEC, PIT_tick_isr, NULL);&lt;BR /&gt;#else&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _int_install_kernel_isr(PIT_TMR_INTVEC, PIT_tick_isr);&lt;BR /&gt;#endif&amp;nbsp; &amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIT_MCR = PIT_MCR_FRZ_MASK;//enable timers but stop when in debug mode&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIT_TCTRL(PRF_TIMER) = PIT_TCTRL_TIE_MASK;//turn on interrupt, but do not enable timer&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _bsp_int_init(PRF_TMR_INTVEC,3,0,TRUE);//also need to enable the interrupt controller&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //this bit is hidden deep in the guts of the ARM cortex documentation.&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;Daniel&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 19 Mar 2018 08:44:23 GMT</pubDate>
    <dc:creator>danielchen</dc:creator>
    <dc:date>2018-03-19T08:44:23Z</dc:date>
    <item>
      <title>Call a function or task every 10us on Vybrid M4</title>
      <link>https://community.nxp.com/t5/MQX-Software-Solutions/Call-a-function-or-task-every-10us-on-Vybrid-M4/m-p/764934#M17810</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi guys.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'm need to make a implementation thats call a function(or task) every 10us on a M4 Vybrid.&lt;/P&gt;&lt;P&gt;Looking on manuals and Internet I realized that the TIMER functions won't help me because the tick is 10ms.&lt;/P&gt;&lt;P&gt;Looking more I discovered GPT and PIT but I won't capable of discover how can I use it.&lt;/P&gt;&lt;P&gt;Are you have some documents or examples to help me ?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I find this example: &lt;A href="https://community.nxp.com/thread/324106"&gt;Timer example not working for timer value in micro seconds on MQX 3.6.1 MCF52259evb&lt;/A&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;and this: &lt;A href="https://community.nxp.com/thread/116150"&gt;https://community.nxp.com/thread/116150&lt;/A&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;but I didn't understand at all.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Can someone help me? I need, somehow, to call a function or task, both to me are fine, every 10us.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 21 Feb 2018 21:17:43 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MQX-Software-Solutions/Call-a-function-or-task-every-10us-on-Vybrid-M4/m-p/764934#M17810</guid>
      <dc:creator>israelcass</dc:creator>
      <dc:date>2018-02-21T21:17:43Z</dc:date>
    </item>
    <item>
      <title>Re: Call a function or task every 10us on Vybrid M4</title>
      <link>https://community.nxp.com/t5/MQX-Software-Solutions/Call-a-function-or-task-every-10us-on-Vybrid-M4/m-p/764935#M17811</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Please refer to following code, it is taken from below thread&lt;/P&gt;&lt;P&gt;&lt;A href="https://community.nxp.com/thread/116150"&gt;Hardware interruptions&lt;/A&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Just a brief explanation here:&lt;/P&gt;&lt;P&gt;First , configure and start a PIT timer, please see function SetPIT/Reset PIT / Start PIT/ StopPIT&amp;nbsp;&amp;nbsp; ;&lt;/P&gt;&lt;P&gt;Next, install the PIT isr&amp;nbsp; to RAM, use _int_install_kernel_isr() to bypass MQX RTOS and let the interrupt be serviced immediately&lt;/P&gt;&lt;P&gt;Next, you can call your function in the PIT isr, see PIT_tick_isr.&lt;/P&gt;&lt;P&gt;One note is, you can't call MQX functions in the isr.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;#define PIT_TIMER&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (2)&lt;/P&gt;&lt;P&gt;#define PIT_TMR_INTVEC&amp;nbsp; (INT_PIT0 + PIT_TIMER)&lt;BR /&gt;//some utilities&lt;/P&gt;&lt;P&gt;/*******************************************************************************/&lt;BR /&gt;/* void&amp;nbsp; SetPit(uint_16 rate)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR /&gt;/* Description:-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR /&gt;/* Calculate Hardware timer count on Kinetis for appropriate f (in Hz) */&lt;BR /&gt;/* And jam into PIT register = which resets the PIT counter */&lt;BR /&gt;/* In general, the Peripheral bus clock which is used to drive PIT module&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR /&gt;/* runs at half the main clock speed. (i.e. around 48MHz)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR /&gt;/*******************************************************************************/&lt;BR /&gt;void&amp;nbsp; SetPIT(uint_16 rate)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; PITTimerCounts = BSP_BUS_CLOCK/rate;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; PIT_LDVAL(PIT_TIMER) = PITTimerCounts;&lt;BR /&gt;}&lt;BR /&gt;/*******************************************************************************/&lt;BR /&gt;/* void&amp;nbsp; ResetPIT(void)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR /&gt;/* Description:-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR /&gt;/* jam precalculated count into PIT register = which resets the PIT counter */&lt;BR /&gt;/*******************************************************************************/&lt;BR /&gt;void&amp;nbsp; ResetPIT(void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; PIT_LDVAL(PIT_TIMER) = PITTimerCounts;&lt;BR /&gt;}&lt;BR /&gt;/*******************************************************************************/&lt;BR /&gt;/* void StartPIT(void)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR /&gt;/* Description:-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR /&gt;/* jam precalculated count into PIT register = which resets the PIT counter */&lt;BR /&gt;/* Turn ON PIT in Kinetis and clear state flag */&lt;BR /&gt;/*******************************************************************************/&lt;BR /&gt;void&amp;nbsp; StartPIT(void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp; PIT_LDVAL(PIT_TIMER) = PITTimerCounts;&lt;BR /&gt;&amp;nbsp; PIT_TCTRL(PIT_TIMER) |= PIT_TCTRL_TEN_MASK;//turn on timer&lt;BR /&gt;&amp;nbsp; PIT_Stopped = FALSE;&lt;BR /&gt;}&lt;BR /&gt;/*******************************************************************************/&lt;BR /&gt;/* void StopPRF(void)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR /&gt;/* Description:-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;BR /&gt;/* Turn off PIT in Kinetis and set state flag */&lt;BR /&gt;/*******************************************************************************/&lt;BR /&gt;void&amp;nbsp; StopPIT(void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp; PIT_TCTRL(PIT_TIMER) &amp;amp;= ~PIT_TCTRL_TEN_MASK;//turn off timer&lt;BR /&gt;&amp;nbsp; PIT_Stopped = TRUE;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;//here is the interrupt handler&lt;/P&gt;&lt;P&gt;#if MQX_ROM_VECTORS&lt;BR /&gt;//MQX_ISR takes a parameter&lt;BR /&gt;void PRF_tick_isr( pointer user_isr_ptr )&lt;BR /&gt;#else&lt;BR /&gt;//kernel ISR is void void&lt;BR /&gt;void PIT_tick_isr( void )&lt;BR /&gt;#endif&lt;BR /&gt;{&lt;BR /&gt;volatile uint_32 tmp;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; tick++;//do stuff here&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; PIT_TFLG(PRF_TIMER) = PIT_TFLG_TIF_MASK; //finally, write a 1 to clear the interrupt&lt;BR /&gt;&amp;nbsp;&amp;nbsp; tmp = PIT_CVAL(PRF_TIMER);//see errata&lt;BR /&gt;}&lt;BR /&gt;/*&lt;BR /&gt;Kinetis e2682: PIT: Does not generate a subsequent interrupt after clearing the interrupt flag&lt;BR /&gt;Errata type: Errata&lt;BR /&gt;Description: The PIT does not generate a subsequent interrupt after clearing the interrupt flag in the ISR&lt;BR /&gt;upon receiving the first interrupt. Thus, the second interrupt will never be triggered.&lt;BR /&gt;Workaround: In order to enable the use of subsequent interrupts from the PIT, the user must access any PIT&lt;BR /&gt;register after clearing the interrupt flag in the ISR.&lt;BR /&gt;*/&lt;BR /&gt;//here the routine to install the interrupt&lt;/P&gt;&lt;P&gt;void&amp;nbsp; InstallTimerInterrupt(void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; StopTimer();//for safety, make sure the timer is disabled.&lt;BR /&gt;#if MQX_ROM_VECTORS&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _int_install_isr(PIT_TMR_INTVEC, PIT_tick_isr, NULL);&lt;BR /&gt;#else&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _int_install_kernel_isr(PIT_TMR_INTVEC, PIT_tick_isr);&lt;BR /&gt;#endif&amp;nbsp; &amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIT_MCR = PIT_MCR_FRZ_MASK;//enable timers but stop when in debug mode&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIT_TCTRL(PRF_TIMER) = PIT_TCTRL_TIE_MASK;//turn on interrupt, but do not enable timer&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _bsp_int_init(PRF_TMR_INTVEC,3,0,TRUE);//also need to enable the interrupt controller&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //this bit is hidden deep in the guts of the ARM cortex documentation.&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;Daniel&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 19 Mar 2018 08:44:23 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MQX-Software-Solutions/Call-a-function-or-task-every-10us-on-Vybrid-M4/m-p/764935#M17811</guid>
      <dc:creator>danielchen</dc:creator>
      <dc:date>2018-03-19T08:44:23Z</dc:date>
    </item>
  </channel>
</rss>

