Igor Galarraga
/
WatchdogExample
Completion of http://mbed.org/users/simon/programs/WatchdogExample
main.cpp@0:f6684fa81520, 2012-04-21 (annotated)
- Committer:
- IgorGZ
- Date:
- Sat Apr 21 14:38:29 2012 +0000
- Revision:
- 0:f6684fa81520
WatchdogExample with power up state detect.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
IgorGZ | 0:f6684fa81520 | 1 | #include "mbed.h" |
IgorGZ | 0:f6684fa81520 | 2 | |
IgorGZ | 0:f6684fa81520 | 3 | DigitalOut led(LED1); |
IgorGZ | 0:f6684fa81520 | 4 | |
IgorGZ | 0:f6684fa81520 | 5 | class Watchdog { |
IgorGZ | 0:f6684fa81520 | 6 | public: |
IgorGZ | 0:f6684fa81520 | 7 | void kick(float s) { |
IgorGZ | 0:f6684fa81520 | 8 | LPC_WDT->WDCLKSEL = 0x1; // Set CLK src to PCLK |
IgorGZ | 0:f6684fa81520 | 9 | uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4 |
IgorGZ | 0:f6684fa81520 | 10 | LPC_WDT->WDTC = s * (float)clk; |
IgorGZ | 0:f6684fa81520 | 11 | LPC_WDT->WDMOD = (LPC_WDT->WDMOD|0x3); // Enabled and Reset, without clear WD time-out flag. |
IgorGZ | 0:f6684fa81520 | 12 | kick(); |
IgorGZ | 0:f6684fa81520 | 13 | } |
IgorGZ | 0:f6684fa81520 | 14 | |
IgorGZ | 0:f6684fa81520 | 15 | void kick() { |
IgorGZ | 0:f6684fa81520 | 16 | LPC_WDT->WDFEED = 0xAA; |
IgorGZ | 0:f6684fa81520 | 17 | LPC_WDT->WDFEED = 0x55; |
IgorGZ | 0:f6684fa81520 | 18 | } |
IgorGZ | 0:f6684fa81520 | 19 | |
IgorGZ | 0:f6684fa81520 | 20 | /* You only can do IsWatchdogReset once... because flag must be cleared. */ |
IgorGZ | 0:f6684fa81520 | 21 | bool IsWatchdogReset() { |
IgorGZ | 0:f6684fa81520 | 22 | if (LPC_WDT->WDMOD & 0x4) { |
IgorGZ | 0:f6684fa81520 | 23 | LPC_WDT->WDMOD=(LPC_WDT->WDMOD&(~0x4)); /* Clear timeout flag. */ |
IgorGZ | 0:f6684fa81520 | 24 | return true; |
IgorGZ | 0:f6684fa81520 | 25 | } |
IgorGZ | 0:f6684fa81520 | 26 | else return false; |
IgorGZ | 0:f6684fa81520 | 27 | } |
IgorGZ | 0:f6684fa81520 | 28 | }; |
IgorGZ | 0:f6684fa81520 | 29 | |
IgorGZ | 0:f6684fa81520 | 30 | Watchdog w; |
IgorGZ | 0:f6684fa81520 | 31 | |
IgorGZ | 0:f6684fa81520 | 32 | int main() { |
IgorGZ | 0:f6684fa81520 | 33 | /* First activate WD */ |
IgorGZ | 0:f6684fa81520 | 34 | w.kick(2.5); |
IgorGZ | 0:f6684fa81520 | 35 | |
IgorGZ | 0:f6684fa81520 | 36 | printf("Hello World!\n"); |
IgorGZ | 0:f6684fa81520 | 37 | |
IgorGZ | 0:f6684fa81520 | 38 | if (w.IsWatchdogReset()) |
IgorGZ | 0:f6684fa81520 | 39 | printf("MAIN: WD RESET Power up!!\r\n"); |
IgorGZ | 0:f6684fa81520 | 40 | |
IgorGZ | 0:f6684fa81520 | 41 | int hang = 0; |
IgorGZ | 0:f6684fa81520 | 42 | while(1) { |
IgorGZ | 0:f6684fa81520 | 43 | printf("loop...\n"); |
IgorGZ | 0:f6684fa81520 | 44 | wait(0.1); |
IgorGZ | 0:f6684fa81520 | 45 | |
IgorGZ | 0:f6684fa81520 | 46 | if(hang == 10) { |
IgorGZ | 0:f6684fa81520 | 47 | while(1); |
IgorGZ | 0:f6684fa81520 | 48 | } |
IgorGZ | 0:f6684fa81520 | 49 | |
IgorGZ | 0:f6684fa81520 | 50 | w.kick(); |
IgorGZ | 0:f6684fa81520 | 51 | hang++; |
IgorGZ | 0:f6684fa81520 | 52 | } |
IgorGZ | 0:f6684fa81520 | 53 | } |