Jared Walker
/
Lab1_C1
lkvzxklzvxckl
main.cpp@0:afb155f7a4f3, 22 months ago (annotated)
- Committer:
- jwalker366
- Date:
- Sun Dec 04 23:58:57 2022 +0000
- Revision:
- 0:afb155f7a4f3
lkxcklvzcxkl
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jwalker366 | 0:afb155f7a4f3 | 1 | #include "mbed.h" |
jwalker366 | 0:afb155f7a4f3 | 2 | DigitalOut internalLED(LED1); |
jwalker366 | 0:afb155f7a4f3 | 3 | DigitalOut myled(p18); |
jwalker366 | 0:afb155f7a4f3 | 4 | DigitalIn pb(p26); |
jwalker366 | 0:afb155f7a4f3 | 5 | |
jwalker366 | 0:afb155f7a4f3 | 6 | // LEDs used to indicate code activity and reset source |
jwalker366 | 0:afb155f7a4f3 | 7 | DigitalOut myled1(LED1); //in main loop part 1 |
jwalker366 | 0:afb155f7a4f3 | 8 | DigitalOut myled2(LED2); //in main loop part 2 (where fault occurs) |
jwalker366 | 0:afb155f7a4f3 | 9 | DigitalOut myled3(LED3); //The pushbutton or power on caused a reset |
jwalker366 | 0:afb155f7a4f3 | 10 | DigitalOut myled4(LED4); //The watchdog timer caused a reset |
jwalker366 | 0:afb155f7a4f3 | 11 | // SPST Pushbutton demo using internal PullUp function |
jwalker366 | 0:afb155f7a4f3 | 12 | // no external PullUp resistor needed |
jwalker366 | 0:afb155f7a4f3 | 13 | // Pushbutton from P8 to GND. |
jwalker366 | 0:afb155f7a4f3 | 14 | |
jwalker366 | 0:afb155f7a4f3 | 15 | class Watchdog { |
jwalker366 | 0:afb155f7a4f3 | 16 | public: |
jwalker366 | 0:afb155f7a4f3 | 17 | // Load timeout value in watchdog timer and enable |
jwalker366 | 0:afb155f7a4f3 | 18 | void kick(float s) { |
jwalker366 | 0:afb155f7a4f3 | 19 | LPC_WDT->WDCLKSEL = 0x1; // Set CLK src to PCLK |
jwalker366 | 0:afb155f7a4f3 | 20 | uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4 |
jwalker366 | 0:afb155f7a4f3 | 21 | LPC_WDT->WDTC = s * (float)clk; |
jwalker366 | 0:afb155f7a4f3 | 22 | LPC_WDT->WDMOD = 0x3; // Enabled and Reset |
jwalker366 | 0:afb155f7a4f3 | 23 | kick(); |
jwalker366 | 0:afb155f7a4f3 | 24 | } |
jwalker366 | 0:afb155f7a4f3 | 25 | // "kick" or "feed" the dog - reset the watchdog timer |
jwalker366 | 0:afb155f7a4f3 | 26 | // by writing this required bit pattern |
jwalker366 | 0:afb155f7a4f3 | 27 | void kick() { |
jwalker366 | 0:afb155f7a4f3 | 28 | LPC_WDT->WDFEED = 0xAA; |
jwalker366 | 0:afb155f7a4f3 | 29 | LPC_WDT->WDFEED = 0x55; |
jwalker366 | 0:afb155f7a4f3 | 30 | } |
jwalker366 | 0:afb155f7a4f3 | 31 | }; |
jwalker366 | 0:afb155f7a4f3 | 32 | |
jwalker366 | 0:afb155f7a4f3 | 33 | // Setup the watchdog timer |
jwalker366 | 0:afb155f7a4f3 | 34 | Watchdog wdt; |
jwalker366 | 0:afb155f7a4f3 | 35 | |
jwalker366 | 0:afb155f7a4f3 | 36 | int main() { |
jwalker366 | 0:afb155f7a4f3 | 37 | pb.mode(PullUp); |
jwalker366 | 0:afb155f7a4f3 | 38 | int count = 0; |
jwalker366 | 0:afb155f7a4f3 | 39 | // On reset, indicate a watchdog reset or a pushbutton reset on LED 4 or 3 |
jwalker366 | 0:afb155f7a4f3 | 40 | if ((LPC_WDT->WDMOD >> 2) & 1) |
jwalker366 | 0:afb155f7a4f3 | 41 | myled4 = 1; else myled3 = 1; |
jwalker366 | 0:afb155f7a4f3 | 42 | |
jwalker366 | 0:afb155f7a4f3 | 43 | // setup a 10 second timeout on watchdog timer hardware |
jwalker366 | 0:afb155f7a4f3 | 44 | // needs to be longer than worst case main loop exection time |
jwalker366 | 0:afb155f7a4f3 | 45 | wdt.kick(10.0); |
jwalker366 | 0:afb155f7a4f3 | 46 | |
jwalker366 | 0:afb155f7a4f3 | 47 | // Main program loop - resets watchdog once each loop iteration |
jwalker366 | 0:afb155f7a4f3 | 48 | // Would typically have a lot of code in loop with many calls |
jwalker366 | 0:afb155f7a4f3 | 49 | while (1) { |
jwalker366 | 0:afb155f7a4f3 | 50 | myled1 = 1; //Flash LEDs 1 & 2 to indicate normal loop activity |
jwalker366 | 0:afb155f7a4f3 | 51 | wait(.05); |
jwalker366 | 0:afb155f7a4f3 | 52 | myled1 = 0; |
jwalker366 | 0:afb155f7a4f3 | 53 | myled2 = 1; |
jwalker366 | 0:afb155f7a4f3 | 54 | wait(.05); |
jwalker366 | 0:afb155f7a4f3 | 55 | // Simulate a fault lock up with an infinite while loop, but only after 25 loop iterations |
jwalker366 | 0:afb155f7a4f3 | 56 | if (count == 25) while (1) {}; |
jwalker366 | 0:afb155f7a4f3 | 57 | // LED 2 will stay on during the fault |
jwalker366 | 0:afb155f7a4f3 | 58 | myled2 = 0; |
jwalker366 | 0:afb155f7a4f3 | 59 | count ++; |
jwalker366 | 0:afb155f7a4f3 | 60 | // End of main loop so "kick" to reset watchdog timer and avoid a reset |
jwalker366 | 0:afb155f7a4f3 | 61 | wdt.kick(); |
jwalker366 | 0:afb155f7a4f3 | 62 | |
jwalker366 | 0:afb155f7a4f3 | 63 | myled = !pb; |
jwalker366 | 0:afb155f7a4f3 | 64 | internalLED = pb; |
jwalker366 | 0:afb155f7a4f3 | 65 | } |
jwalker366 | 0:afb155f7a4f3 | 66 | } |
jwalker366 | 0:afb155f7a4f3 | 67 |