<?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>LPC Microcontrollersのトピックsystick setup in lpcopen</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/systick-setup-in-lpcopen/m-p/581324#M20418</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by qrptech on Wed Jan 06 04:18:39 MST 2016&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I did a very quick and short search for something on this topic,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;did not find a thing relevant enough. But here goes :&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;While writing a program for a project a came across this "strange"&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;behaviour with the final tick rate of the systick timer. When I set&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;it to 10 Hz, using the periph_blinky example, with&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;// Ticks per second&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define TickRate_Hz 10&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;it results in a 10 Hz tick rate. But when set to 1 or 2 it will output a&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;steady state (the LED is constant on).&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;After some searching I found that the clksource bit in the systick&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;timer control register is set, then Chip_Clock_SetSysTickClockDiv()&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;cannot be set to 1. It must be at least 2,5 according to the user&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;manual page 324. So I changed some stuff :&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;// The sysTick counter only has 24 bits of precision, so it will&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// overflow quickly with a fast core clock. You can alter the&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// sysTick divider to generate slower sysTick clock rates&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Chip_Clock_SetSysTickClockDiv(200);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;and in core_cm3.h :&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/*******************************************************************************&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * \brief&amp;nbsp; System Tick Configuration&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * The function initializes the System Timer and its interrupt, and starts&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * the System Tick Timer.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Counter is in free running mode to generate periodic interrupts.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * \param [in]&amp;nbsp; ticks&amp;nbsp; Number of ticks between two interrupts.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * \return&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp; Function succeeded.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * \return&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp; Function failed.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * \note When the variable &lt;/SPAN&gt;&lt;STRONG&gt;__Vendor_SysTickConfig&lt;/STRONG&gt;&lt;SPAN&gt; is set to 1, then&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the function &lt;/SPAN&gt;&lt;STRONG&gt;SysTick_Config&lt;/STRONG&gt;&lt;SPAN&gt; is not included. In this case,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the file &lt;/SPAN&gt;&lt;STRONG&gt;&amp;lt;i&amp;gt;device&amp;lt;/i&amp;gt;.h&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt; * must contain a vendor-specific implementation of this function.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; ******************************************************************************/&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;if((ticks - 1) &amp;gt; SysTick_LOAD_RELOAD_Msk)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// Reload value impossible&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;return (1);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// Set reload register&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;SysTick-&amp;gt;LOAD&amp;nbsp; = ticks - 1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// Set Priority for Systick Interrupt&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;NVIC_SetPriority (SysTick_IRQn, (1&amp;lt;&amp;lt;__NVIC_PRIO_BITS) - 1);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// Load the SysTick Counter Value&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;SysTick-&amp;gt;VAL = 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// Enable SysTick IRQ and SysTick Timer&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;SysTick-&amp;gt;CTRL = SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// Function successful&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;return (0);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Now it is working as, I think, intended :-)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Oh, I tried it with 3 values in Chip_Clock_SetSysTickClockDiv(), being 5, 200 and 255.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;roelof&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 20:21:59 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T20:21:59Z</dc:date>
    <item>
      <title>systick setup in lpcopen</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/systick-setup-in-lpcopen/m-p/581324#M20418</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by qrptech on Wed Jan 06 04:18:39 MST 2016&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I did a very quick and short search for something on this topic,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;did not find a thing relevant enough. But here goes :&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;While writing a program for a project a came across this "strange"&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;behaviour with the final tick rate of the systick timer. When I set&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;it to 10 Hz, using the periph_blinky example, with&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;// Ticks per second&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define TickRate_Hz 10&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;it results in a 10 Hz tick rate. But when set to 1 or 2 it will output a&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;steady state (the LED is constant on).&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;After some searching I found that the clksource bit in the systick&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;timer control register is set, then Chip_Clock_SetSysTickClockDiv()&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;cannot be set to 1. It must be at least 2,5 according to the user&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;manual page 324. So I changed some stuff :&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;// The sysTick counter only has 24 bits of precision, so it will&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// overflow quickly with a fast core clock. You can alter the&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// sysTick divider to generate slower sysTick clock rates&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Chip_Clock_SetSysTickClockDiv(200);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;and in core_cm3.h :&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/*******************************************************************************&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * \brief&amp;nbsp; System Tick Configuration&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * The function initializes the System Timer and its interrupt, and starts&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * the System Tick Timer.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * Counter is in free running mode to generate periodic interrupts.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * \param [in]&amp;nbsp; ticks&amp;nbsp; Number of ticks between two interrupts.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * \return&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp; Function succeeded.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * \return&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp; Function failed.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; * \note When the variable &lt;/SPAN&gt;&lt;STRONG&gt;__Vendor_SysTickConfig&lt;/STRONG&gt;&lt;SPAN&gt; is set to 1, then&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the function &lt;/SPAN&gt;&lt;STRONG&gt;SysTick_Config&lt;/STRONG&gt;&lt;SPAN&gt; is not included. In this case,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; *&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the file &lt;/SPAN&gt;&lt;STRONG&gt;&amp;lt;i&amp;gt;device&amp;lt;/i&amp;gt;.h&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt; * must contain a vendor-specific implementation of this function.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; ******************************************************************************/&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;if((ticks - 1) &amp;gt; SysTick_LOAD_RELOAD_Msk)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// Reload value impossible&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;return (1);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// Set reload register&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;SysTick-&amp;gt;LOAD&amp;nbsp; = ticks - 1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// Set Priority for Systick Interrupt&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;NVIC_SetPriority (SysTick_IRQn, (1&amp;lt;&amp;lt;__NVIC_PRIO_BITS) - 1);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// Load the SysTick Counter Value&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;SysTick-&amp;gt;VAL = 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// Enable SysTick IRQ and SysTick Timer&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;SysTick-&amp;gt;CTRL = SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// Function successful&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;return (0);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Now it is working as, I think, intended :-)&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Oh, I tried it with 3 values in Chip_Clock_SetSysTickClockDiv(), being 5, 200 and 255.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;roelof&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 20:21:59 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/systick-setup-in-lpcopen/m-p/581324#M20418</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T20:21:59Z</dc:date>
    </item>
  </channel>
</rss>

