Date: March 20, 2011 This library is created from "LPC17xx CMSIS-Compliant Standard Peripheral Firmware Driver Library (GNU, Keil, IAR) (Jan 28, 2011)", available from NXP's website, under "All microcontrollers support documents" [[http://ics.nxp.com/support/documents/microcontrollers/?type=software]] You will need to follow [[/projects/libraries/svn/mbed/trunk/LPC1768/LPC17xx.h]] while using this library Examples provided here [[/users/frank26080115/programs/LPC1700CMSIS_Examples/]] The beautiful thing is that NXP does not place copyright protection on any of the files in here Only a few modifications are made to make it compile with the mbed online compiler, I fixed some warnings as well. This is untested as of March 20, 2011 Forum post about this library: [[/forum/mbed/topic/2030/]]

Committer:
frank26080115
Date:
Sun Mar 20 18:45:15 2011 +0000
Revision:
0:84d7747641aa

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
frank26080115 0:84d7747641aa 1 /***********************************************************************//**
frank26080115 0:84d7747641aa 2 * @file lpc17xx_wdt.c
frank26080115 0:84d7747641aa 3 * @brief Contains all functions support for WDT firmware library on LPC17xx
frank26080115 0:84d7747641aa 4 * @version 2.0
frank26080115 0:84d7747641aa 5 * @date 21. May. 2010
frank26080115 0:84d7747641aa 6 * @author NXP MCU SW Application Team
frank26080115 0:84d7747641aa 7 **************************************************************************
frank26080115 0:84d7747641aa 8 * Software that is described herein is for illustrative purposes only
frank26080115 0:84d7747641aa 9 * which provides customers with programming information regarding the
frank26080115 0:84d7747641aa 10 * products. This software is supplied "AS IS" without any warranties.
frank26080115 0:84d7747641aa 11 * NXP Semiconductors assumes no responsibility or liability for the
frank26080115 0:84d7747641aa 12 * use of the software, conveys no license or title under any patent,
frank26080115 0:84d7747641aa 13 * copyright, or mask work right to the product. NXP Semiconductors
frank26080115 0:84d7747641aa 14 * reserves the right to make changes in the software without
frank26080115 0:84d7747641aa 15 * notification. NXP Semiconductors also make no representation or
frank26080115 0:84d7747641aa 16 * warranty that such application will be suitable for the specified
frank26080115 0:84d7747641aa 17 * use without further testing or modification.
frank26080115 0:84d7747641aa 18 **********************************************************************/
frank26080115 0:84d7747641aa 19
frank26080115 0:84d7747641aa 20 /* Peripheral group ----------------------------------------------------------- */
frank26080115 0:84d7747641aa 21 /** @addtogroup WDT
frank26080115 0:84d7747641aa 22 * @{
frank26080115 0:84d7747641aa 23 */
frank26080115 0:84d7747641aa 24
frank26080115 0:84d7747641aa 25 /* Includes ------------------------------------------------------------------- */
frank26080115 0:84d7747641aa 26 #include "lpc17xx_wdt.h"
frank26080115 0:84d7747641aa 27 #include "lpc17xx_clkpwr.h"
frank26080115 0:84d7747641aa 28 #include "lpc17xx_pinsel.h"
frank26080115 0:84d7747641aa 29
frank26080115 0:84d7747641aa 30
frank26080115 0:84d7747641aa 31 /* If this source file built with example, the LPC17xx FW library configuration
frank26080115 0:84d7747641aa 32 * file in each example directory ("lpc17xx_libcfg.h") must be included,
frank26080115 0:84d7747641aa 33 * otherwise the default FW library configuration file must be included instead
frank26080115 0:84d7747641aa 34 */
frank26080115 0:84d7747641aa 35 #ifdef __BUILD_WITH_EXAMPLE__
frank26080115 0:84d7747641aa 36 #include "lpc17xx_libcfg.h"
frank26080115 0:84d7747641aa 37 #else
frank26080115 0:84d7747641aa 38 #include "lpc17xx_libcfg_default.h"
frank26080115 0:84d7747641aa 39 #endif /* __BUILD_WITH_EXAMPLE__ */
frank26080115 0:84d7747641aa 40
frank26080115 0:84d7747641aa 41
frank26080115 0:84d7747641aa 42 #ifdef _WDT
frank26080115 0:84d7747641aa 43
frank26080115 0:84d7747641aa 44 /* Private Functions ---------------------------------------------------------- */
frank26080115 0:84d7747641aa 45
frank26080115 0:84d7747641aa 46 static uint8_t WDT_SetTimeOut (uint8_t clk_source, uint32_t timeout);
frank26080115 0:84d7747641aa 47
frank26080115 0:84d7747641aa 48 /********************************************************************//**
frank26080115 0:84d7747641aa 49 * @brief Set WDT time out value and WDT mode
frank26080115 0:84d7747641aa 50 * @param[in] clk_source select Clock source for WDT device
frank26080115 0:84d7747641aa 51 * @param[in] timeout value of time-out for WDT (us)
frank26080115 0:84d7747641aa 52 * @return None
frank26080115 0:84d7747641aa 53 *********************************************************************/
frank26080115 0:84d7747641aa 54 static uint8_t WDT_SetTimeOut (uint8_t clk_source, uint32_t timeout)
frank26080115 0:84d7747641aa 55 {
frank26080115 0:84d7747641aa 56
frank26080115 0:84d7747641aa 57 uint32_t pclk_wdt = 0;
frank26080115 0:84d7747641aa 58 uint32_t tempval = 0;
frank26080115 0:84d7747641aa 59
frank26080115 0:84d7747641aa 60 switch ((WDT_CLK_OPT) clk_source)
frank26080115 0:84d7747641aa 61 {
frank26080115 0:84d7747641aa 62 case WDT_CLKSRC_IRC:
frank26080115 0:84d7747641aa 63 pclk_wdt = 4000000;
frank26080115 0:84d7747641aa 64 // Calculate TC in WDT
frank26080115 0:84d7747641aa 65 tempval = (((pclk_wdt) / WDT_US_INDEX) * (timeout / 4));
frank26080115 0:84d7747641aa 66 // Check if it valid
frank26080115 0:84d7747641aa 67 if ((tempval >= WDT_TIMEOUT_MIN) && (tempval <= WDT_TIMEOUT_MAX))
frank26080115 0:84d7747641aa 68 {
frank26080115 0:84d7747641aa 69 LPC_WDT->WDTC = tempval;
frank26080115 0:84d7747641aa 70 return SUCCESS;
frank26080115 0:84d7747641aa 71 }
frank26080115 0:84d7747641aa 72
frank26080115 0:84d7747641aa 73 break;
frank26080115 0:84d7747641aa 74
frank26080115 0:84d7747641aa 75 case WDT_CLKSRC_PCLK:
frank26080115 0:84d7747641aa 76
frank26080115 0:84d7747641aa 77 // Get WDT clock with CCLK divider = 4
frank26080115 0:84d7747641aa 78 pclk_wdt = SystemCoreClock / 4;
frank26080115 0:84d7747641aa 79 // Calculate TC in WDT
frank26080115 0:84d7747641aa 80 tempval = (((pclk_wdt) / WDT_US_INDEX) * (timeout / 4));
frank26080115 0:84d7747641aa 81
frank26080115 0:84d7747641aa 82 if ((tempval >= WDT_TIMEOUT_MIN) && (tempval <= WDT_TIMEOUT_MAX))
frank26080115 0:84d7747641aa 83 {
frank26080115 0:84d7747641aa 84 CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_WDT, CLKPWR_PCLKSEL_CCLK_DIV_4);
frank26080115 0:84d7747641aa 85 LPC_WDT->WDTC = (uint32_t) tempval;
frank26080115 0:84d7747641aa 86 return SUCCESS;
frank26080115 0:84d7747641aa 87 }
frank26080115 0:84d7747641aa 88
frank26080115 0:84d7747641aa 89 // Get WDT clock with CCLK divider = 2
frank26080115 0:84d7747641aa 90 pclk_wdt = SystemCoreClock / 2;
frank26080115 0:84d7747641aa 91 // Calculate TC in WDT
frank26080115 0:84d7747641aa 92 tempval = (((pclk_wdt) / WDT_US_INDEX) * (timeout / 4));
frank26080115 0:84d7747641aa 93
frank26080115 0:84d7747641aa 94 if ((tempval >= WDT_TIMEOUT_MIN) && (tempval <= WDT_TIMEOUT_MAX))
frank26080115 0:84d7747641aa 95 {
frank26080115 0:84d7747641aa 96 CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_WDT, CLKPWR_PCLKSEL_CCLK_DIV_2);
frank26080115 0:84d7747641aa 97 LPC_WDT->WDTC = (uint32_t) tempval;
frank26080115 0:84d7747641aa 98 return SUCCESS;
frank26080115 0:84d7747641aa 99 }
frank26080115 0:84d7747641aa 100
frank26080115 0:84d7747641aa 101 // Get WDT clock with CCLK divider = 1
frank26080115 0:84d7747641aa 102 pclk_wdt = SystemCoreClock;
frank26080115 0:84d7747641aa 103 // Calculate TC in WDT
frank26080115 0:84d7747641aa 104 tempval = (((pclk_wdt) / WDT_US_INDEX) * (timeout / 4));
frank26080115 0:84d7747641aa 105
frank26080115 0:84d7747641aa 106 if ((tempval >= WDT_TIMEOUT_MIN) && (tempval <= WDT_TIMEOUT_MAX))
frank26080115 0:84d7747641aa 107 {
frank26080115 0:84d7747641aa 108 CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_WDT, CLKPWR_PCLKSEL_CCLK_DIV_1);
frank26080115 0:84d7747641aa 109 LPC_WDT->WDTC = (uint32_t) tempval;
frank26080115 0:84d7747641aa 110 return SUCCESS;
frank26080115 0:84d7747641aa 111 }
frank26080115 0:84d7747641aa 112 break ;
frank26080115 0:84d7747641aa 113
frank26080115 0:84d7747641aa 114
frank26080115 0:84d7747641aa 115 case WDT_CLKSRC_RTC:
frank26080115 0:84d7747641aa 116 pclk_wdt = 32768;
frank26080115 0:84d7747641aa 117 // Calculate TC in WDT
frank26080115 0:84d7747641aa 118 tempval = (((pclk_wdt) / WDT_US_INDEX) * (timeout / 4));
frank26080115 0:84d7747641aa 119 // Check if it valid
frank26080115 0:84d7747641aa 120 if ((tempval >= WDT_TIMEOUT_MIN) && (tempval <= WDT_TIMEOUT_MAX))
frank26080115 0:84d7747641aa 121 {
frank26080115 0:84d7747641aa 122 LPC_WDT->WDTC = (uint32_t) tempval;
frank26080115 0:84d7747641aa 123 return SUCCESS;
frank26080115 0:84d7747641aa 124 }
frank26080115 0:84d7747641aa 125
frank26080115 0:84d7747641aa 126 break;
frank26080115 0:84d7747641aa 127
frank26080115 0:84d7747641aa 128 // Error parameter
frank26080115 0:84d7747641aa 129 default:
frank26080115 0:84d7747641aa 130 break;
frank26080115 0:84d7747641aa 131 }
frank26080115 0:84d7747641aa 132
frank26080115 0:84d7747641aa 133 return ERROR;
frank26080115 0:84d7747641aa 134 }
frank26080115 0:84d7747641aa 135
frank26080115 0:84d7747641aa 136 /* End of Private Functions --------------------------------------------------- */
frank26080115 0:84d7747641aa 137
frank26080115 0:84d7747641aa 138
frank26080115 0:84d7747641aa 139 /* Public Functions ----------------------------------------------------------- */
frank26080115 0:84d7747641aa 140 /** @addtogroup WDT_Public_Functions
frank26080115 0:84d7747641aa 141 * @{
frank26080115 0:84d7747641aa 142 */
frank26080115 0:84d7747641aa 143
frank26080115 0:84d7747641aa 144
frank26080115 0:84d7747641aa 145 /*********************************************************************//**
frank26080115 0:84d7747641aa 146 * @brief Initial for Watchdog function
frank26080115 0:84d7747641aa 147 * Clock source = RTC ,
frank26080115 0:84d7747641aa 148 * @param[in] ClkSrc Select clock source, should be:
frank26080115 0:84d7747641aa 149 * - WDT_CLKSRC_IRC: Clock source from Internal RC oscillator
frank26080115 0:84d7747641aa 150 * - WDT_CLKSRC_PCLK: Selects the APB peripheral clock (PCLK)
frank26080115 0:84d7747641aa 151 * - WDT_CLKSRC_RTC: Selects the RTC oscillator
frank26080115 0:84d7747641aa 152 * @param[in] WDTMode WDT mode, should be:
frank26080115 0:84d7747641aa 153 * - WDT_MODE_INT_ONLY: Use WDT to generate interrupt only
frank26080115 0:84d7747641aa 154 * - WDT_MODE_RESET: Use WDT to generate interrupt and reset MCU
frank26080115 0:84d7747641aa 155 * @return None
frank26080115 0:84d7747641aa 156 **********************************************************************/
frank26080115 0:84d7747641aa 157 void WDT_Init (WDT_CLK_OPT ClkSrc, WDT_MODE_OPT WDTMode)
frank26080115 0:84d7747641aa 158 {
frank26080115 0:84d7747641aa 159 CHECK_PARAM(PARAM_WDT_CLK_OPT(ClkSrc));
frank26080115 0:84d7747641aa 160 CHECK_PARAM(PARAM_WDT_MODE_OPT(WDTMode));
frank26080115 0:84d7747641aa 161 CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_WDT, CLKPWR_PCLKSEL_CCLK_DIV_4);
frank26080115 0:84d7747641aa 162
frank26080115 0:84d7747641aa 163 //Set clock source
frank26080115 0:84d7747641aa 164 LPC_WDT->WDCLKSEL &= ~WDT_WDCLKSEL_MASK;
frank26080115 0:84d7747641aa 165 LPC_WDT->WDCLKSEL |= ClkSrc;
frank26080115 0:84d7747641aa 166 //Set WDT mode
frank26080115 0:84d7747641aa 167 if (WDTMode == WDT_MODE_RESET){
frank26080115 0:84d7747641aa 168 LPC_WDT->WDMOD |= WDT_WDMOD(WDTMode);
frank26080115 0:84d7747641aa 169 }
frank26080115 0:84d7747641aa 170 }
frank26080115 0:84d7747641aa 171
frank26080115 0:84d7747641aa 172 /*********************************************************************//**
frank26080115 0:84d7747641aa 173 * @brief Start WDT activity with given timeout value
frank26080115 0:84d7747641aa 174 * @param[in] TimeOut WDT reset after timeout if it is not feed
frank26080115 0:84d7747641aa 175 * @return None
frank26080115 0:84d7747641aa 176 **********************************************************************/
frank26080115 0:84d7747641aa 177 void WDT_Start(uint32_t TimeOut)
frank26080115 0:84d7747641aa 178 {
frank26080115 0:84d7747641aa 179 uint32_t ClkSrc;
frank26080115 0:84d7747641aa 180
frank26080115 0:84d7747641aa 181 ClkSrc = LPC_WDT->WDCLKSEL;
frank26080115 0:84d7747641aa 182 ClkSrc &=WDT_WDCLKSEL_MASK;
frank26080115 0:84d7747641aa 183 WDT_SetTimeOut(ClkSrc,TimeOut);
frank26080115 0:84d7747641aa 184 //enable watchdog
frank26080115 0:84d7747641aa 185 LPC_WDT->WDMOD |= WDT_WDMOD_WDEN;
frank26080115 0:84d7747641aa 186 WDT_Feed();
frank26080115 0:84d7747641aa 187 }
frank26080115 0:84d7747641aa 188
frank26080115 0:84d7747641aa 189 /********************************************************************//**
frank26080115 0:84d7747641aa 190 * @brief Read WDT Time out flag
frank26080115 0:84d7747641aa 191 * @param[in] None
frank26080115 0:84d7747641aa 192 * @return Time out flag status of WDT
frank26080115 0:84d7747641aa 193 *********************************************************************/
frank26080115 0:84d7747641aa 194 FlagStatus WDT_ReadTimeOutFlag (void)
frank26080115 0:84d7747641aa 195 {
frank26080115 0:84d7747641aa 196 return ((FlagStatus)((LPC_WDT->WDMOD & WDT_WDMOD_WDTOF) >>2));
frank26080115 0:84d7747641aa 197 }
frank26080115 0:84d7747641aa 198
frank26080115 0:84d7747641aa 199 /********************************************************************//**
frank26080115 0:84d7747641aa 200 * @brief Clear WDT Time out flag
frank26080115 0:84d7747641aa 201 * @param[in] None
frank26080115 0:84d7747641aa 202 * @return None
frank26080115 0:84d7747641aa 203 *********************************************************************/
frank26080115 0:84d7747641aa 204 void WDT_ClrTimeOutFlag (void)
frank26080115 0:84d7747641aa 205 {
frank26080115 0:84d7747641aa 206 LPC_WDT->WDMOD &=~WDT_WDMOD_WDTOF;
frank26080115 0:84d7747641aa 207 }
frank26080115 0:84d7747641aa 208
frank26080115 0:84d7747641aa 209 /********************************************************************//**
frank26080115 0:84d7747641aa 210 * @brief Update WDT timeout value and feed
frank26080115 0:84d7747641aa 211 * @param[in] TimeOut TimeOut value to be updated
frank26080115 0:84d7747641aa 212 * @return None
frank26080115 0:84d7747641aa 213 *********************************************************************/
frank26080115 0:84d7747641aa 214 void WDT_UpdateTimeOut ( uint32_t TimeOut)
frank26080115 0:84d7747641aa 215 {
frank26080115 0:84d7747641aa 216 uint32_t ClkSrc;
frank26080115 0:84d7747641aa 217 ClkSrc = LPC_WDT->WDCLKSEL;
frank26080115 0:84d7747641aa 218 ClkSrc &=WDT_WDCLKSEL_MASK;
frank26080115 0:84d7747641aa 219 WDT_SetTimeOut(ClkSrc,TimeOut);
frank26080115 0:84d7747641aa 220 WDT_Feed();
frank26080115 0:84d7747641aa 221 }
frank26080115 0:84d7747641aa 222
frank26080115 0:84d7747641aa 223
frank26080115 0:84d7747641aa 224 /********************************************************************//**
frank26080115 0:84d7747641aa 225 * @brief After set WDTEN, call this function to start Watchdog
frank26080115 0:84d7747641aa 226 * or reload the Watchdog timer
frank26080115 0:84d7747641aa 227 * @param[in] None
frank26080115 0:84d7747641aa 228 *
frank26080115 0:84d7747641aa 229 * @return None
frank26080115 0:84d7747641aa 230 *********************************************************************/
frank26080115 0:84d7747641aa 231 void WDT_Feed (void)
frank26080115 0:84d7747641aa 232 {
frank26080115 0:84d7747641aa 233 // Disable irq interrupt
frank26080115 0:84d7747641aa 234 __disable_irq();
frank26080115 0:84d7747641aa 235 LPC_WDT->WDFEED = 0xAA;
frank26080115 0:84d7747641aa 236 LPC_WDT->WDFEED = 0x55;
frank26080115 0:84d7747641aa 237 // Then enable irq interrupt
frank26080115 0:84d7747641aa 238 __enable_irq();
frank26080115 0:84d7747641aa 239 }
frank26080115 0:84d7747641aa 240
frank26080115 0:84d7747641aa 241 /********************************************************************//**
frank26080115 0:84d7747641aa 242 * @brief Get the current value of WDT
frank26080115 0:84d7747641aa 243 * @param[in] None
frank26080115 0:84d7747641aa 244 * @return current value of WDT
frank26080115 0:84d7747641aa 245 *********************************************************************/
frank26080115 0:84d7747641aa 246 uint32_t WDT_GetCurrentCount(void)
frank26080115 0:84d7747641aa 247 {
frank26080115 0:84d7747641aa 248 return LPC_WDT->WDTV;
frank26080115 0:84d7747641aa 249 }
frank26080115 0:84d7747641aa 250
frank26080115 0:84d7747641aa 251 /**
frank26080115 0:84d7747641aa 252 * @}
frank26080115 0:84d7747641aa 253 */
frank26080115 0:84d7747641aa 254
frank26080115 0:84d7747641aa 255 #endif /* _WDT */
frank26080115 0:84d7747641aa 256
frank26080115 0:84d7747641aa 257 /**
frank26080115 0:84d7747641aa 258 * @}
frank26080115 0:84d7747641aa 259 */
frank26080115 0:84d7747641aa 260
frank26080115 0:84d7747641aa 261 /* --------------------------------- End Of File ------------------------------ */