<?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>topic Re: Strange behavior of LPC43xx Timer0/1/2/3 interrupt in LPC Microcontrollers</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/Strange-behavior-of-LPC43xx-Timer0-1-2-3-interrupt/m-p/587584#M21655</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by Wouter on Thu Jan 10 03:37:34 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi jokn,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Most likely the problem is that it takes a few clock cycles before the IR bit really is cleared.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;For longer ISR's it's sufficient to just clear the IR flag at the beginning.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;If the ISR is really short and the clearing is done near the end of the ISR, try adding a __DSB(); instruction right after LPC_TIMER0-&amp;gt;IR = 1;. The DSB instruction ensures all outstanding memory transfers are completed before executing the next instruction.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Regards,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Wouter&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 19:12:08 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T19:12:08Z</dc:date>
    <item>
      <title>Strange behavior of LPC43xx Timer0/1/2/3 interrupt</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Strange-behavior-of-LPC43xx-Timer0-1-2-3-interrupt/m-p/587582#M21653</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by jokn on Fri Jan 04 11:54:11 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Strange behavior of LPC43xx Timer0/1/2/3 interrupt&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm just testing the timer0 of lpc4330 and I was wondering about that yet it seems at first ran twice as fast as expected.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I spend a lot of time and finally I found out that the problem is clearing the interrupt request bit (LPC_TIMER0-&amp;gt;IR)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;If my interrupt service routine is very short and especially has not subroutine call , clearing of IR bits fails and the interrupt repeats again.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;In the second&amp;nbsp; run of the interrupt clearing of the IR bit is successful.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;void TIMER0_IRQHandler (void)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;if(msec)msec--;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; LPC_TIMER0-&amp;gt;IR = 1;&amp;nbsp; // this fails in the first run of interrupt &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // on second run the bit will be cleared&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;It doesn’t mutter if I insert a delay like this,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; for (icnt = 0; icnt &amp;lt; 100; ++icnt);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; LPC_TIMER0-&amp;gt;IR = 1; &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Or like this&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; LPC_TIMER0-&amp;gt;IR = 1; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; for (icnt = 0; icnt &amp;lt; 100; ++icnt);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;But if I insert a dummy subroutine call, the problem disappears&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;void dummy () {}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; dummy();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; LPC_TIMER0-&amp;gt;IR = 1; &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Does anyone have an explanation for the strange behavior?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;My timer initialization looks as follows.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;void LPC_Timer0_Init (void)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; LPC_TIMER0-&amp;gt;TCR = 2;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Reset and Disable Timer&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; LPC_TIMER0-&amp;gt;CTCR = 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; LPC_TIMER0-&amp;gt;CCR = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // No Capture&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; LPC_TIMER0-&amp;gt;TC = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Counter = 0&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; LPC_TIMER0-&amp;gt;PC = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Prescale Counter = 0&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; LPC_TIMER0-&amp;gt;PR = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Prescale Register = 0 (no Prescaler)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; LPC_TIMER0-&amp;gt;MR[0] = SystemCoreClock / 1000 ;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; LPC_TIMER0-&amp;gt;MCR = 3;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Interrupt &amp;amp; Reset TC on match&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; LPC_TIMER0-&amp;gt;EMR = 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; LPC_TIMER0-&amp;gt;IR = 0xFFFFFFFF;&amp;nbsp; // Clear interrupt pending &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; NVIC_EnableIRQ(TIMER0_IRQn);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; LPC_TIMER0-&amp;gt;TCR = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Start Timer0&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 19:12:06 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Strange-behavior-of-LPC43xx-Timer0-1-2-3-interrupt/m-p/587582#M21653</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T19:12:06Z</dc:date>
    </item>
    <item>
      <title>Re: Strange behavior of LPC43xx Timer0/1/2/3 interrupt</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Strange-behavior-of-LPC43xx-Timer0-1-2-3-interrupt/m-p/587583#M21654</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by pnhnkvr on Fri Jan 04 15:47:47 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Clear the IR flag primarily. At least with LPC17xx mcus you cannot clear interrupt flag at the end of the ISR (at least with short routines, i.e. depending how many registers must the cpu pop from stack)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I guess that compiler will optimize your attempt to insert a delay loop (of course depending on your compiler optimization settings). If addition delay is required, try to add volatile NOP&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 19:12:07 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Strange-behavior-of-LPC43xx-Timer0-1-2-3-interrupt/m-p/587583#M21654</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T19:12:07Z</dc:date>
    </item>
    <item>
      <title>Re: Strange behavior of LPC43xx Timer0/1/2/3 interrupt</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Strange-behavior-of-LPC43xx-Timer0-1-2-3-interrupt/m-p/587584#M21655</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by Wouter on Thu Jan 10 03:37:34 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi jokn,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Most likely the problem is that it takes a few clock cycles before the IR bit really is cleared.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;For longer ISR's it's sufficient to just clear the IR flag at the beginning.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;If the ISR is really short and the clearing is done near the end of the ISR, try adding a __DSB(); instruction right after LPC_TIMER0-&amp;gt;IR = 1;. The DSB instruction ensures all outstanding memory transfers are completed before executing the next instruction.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Regards,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Wouter&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 19:12:08 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Strange-behavior-of-LPC43xx-Timer0-1-2-3-interrupt/m-p/587584#M21655</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T19:12:08Z</dc:date>
    </item>
    <item>
      <title>Re: Strange behavior of LPC43xx Timer0/1/2/3 interrupt</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Strange-behavior-of-LPC43xx-Timer0-1-2-3-interrupt/m-p/587585#M21656</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by jokn on Thu Jan 10 04:50:46 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi Wouter,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The __DSB() right after clearing IR dos not solve that problem. A short delay does.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;But that was not really, what I wondering about.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;The problem disappears also, if I insert a empty branch instruction just before clearing IR !!!&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Then I don’t need any delay after clearing IR.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;void empty_func (void) {}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;void TIMER0_IRQHandler (void) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;if(msec)msec--;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;empty_func();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;LPC_TIMER0-&amp;gt;IR = 1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Please try it ourself.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Do you have an explantion for this effect?&lt;/SPAN&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 19:12:08 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Strange-behavior-of-LPC43xx-Timer0-1-2-3-interrupt/m-p/587585#M21656</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T19:12:08Z</dc:date>
    </item>
    <item>
      <title>Re: Strange behavior of LPC43xx Timer0/1/2/3 interrupt</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Strange-behavior-of-LPC43xx-Timer0-1-2-3-interrupt/m-p/587586#M21657</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by Wouter on Thu Jan 10 07:50:45 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hmm, I would have expected that the DSB would have helped...&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm not sure why adding a call in the ISR solves the issue, but adding this call does change the way the ISR exits:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;If a call is made from the ISR, then on entering the ISR, LR is pushed onto the stack, and on exiting, LR is popped backed to the PC (POP {pc}).&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;If no call is made from the ISR, the LR does not have to be pushed onto the stack, and the ISR exits by branching to the value of LR (BX lr).&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Perhaps updating the PC by stack takes some more time compared to a normal branch...&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 19:12:09 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Strange-behavior-of-LPC43xx-Timer0-1-2-3-interrupt/m-p/587586#M21657</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T19:12:09Z</dc:date>
    </item>
  </channel>
</rss>

