+++

Fork of Watchdog by David Smart

Revision:
5:2dad2a78ffbd
Parent:
3:5959d3d35221
Child:
7:3c9146d9a65f
--- 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