C:/nxpdrv/LPC1700CMSIS/Drivers/source/lpc17xx_wdt.c
Go to the documentation of this file.00001 00020 /* Peripheral group ----------------------------------------------------------- */ 00025 /* Includes ------------------------------------------------------------------- */ 00026 #include "lpc17xx_wdt.h" 00027 #include "lpc17xx_clkpwr.h" 00028 #include "lpc17xx_pinsel.h" 00029 00030 00031 /* If this source file built with example, the LPC17xx FW library configuration 00032 * file in each example directory ("lpc17xx_libcfg.h") must be included, 00033 * otherwise the default FW library configuration file must be included instead 00034 */ 00035 #ifdef __BUILD_WITH_EXAMPLE__ 00036 #include "lpc17xx_libcfg.h" 00037 #else 00038 #include "lpc17xx_libcfg_default.h" 00039 #endif /* __BUILD_WITH_EXAMPLE__ */ 00040 00041 00042 #ifdef _WDT 00043 00044 /* Private Functions ---------------------------------------------------------- */ 00049 /********************************************************************/ 00055 uint8_t WDT_SetTimeOut (uint8_t clk_source, uint32_t timeout) 00056 { 00057 00058 uint32_t pclk_wdt = 0; 00059 uint32_t tempval = 0; 00060 00061 switch ((WDT_CLK_OPT) clk_source) 00062 { 00063 case WDT_CLKSRC_IRC: 00064 pclk_wdt = 4000000; 00065 // Calculate TC in WDT 00066 tempval = (((pclk_wdt) / WDT_US_INDEX) * (timeout / 4)); 00067 // Check if it valid 00068 if ((tempval >= WDT_TIMEOUT_MIN) && (tempval <= WDT_TIMEOUT_MAX)) 00069 { 00070 LPC_WDT->WDTC = tempval; 00071 return SUCCESS; 00072 } 00073 00074 break; 00075 00076 case WDT_CLKSRC_PCLK: 00077 00078 // Get WDT clock with CCLK divider = 4 00079 pclk_wdt = SystemCoreClock / 4; 00080 // Calculate TC in WDT 00081 tempval = (((pclk_wdt) / WDT_US_INDEX) * (timeout / 4)); 00082 00083 if ((tempval >= WDT_TIMEOUT_MIN) && (tempval <= WDT_TIMEOUT_MAX)) 00084 { 00085 CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_WDT, CLKPWR_PCLKSEL_CCLK_DIV_4); 00086 LPC_WDT->WDTC = (uint32_t) tempval; 00087 return SUCCESS; 00088 } 00089 00090 // Get WDT clock with CCLK divider = 2 00091 pclk_wdt = SystemCoreClock / 2; 00092 // Calculate TC in WDT 00093 tempval = (((pclk_wdt) / WDT_US_INDEX) * (timeout / 4)); 00094 00095 if ((tempval >= WDT_TIMEOUT_MIN) && (tempval <= WDT_TIMEOUT_MAX)) 00096 { 00097 CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_WDT, CLKPWR_PCLKSEL_CCLK_DIV_2); 00098 LPC_WDT->WDTC = (uint32_t) tempval; 00099 return SUCCESS; 00100 } 00101 00102 // Get WDT clock with CCLK divider = 1 00103 pclk_wdt = SystemCoreClock; 00104 // Calculate TC in WDT 00105 tempval = (((pclk_wdt) / WDT_US_INDEX) * (timeout / 4)); 00106 00107 if ((tempval >= WDT_TIMEOUT_MIN) && (tempval <= WDT_TIMEOUT_MAX)) 00108 { 00109 CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_WDT, CLKPWR_PCLKSEL_CCLK_DIV_1); 00110 LPC_WDT->WDTC = (uint32_t) tempval; 00111 return SUCCESS; 00112 } 00113 break ; 00114 00115 00116 case WDT_CLKSRC_RTC: 00117 pclk_wdt = 32768; 00118 // Calculate TC in WDT 00119 tempval = (((pclk_wdt) / WDT_US_INDEX) * (timeout / 4)); 00120 // Check if it valid 00121 if ((tempval >= WDT_TIMEOUT_MIN) && (tempval <= WDT_TIMEOUT_MAX)) 00122 { 00123 LPC_WDT->WDTC = (uint32_t) tempval; 00124 return SUCCESS; 00125 } 00126 00127 break; 00128 00129 // Error parameter 00130 default: 00131 break; 00132 } 00133 00134 return ERROR; 00135 } 00136 00142 /* Public Functions ----------------------------------------------------------- */ 00148 /*********************************************************************/ 00162 void WDT_Init (uint32_t ClkSrc, uint32_t WDTMode) 00163 { 00164 CHECK_PARAM(PARAM_WDT_CLK_OPT(ClkSrc)); 00165 CHECK_PARAM(PARAM_WDT_MODE_OPT(WDTMode)); 00166 CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_WDT, CLKPWR_PCLKSEL_CCLK_DIV_4); 00167 00168 //Set clock source 00169 LPC_WDT->WDCLKSEL &= ~WDT_WDCLKSEL_MASK; 00170 LPC_WDT->WDCLKSEL |= ClkSrc; 00171 //Set WDT mode 00172 if (WDTMode == WDT_MODE_RESET){ 00173 LPC_WDT->WDMOD |= WDT_WDMOD(WDTMode); 00174 } 00175 } 00176 00177 /*********************************************************************/ 00182 void WDT_Start(uint32_t TimeOut) 00183 { 00184 uint32_t ClkSrc; 00185 00186 ClkSrc = LPC_WDT->WDCLKSEL; 00187 ClkSrc &=WDT_WDCLKSEL_MASK; 00188 WDT_SetTimeOut(ClkSrc,TimeOut); 00189 //enable watchdog 00190 LPC_WDT->WDMOD |= WDT_WDMOD_WDEN; 00191 WDT_Feed(); 00192 } 00193 00194 /********************************************************************/ 00199 FlagStatus WDT_ReadTimeOutFlag (void) 00200 { 00201 return ((LPC_WDT->WDMOD & WDT_WDMOD_WDTOF) >>2); 00202 } 00203 00204 /********************************************************************/ 00209 void WDT_ClrTimeOutFlag (void) 00210 { 00211 LPC_WDT->WDMOD &=~WDT_WDMOD_WDTOF; 00212 } 00213 00214 /********************************************************************/ 00219 void WDT_UpdateTimeOut ( uint32_t TimeOut) 00220 { 00221 uint32_t ClkSrc; 00222 ClkSrc = LPC_WDT->WDCLKSEL; 00223 ClkSrc &=WDT_WDCLKSEL_MASK; 00224 WDT_SetTimeOut(ClkSrc,TimeOut); 00225 WDT_Feed(); 00226 } 00227 00228 00229 /********************************************************************/ 00236 void WDT_Feed (void) 00237 { 00238 // Disable irq interrupt 00239 __disable_irq(); 00240 LPC_WDT->WDFEED = 0xAA; 00241 LPC_WDT->WDFEED = 0x55; 00242 // Then enable irq interrupt 00243 __enable_irq(); 00244 } 00245 00246 /********************************************************************/ 00251 uint32_t WDT_GetCurrentCount(void) 00252 { 00253 return LPC_WDT->WDTV; 00254 } 00255 00260 #endif /* _WDT */ 00261 00266 /* --------------------------------- End Of File ------------------------------ */
Generated on Mon Feb 8 10:01:38 2010 for LPC1700CMSIS Standard Peripheral Firmware Library by
