Added definition for LCP11u24 and LCP11u24

Fork of Watchdog by David Smart

I added support for LPC11U24, ARCH GPRS and ARCH GPRS V2

Committer:
kinan
Date:
Tue Mar 17 18:12:08 2015 +0000
Revision:
7:00706eb585ce
Parent:
5:2dad2a78ffbd
Added a watchdog

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WiredHome 2:2873f068f325 1 /// @file Watchdog.cpp provides the interface to the Watchdog module
WiredHome 2:2873f068f325 2 ///
WiredHome 2:2873f068f325 3 /// This provides basic Watchdog service for the mbed. You can configure
WiredHome 2:2873f068f325 4 /// various timeout intervals that meet your system needs. Additionally,
WiredHome 2:2873f068f325 5 /// it is possible to identify if the Watchdog was the cause of any
WiredHome 2:2873f068f325 6 /// system restart.
WiredHome 2:2873f068f325 7 ///
WiredHome 2:2873f068f325 8 /// Adapted from Simon's Watchdog code from http://mbed.org/forum/mbed/topic/508/
WiredHome 2:2873f068f325 9 ///
WiredHome 2:2873f068f325 10 /// @note Copyright © 2011 by Smartware Computing, all rights reserved.
WiredHome 2:2873f068f325 11 /// This software may be used to derive new software, as long as
WiredHome 2:2873f068f325 12 /// this copyright statement remains in the source file.
WiredHome 2:2873f068f325 13 /// @author David Smart
WiredHome 2:2873f068f325 14 ///
WiredHome 0:7a316f14da9c 15 #include "mbed.h"
WiredHome 0:7a316f14da9c 16 #include "Watchdog.h"
WiredHome 0:7a316f14da9c 17
WiredHome 5:2dad2a78ffbd 18 #if defined( TARGET_LPC1768 )
WiredHome 0:7a316f14da9c 19 /// Watchdog gets instantiated at the module level
WiredHome 0:7a316f14da9c 20 Watchdog::Watchdog() {
WiredHome 2:2873f068f325 21 wdreset = (LPC_WDT->WDMOD >> 2) & 1; // capture the cause of the previous reset
WiredHome 0:7a316f14da9c 22 }
WiredHome 0:7a316f14da9c 23
WiredHome 0:7a316f14da9c 24 /// Load timeout value in watchdog timer and enable
WiredHome 0:7a316f14da9c 25 void Watchdog::Configure(float s) {
WiredHome 0:7a316f14da9c 26 LPC_WDT->WDCLKSEL = 0x1; // Set CLK src to PCLK
WiredHome 0:7a316f14da9c 27 uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4
WiredHome 2:2873f068f325 28 LPC_WDT->WDTC = (uint32_t)(s * (float)clk);
WiredHome 0:7a316f14da9c 29 LPC_WDT->WDMOD = 0x3; // Enabled and Reset
WiredHome 0:7a316f14da9c 30 Service();
WiredHome 0:7a316f14da9c 31 }
WiredHome 0:7a316f14da9c 32
WiredHome 0:7a316f14da9c 33 /// "Service", "kick" or "feed" the dog - reset the watchdog timer
WiredHome 0:7a316f14da9c 34 /// by writing this required bit pattern
WiredHome 0:7a316f14da9c 35 void Watchdog::Service() {
WiredHome 0:7a316f14da9c 36 LPC_WDT->WDFEED = 0xAA;
WiredHome 0:7a316f14da9c 37 LPC_WDT->WDFEED = 0x55;
WiredHome 0:7a316f14da9c 38 }
WiredHome 0:7a316f14da9c 39
WiredHome 0:7a316f14da9c 40 /// get the flag to indicate if the watchdog causes the reset
WiredHome 0:7a316f14da9c 41 bool Watchdog::WatchdogCausedReset() {
WiredHome 0:7a316f14da9c 42 return wdreset;
WiredHome 0:7a316f14da9c 43 }
kinan 7:00706eb585ce 44 #elif defined(TARGET_ARCH_GPRS) || defined(TARGET_LPC11U24)
kinan 7:00706eb585ce 45 /// Watchdog gets instantiated at the module level
kinan 7:00706eb585ce 46 Watchdog::Watchdog() {
kinan 7:00706eb585ce 47 wdreset = (LPC_WWDT->MOD >> 2) & 1; // capture the cause of the previous reset
kinan 7:00706eb585ce 48 }
kinan 7:00706eb585ce 49
kinan 7:00706eb585ce 50 void Watchdog::Configure(float s) {
kinan 7:00706eb585ce 51 LPC_SYSCON->SYSAHBCLKCTRL |= 0x8000;
kinan 7:00706eb585ce 52 LPC_SYSCON->PDRUNCFG &= 0xFFBF;
kinan 7:00706eb585ce 53 LPC_SYSCON->WDTOSCCTRL = 0x40;
kinan 7:00706eb585ce 54
kinan 7:00706eb585ce 55 uint32_t clk = 100000;
kinan 7:00706eb585ce 56 LPC_WWDT->TC = s * (float)clk;
kinan 7:00706eb585ce 57
kinan 7:00706eb585ce 58 LPC_WWDT->CLKSEL = 0x1; // Set CLK src to PCLK
kinan 7:00706eb585ce 59 LPC_WWDT->MOD = 0x3; // Enabled and Reset
kinan 7:00706eb585ce 60 Service();
kinan 7:00706eb585ce 61 }
kinan 7:00706eb585ce 62
kinan 7:00706eb585ce 63 /// "Service", "kick" or "feed" the dog - reset the watchdog timer
kinan 7:00706eb585ce 64 /// by writing this required bit pattern
kinan 7:00706eb585ce 65 void Watchdog::Service() {
kinan 7:00706eb585ce 66 LPC_WWDT->FEED = 0xAA;
kinan 7:00706eb585ce 67 LPC_WWDT->FEED = 0x55;
kinan 7:00706eb585ce 68 }
kinan 7:00706eb585ce 69
kinan 7:00706eb585ce 70 /// get the flag to indicate if the watchdog causes the reset
kinan 7:00706eb585ce 71 bool Watchdog::WatchdogCausedReset() {
kinan 7:00706eb585ce 72 return wdreset;
kinan 7:00706eb585ce 73 }
WiredHome 5:2dad2a78ffbd 74 #elif defined( TARGET_LPC4088 )
WiredHome 5:2dad2a78ffbd 75 // from Gesotec Gesotec
WiredHome 5:2dad2a78ffbd 76 /// Watchdog gets instantiated at the module level
WiredHome 5:2dad2a78ffbd 77 Watchdog::Watchdog() {
WiredHome 5:2dad2a78ffbd 78 wdreset = (LPC_WDT->MOD >> 2) & 1; // capture the cause of the previous reset
WiredHome 5:2dad2a78ffbd 79 }
WiredHome 5:2dad2a78ffbd 80
WiredHome 5:2dad2a78ffbd 81 /// Load timeout value in watchdog timer and enable
WiredHome 5:2dad2a78ffbd 82 void Watchdog::Configure(float s) {
WiredHome 5:2dad2a78ffbd 83 //LPC_WDT->CLKSEL = 0x1; // Set CLK src to PCLK
WiredHome 5:2dad2a78ffbd 84 uint32_t clk = 500000 / 4; // WD has a fixed /4 prescaler, and a 500khz oscillator
WiredHome 5:2dad2a78ffbd 85 LPC_WDT->TC = (uint32_t)(s * (float)clk);
WiredHome 5:2dad2a78ffbd 86 LPC_WDT->MOD = 0x3; // Enabled and Reset
WiredHome 5:2dad2a78ffbd 87 Service();
WiredHome 5:2dad2a78ffbd 88 }
WiredHome 5:2dad2a78ffbd 89
WiredHome 5:2dad2a78ffbd 90 /// "Service", "kick" or "feed" the dog - reset the watchdog timer
WiredHome 5:2dad2a78ffbd 91 /// by writing this required bit pattern
WiredHome 5:2dad2a78ffbd 92 void Watchdog::Service() {
WiredHome 5:2dad2a78ffbd 93 LPC_WDT->FEED = 0xAA;
WiredHome 5:2dad2a78ffbd 94 LPC_WDT->FEED = 0x55;
WiredHome 5:2dad2a78ffbd 95 }
WiredHome 5:2dad2a78ffbd 96
WiredHome 5:2dad2a78ffbd 97 /// get the flag to indicate if the watchdog causes the reset
WiredHome 5:2dad2a78ffbd 98 bool Watchdog::WatchdogCausedReset() {
WiredHome 5:2dad2a78ffbd 99 return wdreset;
WiredHome 5:2dad2a78ffbd 100 }
WiredHome 5:2dad2a78ffbd 101 #elif defined( TARGET_STM )
WiredHome 5:2dad2a78ffbd 102 // Derived from Chau Vo
WiredHome 5:2dad2a78ffbd 103 /// Watchdog gets instantiated at the module level
WiredHome 5:2dad2a78ffbd 104 Watchdog::Watchdog() {
WiredHome 5:2dad2a78ffbd 105 wdreset = (RCC->CSR & (1<<29)) ? true : false; // read the IWDGRSTF (Independent WD, not the windows WD)
WiredHome 5:2dad2a78ffbd 106 }
WiredHome 0:7a316f14da9c 107
WiredHome 5:2dad2a78ffbd 108 /// Load timeout value in watchdog timer and enable
WiredHome 5:2dad2a78ffbd 109 void Watchdog::Configure(int pr) {
WiredHome 5:2dad2a78ffbd 110 // http://www.st.com/web/en/resource/technical/document/reference_manual/CD00171190.pdf
WiredHome 5:2dad2a78ffbd 111 IWDG->KR = 0x5555; // enable write to PR, RLR
WiredHome 5:2dad2a78ffbd 112 IWDG->PR = pr; // Init prescaler, page 486 Reference Manual
WiredHome 5:2dad2a78ffbd 113 IWDG->RLR = 0xFFF; // Init RLR
WiredHome 5:2dad2a78ffbd 114 IWDG->KR = 0xAAAA; // Reload the watchdog
WiredHome 5:2dad2a78ffbd 115 IWDG->KR = 0xCCCC; // Starts the WD
WiredHome 5:2dad2a78ffbd 116 }
WiredHome 0:7a316f14da9c 117
WiredHome 5:2dad2a78ffbd 118 /// "Service", "kick" or "feed" the dog - reset the watchdog timer
WiredHome 5:2dad2a78ffbd 119 void Watchdog::Service() {
WiredHome 5:2dad2a78ffbd 120 IWDG->KR = 0xAAAA;
WiredHome 5:2dad2a78ffbd 121 }
WiredHome 5:2dad2a78ffbd 122
WiredHome 5:2dad2a78ffbd 123 /// get the flag to indicate if the watchdog causes the reset
WiredHome 5:2dad2a78ffbd 124 bool Watchdog::WatchdogCausedReset() {
WiredHome 5:2dad2a78ffbd 125 if (wdreset) {
WiredHome 5:2dad2a78ffbd 126 RCC->CSR |= (1<<24); // clear reset flag
WiredHome 5:2dad2a78ffbd 127 }
WiredHome 5:2dad2a78ffbd 128 return wdreset;
WiredHome 5:2dad2a78ffbd 129 }
WiredHome 5:2dad2a78ffbd 130 #endif