Kenneth Swanson
/
4180-lab1-basic-io
~
Revision 4:cdcf29f5d75b, committed 2016-09-12
- Comitter:
- fkhan39
- Date:
- Mon Sep 12 21:18:43 2016 +0000
- Parent:
- 2:f131a1777c54
- Commit message:
- watchdog timer
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r f131a1777c54 -r cdcf29f5d75b main.cpp --- a/main.cpp Mon Sep 12 20:53:25 2016 +0000 +++ b/main.cpp Mon Sep 12 21:18:43 2016 +0000 @@ -19,9 +19,43 @@ PwmOut rgb_b(p22); PwmOut rgb_r(p23); PwmOut rgb_g(p24); +// WATCHDOG +DigitalOut myled1(LED1); //in main loop part 1 +DigitalOut myled2(LED2); //in main loop part 2 (where fault occurs) +DigitalOut myled3(LED3); //The pushbutton or power on caused a reset +DigitalOut myled4(LED4); //The watchdog timer caused a reset + +// Simon's Watchdog code from +// http://mbed.org/forum/mbed/topic/508/ +class Watchdog { +public: +// Load timeout value in watchdog timer and enable + void kick(float s) { + LPC_WDT->WDCLKSEL = 0x1; // Set CLK src to PCLK + uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4 + LPC_WDT->WDTC = s * (float)clk; + LPC_WDT->WDMOD = 0x3; // Enabled and Reset + kick(); + } +// "kick" or "feed" the dog - reset the watchdog timer +// by writing this required bit pattern + void kick() { + LPC_WDT->WDFEED = 0xAA; + LPC_WDT->WDFEED = 0x55; + } +}; +Watchdog wdt; int main() { + int count = 0; +// On reset, indicate a watchdog reset or a pushbutton reset on LED 4 or 3 + if ((LPC_WDT->WDMOD >> 2) & 1) + myled4 = 1; else myled3 = 1; + +// setup a 10 second timeout on watchdog timer hardware +// needs to be longer than worst case main loop exection time + wdt.kick(5.0); // 2 dip_switch1.mode(PullUp); // configure internal pull up resistor dip_switch2.mode(PullUp); @@ -55,7 +89,11 @@ chip.write(PORT_A, switch_state); wait(.2); // yellow led should change opposite the green led - + if (count == 12) while (1) {}; + // LED 2 will stay on during the fault + count ++; + // End of main loop so "kick" to reset watchdog timer and avoid a reset + wdt.kick(); // RGB led control rgb_r = control_pot; rgb_g = 0.5f - control_pot;