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
source/lpc17xx_wdt.c@0:1063a091a062, 2010-02-17 (annotated)
- Committer:
- igorsk
- Date:
- Wed Feb 17 16:22:39 2010 +0000
- Revision:
- 0:1063a091a062
Who changed what in which revision?
User | Revision | Line number | New 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 ------------------------------ */ |