lkvzxklzvxckl

Dependencies:   mbed

Committer:
jwalker366
Date:
Sun Dec 04 23:58:57 2022 +0000
Revision:
0:afb155f7a4f3
lkxcklvzcxkl

Who changed what in which revision?

UserRevisionLine numberNew 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