This provides a basic Watchdog service, and includes a startup detection to determine if the reset was caused by the WD.
Dependents: A_CANAdapter LeonardoMbos AVC_2012 RT_CAN ... more
Using this Watchdog Class
#include "Watchdog.h" Watchdog wd; ... void main() { if (wd.WatchdogCausedReset()) pc.printf("Watchdog caused reset.\r\n"); wd.Configure(3.0); // sets the timeout interval for (;;) { wd.Service(); // kick the dog before the timeout // do other work } }
Diff: Watchdog.cpp
- Revision:
- 5:2dad2a78ffbd
- Parent:
- 3:5959d3d35221
diff -r 22c5c4aa4661 -r 2dad2a78ffbd Watchdog.cpp --- a/Watchdog.cpp Sat Oct 11 17:28:07 2014 +0000 +++ b/Watchdog.cpp Mon Mar 16 01:00:03 2015 +0000 @@ -15,7 +15,7 @@ #include "mbed.h" #include "Watchdog.h" - +#if defined( TARGET_LPC1768 ) /// Watchdog gets instantiated at the module level Watchdog::Watchdog() { wdreset = (LPC_WDT->WDMOD >> 2) & 1; // capture the cause of the previous reset @@ -41,5 +41,60 @@ bool Watchdog::WatchdogCausedReset() { return wdreset; } +#elif defined( TARGET_LPC4088 ) +// from Gesotec Gesotec +/// Watchdog gets instantiated at the module level +Watchdog::Watchdog() { + wdreset = (LPC_WDT->MOD >> 2) & 1; // capture the cause of the previous reset +} + +/// Load timeout value in watchdog timer and enable +void Watchdog::Configure(float s) { + //LPC_WDT->CLKSEL = 0x1; // Set CLK src to PCLK + uint32_t clk = 500000 / 4; // WD has a fixed /4 prescaler, and a 500khz oscillator + LPC_WDT->TC = (uint32_t)(s * (float)clk); + LPC_WDT->MOD = 0x3; // Enabled and Reset + Service(); +} + +/// "Service", "kick" or "feed" the dog - reset the watchdog timer +/// by writing this required bit pattern +void Watchdog::Service() { + LPC_WDT->FEED = 0xAA; + LPC_WDT->FEED = 0x55; +} + +/// get the flag to indicate if the watchdog causes the reset +bool Watchdog::WatchdogCausedReset() { + return wdreset; +} +#elif defined( TARGET_STM ) +// Derived from Chau Vo +/// Watchdog gets instantiated at the module level +Watchdog::Watchdog() { + wdreset = (RCC->CSR & (1<<29)) ? true : false; // read the IWDGRSTF (Independent WD, not the windows WD) +} +/// Load timeout value in watchdog timer and enable +void Watchdog::Configure(int pr) { + // http://www.st.com/web/en/resource/technical/document/reference_manual/CD00171190.pdf + IWDG->KR = 0x5555; // enable write to PR, RLR + IWDG->PR = pr; // Init prescaler, page 486 Reference Manual + IWDG->RLR = 0xFFF; // Init RLR + IWDG->KR = 0xAAAA; // Reload the watchdog + IWDG->KR = 0xCCCC; // Starts the WD +} +/// "Service", "kick" or "feed" the dog - reset the watchdog timer +void Watchdog::Service() { + IWDG->KR = 0xAAAA; +} + +/// get the flag to indicate if the watchdog causes the reset +bool Watchdog::WatchdogCausedReset() { + if (wdreset) { + RCC->CSR |= (1<<24); // clear reset flag + } + return wdreset; +} +#endif