NXP's driver library for LPC17xx, ported to mbed's online compiler. Not tested! I had to fix a lot of warings and found a couple of pretty obvious bugs, so the chances are there are more. Original: http://ics.nxp.com/support/documents/microcontrollers/zip/lpc17xx.cmsis.driver.library.zip

Dependencies:   mbed

Committer:
igorsk
Date:
Wed Feb 17 16:22:39 2010 +0000
Revision:
0:1063a091a062

        

Who changed what in which revision?

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