WatchDog Timer library, support for LPC1768 and LPC11U24
Dependents: ECGAFE_copy WatchDog
Fork of WatchDog by
Diff: WatchDog.cpp
- Revision:
- 0:bbc789f8d849
- Child:
- 2:a6661a79bf7b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WatchDog.cpp Sun Jul 01 22:43:25 2012 +0000 @@ -0,0 +1,97 @@ +/* +* Source code is free to use and distribute. +* Software originally written by Simon Ford, +* altered by Lerche. +* +* 02-07-2012 - Added LPC11U24 Watchdog functions. Lerche +* +*/ + +#include "mbed.h" +#include "WatchDog.h" + + +WatchDog::WatchDog(float s) { +#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) + LPC_WDT->WDCLKSEL = 0x1; // Set CLK src to PCLK + uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4 + LPC_WDT->WDTC = s * (float)clk; // Load WD Timer Constant with value determined by float s + LPC_WDT->WDMOD = 0x3; // Enabled and Reset + feed(); +#elif defined(TARGET_LPC11U24) + LPC_SYSCON->SYSAHBCLKCTRL |= 0x8000; + LPC_SYSCON->PDRUNCFG &= 0xFFBF; + LPC_SYSCON->WDTOSCCTRL = 0x40; + uint32_t clk = 100000; + LPC_WWDT->TC = s * (float)clk; + LPC_WWDT->CLKSEL = 0x1; + LPC_WWDT->MOD = 0x3; + feed(); +#endif +} + +WatchDog_ms::WatchDog_ms(int ms) { +#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) + LPC_WDT->WDCLKSEL = 0x1; // Set CLK src to PCLK + uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4 + LPC_WDT->WDTC = ((float)ms * (float)clk) /1000; // Load WD Timer Constant with value determined by int ms + LPC_WDT->WDMOD = 0x3; // Enabled and Reset + feed(); +#elif defined(TARGET_LPC11U24) + LPC_SYSCON->SYSAHBCLKCTRL |= 0x8000; + LPC_SYSCON->PDRUNCFG &= 0xFFBF; + LPC_SYSCON->WDTOSCCTRL = 0x40; + uint32_t clk = 100000; + LPC_WWDT->TC = ((float)ms * (float)clk) / 1000; + LPC_WWDT->CLKSEL = 0x1; + LPC_WWDT->MOD = 0x3; + feed(); +#endif +} + +WatchDog_us::WatchDog_us(int us) { +#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) + LPC_WDT->WDCLKSEL = 0x1; // Set CLK src to PCLK + uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4 + LPC_WDT->WDTC = ((float)us * (float)clk) /1000000; // Load WD Timer Constant with value determined by int us + LPC_WDT->WDMOD = 0x3; // Enabled and Reset + feed(); +#elif defined(TARGET_LPC11U24) + LPC_SYSCON->SYSAHBCLKCTRL |= 0x8000; + LPC_SYSCON->PDRUNCFG &= 0xFFBF; + LPC_SYSCON->WDTOSCCTRL = 0x40; + uint32_t clk = 100000; + LPC_WWDT->TC = ((float)us * (float)clk) / 1000000; + LPC_WWDT->CLKSEL = 0x1; + LPC_WWDT->MOD = 0x3; + feed(); +#endif +} + +void WatchDog::feed() { +#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) + LPC_WDT->WDFEED = 0xAA; // Routine to feed the WatchDog + LPC_WDT->WDFEED = 0x55; // according to user manual +#elif defined(TARGET_LPC11U24) + LPC_WWDT->FEED = 0xAA; + LPC_WWDT->FEED = 0x55; +#endif +} +void WatchDog_ms::feed() { +#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) + LPC_WDT->WDFEED = 0xAA; // Routine to feed the WatchDog + LPC_WDT->WDFEED = 0x55; // according to user manual +#elif defined(TARGET_LPC11U24) + LPC_WWDT->FEED = 0xAA; + LPC_WWDT->FEED = 0x55; +#endif +} +void WatchDog_us::feed() { +#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) + LPC_WDT->WDFEED = 0xAA; // Routine to feed the WatchDog + LPC_WDT->WDFEED = 0x55; // according to user manual +#elif defined(TARGET_LPC11U24) + LPC_WWDT->FEED = 0xAA; + LPC_WWDT->FEED = 0x55; +#endif +}