<?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のトピックFeeding watch dog on LPC11U24</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/Feeding-watch-dog-on-LPC11U24/m-p/544888#M12950</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by Tobias Zvonc on Thu Sep 25 08:19:32 MST 2014&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm working on a second bootloader for LPC11U24, which uses USB HID for writing application to flash. I'm using LPCopen driver for LPC11Uxx.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;To make long story short, I initialize USB interface, watch dog and SysTick timer. The idea was to feed watch dog timer from SysTick interrupt handler every 100 ms (Watch dog timer constant is for 2 seconds WD timer period). However, if I do that, microcontroller is reseted for 2, 3 or more times as soon as it initializes. The worst part is that this varies - sometimes after reset everything is good, sometimes MCU is reseted for 2 or more times in a row.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;If I remove feeding watch dog from SysTick interrupt handler and feed it from while() loop in main(), everything is good. And if I remove feeding watch dog, MCU is reseted exactly every two seconds, and that confirms that watch dog is initialized correctly.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Does anybody have experience with this? I spent a day an a half trying to figure this out, and it doesn't make sense at all.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Here is relevant part of the code:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
void WDT_IRQHandler(void)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(Chip_WWDT_GetStatus(LPC_WWDT) &amp;amp; WWDT_WDMOD_WDTOF)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NVIC_SystemReset();
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}

void SysTick_Handler(void)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; // If we feed Watch dog from here, reset happens 2 or 3 (or more) times
&amp;nbsp;&amp;nbsp;&amp;nbsp; // in a row (every time different).
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Chip_WWDT_Feed(LPC_WWDT);

&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( _g_IAPStarted ){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_GPIO_SetPinToggle(LPC_GPIO, PIN_LED2_RED);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; _g_BootloaderTimeout_100ms--;
}



int main(void)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t calculatedCRC;
&amp;nbsp;&amp;nbsp;&amp;nbsp; volatile unsigned int delay;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Initialize board and chip */
BoardInitialization();
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; Reset_Signal();
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; // LED signals we are in bootloader.
&amp;nbsp;&amp;nbsp;&amp;nbsp; LedOn();
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; USBInit();

&amp;nbsp;&amp;nbsp;&amp;nbsp; #ifndef DEBUG
&amp;nbsp;&amp;nbsp;&amp;nbsp; WatchdogInitialize();
&amp;nbsp;&amp;nbsp;&amp;nbsp; #endif
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; SysTick_Config(SystemCoreClock/10); // frequency of SysTick interrupt is 10 Hz (period = 100 ms)

&amp;nbsp;&amp;nbsp;&amp;nbsp; // Wait 5 seconds before attempting to start user-application
&amp;nbsp;&amp;nbsp;&amp;nbsp; while( _g_BootloaderTimeout_100ms ){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_WWDT_Feed(LPC_WWDT);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }


....
} /* end main() */



void WatchdogInitialize(void)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; #define WD_TIMEOUT_SEC&amp;nbsp; ( 2 )
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; // Clear WD timeout flag
&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_WWDT_ClearStatusFlag(LPC_WWDT, WWDT_WDMOD_WDTOF);
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Watchdog config */
&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_WWDT_Init(LPC_WWDT);
&amp;nbsp;&amp;nbsp;&amp;nbsp; // WD clk source - IRC oscilator (12 MHz)
&amp;nbsp;&amp;nbsp;&amp;nbsp; // wd_clk_freq = 12 MHz / 4 = 3 MHz
&amp;nbsp;&amp;nbsp;&amp;nbsp; // Watchdog timeout set to WD_TIMEOUT_SEC second
&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_WWDT_SetTimeOut( LPC_WWDT, (3000000*WD_TIMEOUT_SEC) );
&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_WWDT_SetWarning( LPC_WWDT, 0 );
&amp;nbsp;&amp;nbsp;&amp;nbsp; // Don't reset MCU, only generate an interrupt
&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_WWDT_Start(LPC_WWDT);&amp;nbsp;&amp;nbsp;&amp;nbsp; // (sets WD option WDEN)
&amp;nbsp;&amp;nbsp;&amp;nbsp; NVIC_ClearPendingIRQ(WDT_IRQn);
&amp;nbsp;&amp;nbsp;&amp;nbsp; NVIC_EnableIRQ(WDT_IRQn);
}


&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 19:46:29 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T19:46:29Z</dc:date>
    <item>
      <title>Feeding watch dog on LPC11U24</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Feeding-watch-dog-on-LPC11U24/m-p/544888#M12950</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by Tobias Zvonc on Thu Sep 25 08:19:32 MST 2014&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm working on a second bootloader for LPC11U24, which uses USB HID for writing application to flash. I'm using LPCopen driver for LPC11Uxx.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;To make long story short, I initialize USB interface, watch dog and SysTick timer. The idea was to feed watch dog timer from SysTick interrupt handler every 100 ms (Watch dog timer constant is for 2 seconds WD timer period). However, if I do that, microcontroller is reseted for 2, 3 or more times as soon as it initializes. The worst part is that this varies - sometimes after reset everything is good, sometimes MCU is reseted for 2 or more times in a row.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;If I remove feeding watch dog from SysTick interrupt handler and feed it from while() loop in main(), everything is good. And if I remove feeding watch dog, MCU is reseted exactly every two seconds, and that confirms that watch dog is initialized correctly.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Does anybody have experience with this? I spent a day an a half trying to figure this out, and it doesn't make sense at all.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Here is relevant part of the code:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
void WDT_IRQHandler(void)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(Chip_WWDT_GetStatus(LPC_WWDT) &amp;amp; WWDT_WDMOD_WDTOF)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NVIC_SystemReset();
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}

void SysTick_Handler(void)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; // If we feed Watch dog from here, reset happens 2 or 3 (or more) times
&amp;nbsp;&amp;nbsp;&amp;nbsp; // in a row (every time different).
&amp;nbsp;&amp;nbsp;&amp;nbsp; //Chip_WWDT_Feed(LPC_WWDT);

&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( _g_IAPStarted ){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_GPIO_SetPinToggle(LPC_GPIO, PIN_LED2_RED);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; _g_BootloaderTimeout_100ms--;
}



int main(void)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint16_t calculatedCRC;
&amp;nbsp;&amp;nbsp;&amp;nbsp; volatile unsigned int delay;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Initialize board and chip */
BoardInitialization();
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; Reset_Signal();
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; // LED signals we are in bootloader.
&amp;nbsp;&amp;nbsp;&amp;nbsp; LedOn();
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; USBInit();

&amp;nbsp;&amp;nbsp;&amp;nbsp; #ifndef DEBUG
&amp;nbsp;&amp;nbsp;&amp;nbsp; WatchdogInitialize();
&amp;nbsp;&amp;nbsp;&amp;nbsp; #endif
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; SysTick_Config(SystemCoreClock/10); // frequency of SysTick interrupt is 10 Hz (period = 100 ms)

&amp;nbsp;&amp;nbsp;&amp;nbsp; // Wait 5 seconds before attempting to start user-application
&amp;nbsp;&amp;nbsp;&amp;nbsp; while( _g_BootloaderTimeout_100ms ){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_WWDT_Feed(LPC_WWDT);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }


....
} /* end main() */



void WatchdogInitialize(void)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; #define WD_TIMEOUT_SEC&amp;nbsp; ( 2 )
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; // Clear WD timeout flag
&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_WWDT_ClearStatusFlag(LPC_WWDT, WWDT_WDMOD_WDTOF);
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Watchdog config */
&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_WWDT_Init(LPC_WWDT);
&amp;nbsp;&amp;nbsp;&amp;nbsp; // WD clk source - IRC oscilator (12 MHz)
&amp;nbsp;&amp;nbsp;&amp;nbsp; // wd_clk_freq = 12 MHz / 4 = 3 MHz
&amp;nbsp;&amp;nbsp;&amp;nbsp; // Watchdog timeout set to WD_TIMEOUT_SEC second
&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_WWDT_SetTimeOut( LPC_WWDT, (3000000*WD_TIMEOUT_SEC) );
&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_WWDT_SetWarning( LPC_WWDT, 0 );
&amp;nbsp;&amp;nbsp;&amp;nbsp; // Don't reset MCU, only generate an interrupt
&amp;nbsp;&amp;nbsp;&amp;nbsp; Chip_WWDT_Start(LPC_WWDT);&amp;nbsp;&amp;nbsp;&amp;nbsp; // (sets WD option WDEN)
&amp;nbsp;&amp;nbsp;&amp;nbsp; NVIC_ClearPendingIRQ(WDT_IRQn);
&amp;nbsp;&amp;nbsp;&amp;nbsp; NVIC_EnableIRQ(WDT_IRQn);
}


&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 19:46:29 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Feeding-watch-dog-on-LPC11U24/m-p/544888#M12950</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T19:46:29Z</dc:date>
    </item>
    <item>
      <title>Re: Feeding watch dog on LPC11U24</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Feeding-watch-dog-on-LPC11U24/m-p/544889#M12951</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by Tobias Zvonc on Sat Sep 27 02:57:05 MST 2014&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Problem solved. :D&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Watch dog feed from while() loop in main() was interrupted by feed from SysTick handler, which resulted with incorrect feed, leading to system reset. :)&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 19:46:29 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Feeding-watch-dog-on-LPC11U24/m-p/544889#M12951</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T19:46:29Z</dc:date>
    </item>
  </channel>
</rss>

