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_timer.c
frank26080115 0:84d7747641aa 3 * @brief Contains all functions support for Timer firmware library on LPC17xx
frank26080115 0:84d7747641aa 4 * @version 3.0
frank26080115 0:84d7747641aa 5 * @date 18. June. 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 TIM
frank26080115 0:84d7747641aa 22 * @{
frank26080115 0:84d7747641aa 23 */
frank26080115 0:84d7747641aa 24
frank26080115 0:84d7747641aa 25 /* Includes ------------------------------------------------------------------- */
frank26080115 0:84d7747641aa 26 #include "lpc17xx_timer.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 /* If this source file built with example, the LPC17xx FW library configuration
frank26080115 0:84d7747641aa 31 * file in each example directory ("lpc17xx_libcfg.h") must be included,
frank26080115 0:84d7747641aa 32 * otherwise the default FW library configuration file must be included instead
frank26080115 0:84d7747641aa 33 */
frank26080115 0:84d7747641aa 34 #ifdef __BUILD_WITH_EXAMPLE__
frank26080115 0:84d7747641aa 35 #include "lpc17xx_libcfg.h"
frank26080115 0:84d7747641aa 36 #else
frank26080115 0:84d7747641aa 37 #include "lpc17xx_libcfg_default.h"
frank26080115 0:84d7747641aa 38 #endif /* __BUILD_WITH_EXAMPLE__ */
frank26080115 0:84d7747641aa 39
frank26080115 0:84d7747641aa 40 #ifdef _TIM
frank26080115 0:84d7747641aa 41
frank26080115 0:84d7747641aa 42 /* Private Functions ---------------------------------------------------------- */
frank26080115 0:84d7747641aa 43
frank26080115 0:84d7747641aa 44 static uint32_t getPClock (uint32_t timernum);
frank26080115 0:84d7747641aa 45 static uint32_t converUSecToVal (uint32_t timernum, uint32_t usec);
frank26080115 0:84d7747641aa 46 static uint32_t converPtrToTimeNum (LPC_TIM_TypeDef *TIMx);
frank26080115 0:84d7747641aa 47
frank26080115 0:84d7747641aa 48
frank26080115 0:84d7747641aa 49 /*********************************************************************//**
frank26080115 0:84d7747641aa 50 * @brief Get peripheral clock of each timer controller
frank26080115 0:84d7747641aa 51 * @param[in] timernum Timer number
frank26080115 0:84d7747641aa 52 * @return Peripheral clock of timer
frank26080115 0:84d7747641aa 53 **********************************************************************/
frank26080115 0:84d7747641aa 54 static uint32_t getPClock (uint32_t timernum)
frank26080115 0:84d7747641aa 55 {
frank26080115 0:84d7747641aa 56 uint32_t clkdlycnt = 0;
frank26080115 0:84d7747641aa 57 switch (timernum)
frank26080115 0:84d7747641aa 58 {
frank26080115 0:84d7747641aa 59 case 0:
frank26080115 0:84d7747641aa 60 clkdlycnt = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_TIMER0);
frank26080115 0:84d7747641aa 61 break;
frank26080115 0:84d7747641aa 62
frank26080115 0:84d7747641aa 63 case 1:
frank26080115 0:84d7747641aa 64 clkdlycnt = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_TIMER1);
frank26080115 0:84d7747641aa 65 break;
frank26080115 0:84d7747641aa 66
frank26080115 0:84d7747641aa 67 case 2:
frank26080115 0:84d7747641aa 68 clkdlycnt = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_TIMER2);
frank26080115 0:84d7747641aa 69 break;
frank26080115 0:84d7747641aa 70
frank26080115 0:84d7747641aa 71 case 3:
frank26080115 0:84d7747641aa 72 clkdlycnt = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_TIMER3);
frank26080115 0:84d7747641aa 73 break;
frank26080115 0:84d7747641aa 74 }
frank26080115 0:84d7747641aa 75 return clkdlycnt;
frank26080115 0:84d7747641aa 76 }
frank26080115 0:84d7747641aa 77
frank26080115 0:84d7747641aa 78
frank26080115 0:84d7747641aa 79 /*********************************************************************//**
frank26080115 0:84d7747641aa 80 * @brief Convert a time to a timer count value
frank26080115 0:84d7747641aa 81 * @param[in] timernum Timer number
frank26080115 0:84d7747641aa 82 * @param[in] usec Time in microseconds
frank26080115 0:84d7747641aa 83 * @return The number of required clock ticks to give the time delay
frank26080115 0:84d7747641aa 84 **********************************************************************/
frank26080115 0:84d7747641aa 85 uint32_t converUSecToVal (uint32_t timernum, uint32_t usec)
frank26080115 0:84d7747641aa 86 {
frank26080115 0:84d7747641aa 87 uint64_t clkdlycnt;
frank26080115 0:84d7747641aa 88
frank26080115 0:84d7747641aa 89 // Get Pclock of timer
frank26080115 0:84d7747641aa 90 clkdlycnt = (uint64_t) getPClock(timernum);
frank26080115 0:84d7747641aa 91
frank26080115 0:84d7747641aa 92 clkdlycnt = (clkdlycnt * usec) / 1000000;
frank26080115 0:84d7747641aa 93 return (uint32_t) clkdlycnt;
frank26080115 0:84d7747641aa 94 }
frank26080115 0:84d7747641aa 95
frank26080115 0:84d7747641aa 96
frank26080115 0:84d7747641aa 97 /*********************************************************************//**
frank26080115 0:84d7747641aa 98 * @brief Convert a timer register pointer to a timer number
frank26080115 0:84d7747641aa 99 * @param[in] TIMx Pointer to LPC_TIM_TypeDef, should be:
frank26080115 0:84d7747641aa 100 * - LPC_TIM0: TIMER0 peripheral
frank26080115 0:84d7747641aa 101 * - LPC_TIM1: TIMER1 peripheral
frank26080115 0:84d7747641aa 102 * - LPC_TIM2: TIMER2 peripheral
frank26080115 0:84d7747641aa 103 * - LPC_TIM3: TIMER3 peripheral
frank26080115 0:84d7747641aa 104 * @return The timer number (0 to 3) or -1 if register pointer is bad
frank26080115 0:84d7747641aa 105 **********************************************************************/
frank26080115 0:84d7747641aa 106 uint32_t converPtrToTimeNum (LPC_TIM_TypeDef *TIMx)
frank26080115 0:84d7747641aa 107 {
frank26080115 0:84d7747641aa 108 uint32_t tnum = 0xFFFFFFFF;
frank26080115 0:84d7747641aa 109
frank26080115 0:84d7747641aa 110 if (TIMx == LPC_TIM0)
frank26080115 0:84d7747641aa 111 {
frank26080115 0:84d7747641aa 112 tnum = 0;
frank26080115 0:84d7747641aa 113 }
frank26080115 0:84d7747641aa 114 else if (TIMx == LPC_TIM1)
frank26080115 0:84d7747641aa 115 {
frank26080115 0:84d7747641aa 116 tnum = 1;
frank26080115 0:84d7747641aa 117 }
frank26080115 0:84d7747641aa 118 else if (TIMx == LPC_TIM2)
frank26080115 0:84d7747641aa 119 {
frank26080115 0:84d7747641aa 120 tnum = 2;
frank26080115 0:84d7747641aa 121 }
frank26080115 0:84d7747641aa 122 else if (TIMx == LPC_TIM3)
frank26080115 0:84d7747641aa 123 {
frank26080115 0:84d7747641aa 124 tnum = 3;
frank26080115 0:84d7747641aa 125 }
frank26080115 0:84d7747641aa 126
frank26080115 0:84d7747641aa 127 return tnum;
frank26080115 0:84d7747641aa 128 }
frank26080115 0:84d7747641aa 129
frank26080115 0:84d7747641aa 130 /* End of Private Functions ---------------------------------------------------- */
frank26080115 0:84d7747641aa 131
frank26080115 0:84d7747641aa 132
frank26080115 0:84d7747641aa 133 /* Public Functions ----------------------------------------------------------- */
frank26080115 0:84d7747641aa 134 /** @addtogroup TIM_Public_Functions
frank26080115 0:84d7747641aa 135 * @{
frank26080115 0:84d7747641aa 136 */
frank26080115 0:84d7747641aa 137
frank26080115 0:84d7747641aa 138 /*********************************************************************//**
frank26080115 0:84d7747641aa 139 * @brief Get Interrupt Status
frank26080115 0:84d7747641aa 140 * @param[in] TIMx Timer selection, should be:
frank26080115 0:84d7747641aa 141 * - LPC_TIM0: TIMER0 peripheral
frank26080115 0:84d7747641aa 142 * - LPC_TIM1: TIMER1 peripheral
frank26080115 0:84d7747641aa 143 * - LPC_TIM2: TIMER2 peripheral
frank26080115 0:84d7747641aa 144 * - LPC_TIM3: TIMER3 peripheral
frank26080115 0:84d7747641aa 145 * @param[in] IntFlag: interrupt type, should be:
frank26080115 0:84d7747641aa 146 * - TIM_MR0_INT: Interrupt for Match channel 0
frank26080115 0:84d7747641aa 147 * - TIM_MR1_INT: Interrupt for Match channel 1
frank26080115 0:84d7747641aa 148 * - TIM_MR2_INT: Interrupt for Match channel 2
frank26080115 0:84d7747641aa 149 * - TIM_MR3_INT: Interrupt for Match channel 3
frank26080115 0:84d7747641aa 150 * - TIM_CR0_INT: Interrupt for Capture channel 0
frank26080115 0:84d7747641aa 151 * - TIM_CR1_INT: Interrupt for Capture channel 1
frank26080115 0:84d7747641aa 152 * @return FlagStatus
frank26080115 0:84d7747641aa 153 * - SET : interrupt
frank26080115 0:84d7747641aa 154 * - RESET : no interrupt
frank26080115 0:84d7747641aa 155 **********************************************************************/
frank26080115 0:84d7747641aa 156 FlagStatus TIM_GetIntStatus(LPC_TIM_TypeDef *TIMx, TIM_INT_TYPE IntFlag)
frank26080115 0:84d7747641aa 157 {
frank26080115 0:84d7747641aa 158 uint8_t temp;
frank26080115 0:84d7747641aa 159 CHECK_PARAM(PARAM_TIMx(TIMx));
frank26080115 0:84d7747641aa 160 CHECK_PARAM(PARAM_TIM_INT_TYPE(IntFlag));
frank26080115 0:84d7747641aa 161 temp = (TIMx->IR)& TIM_IR_CLR(IntFlag);
frank26080115 0:84d7747641aa 162 if (temp)
frank26080115 0:84d7747641aa 163 return SET;
frank26080115 0:84d7747641aa 164
frank26080115 0:84d7747641aa 165 return RESET;
frank26080115 0:84d7747641aa 166
frank26080115 0:84d7747641aa 167 }
frank26080115 0:84d7747641aa 168 /*********************************************************************//**
frank26080115 0:84d7747641aa 169 * @brief Get Capture Interrupt Status
frank26080115 0:84d7747641aa 170 * @param[in] TIMx Timer selection, should be:
frank26080115 0:84d7747641aa 171 * - LPC_TIM0: TIMER0 peripheral
frank26080115 0:84d7747641aa 172 * - LPC_TIM1: TIMER1 peripheral
frank26080115 0:84d7747641aa 173 * - LPC_TIM2: TIMER2 peripheral
frank26080115 0:84d7747641aa 174 * - LPC_TIM3: TIMER3 peripheral
frank26080115 0:84d7747641aa 175 * @param[in] IntFlag: interrupt type, should be:
frank26080115 0:84d7747641aa 176 * - TIM_MR0_INT: Interrupt for Match channel 0
frank26080115 0:84d7747641aa 177 * - TIM_MR1_INT: Interrupt for Match channel 1
frank26080115 0:84d7747641aa 178 * - TIM_MR2_INT: Interrupt for Match channel 2
frank26080115 0:84d7747641aa 179 * - TIM_MR3_INT: Interrupt for Match channel 3
frank26080115 0:84d7747641aa 180 * - TIM_CR0_INT: Interrupt for Capture channel 0
frank26080115 0:84d7747641aa 181 * - TIM_CR1_INT: Interrupt for Capture channel 1
frank26080115 0:84d7747641aa 182 * @return FlagStatus
frank26080115 0:84d7747641aa 183 * - SET : interrupt
frank26080115 0:84d7747641aa 184 * - RESET : no interrupt
frank26080115 0:84d7747641aa 185 **********************************************************************/
frank26080115 0:84d7747641aa 186 FlagStatus TIM_GetIntCaptureStatus(LPC_TIM_TypeDef *TIMx, TIM_INT_TYPE IntFlag)
frank26080115 0:84d7747641aa 187 {
frank26080115 0:84d7747641aa 188 uint8_t temp;
frank26080115 0:84d7747641aa 189 CHECK_PARAM(PARAM_TIMx(TIMx));
frank26080115 0:84d7747641aa 190 CHECK_PARAM(PARAM_TIM_INT_TYPE(IntFlag));
frank26080115 0:84d7747641aa 191 temp = (TIMx->IR) & (1<<(4+IntFlag));
frank26080115 0:84d7747641aa 192 if(temp)
frank26080115 0:84d7747641aa 193 return SET;
frank26080115 0:84d7747641aa 194 return RESET;
frank26080115 0:84d7747641aa 195 }
frank26080115 0:84d7747641aa 196 /*********************************************************************//**
frank26080115 0:84d7747641aa 197 * @brief Clear Interrupt pending
frank26080115 0:84d7747641aa 198 * @param[in] TIMx Timer selection, should be:
frank26080115 0:84d7747641aa 199 * - LPC_TIM0: TIMER0 peripheral
frank26080115 0:84d7747641aa 200 * - LPC_TIM1: TIMER1 peripheral
frank26080115 0:84d7747641aa 201 * - LPC_TIM2: TIMER2 peripheral
frank26080115 0:84d7747641aa 202 * - LPC_TIM3: TIMER3 peripheral
frank26080115 0:84d7747641aa 203 * @param[in] IntFlag: interrupt type, should be:
frank26080115 0:84d7747641aa 204 * - TIM_MR0_INT: Interrupt for Match channel 0
frank26080115 0:84d7747641aa 205 * - TIM_MR1_INT: Interrupt for Match channel 1
frank26080115 0:84d7747641aa 206 * - TIM_MR2_INT: Interrupt for Match channel 2
frank26080115 0:84d7747641aa 207 * - TIM_MR3_INT: Interrupt for Match channel 3
frank26080115 0:84d7747641aa 208 * - TIM_CR0_INT: Interrupt for Capture channel 0
frank26080115 0:84d7747641aa 209 * - TIM_CR1_INT: Interrupt for Capture channel 1
frank26080115 0:84d7747641aa 210 * @return None
frank26080115 0:84d7747641aa 211 **********************************************************************/
frank26080115 0:84d7747641aa 212 void TIM_ClearIntPending(LPC_TIM_TypeDef *TIMx, TIM_INT_TYPE IntFlag)
frank26080115 0:84d7747641aa 213 {
frank26080115 0:84d7747641aa 214 CHECK_PARAM(PARAM_TIMx(TIMx));
frank26080115 0:84d7747641aa 215 CHECK_PARAM(PARAM_TIM_INT_TYPE(IntFlag));
frank26080115 0:84d7747641aa 216 TIMx->IR |= TIM_IR_CLR(IntFlag);
frank26080115 0:84d7747641aa 217 }
frank26080115 0:84d7747641aa 218
frank26080115 0:84d7747641aa 219 /*********************************************************************//**
frank26080115 0:84d7747641aa 220 * @brief Clear Capture Interrupt pending
frank26080115 0:84d7747641aa 221 * @param[in] TIMx Timer selection, should be
frank26080115 0:84d7747641aa 222 * - LPC_TIM0: TIMER0 peripheral
frank26080115 0:84d7747641aa 223 * - LPC_TIM1: TIMER1 peripheral
frank26080115 0:84d7747641aa 224 * - LPC_TIM2: TIMER2 peripheral
frank26080115 0:84d7747641aa 225 * - LPC_TIM3: TIMER3 peripheral
frank26080115 0:84d7747641aa 226 * @param[in] IntFlag interrupt type, should be:
frank26080115 0:84d7747641aa 227 * - TIM_MR0_INT: Interrupt for Match channel 0
frank26080115 0:84d7747641aa 228 * - TIM_MR1_INT: Interrupt for Match channel 1
frank26080115 0:84d7747641aa 229 * - TIM_MR2_INT: Interrupt for Match channel 2
frank26080115 0:84d7747641aa 230 * - TIM_MR3_INT: Interrupt for Match channel 3
frank26080115 0:84d7747641aa 231 * - TIM_CR0_INT: Interrupt for Capture channel 0
frank26080115 0:84d7747641aa 232 * - TIM_CR1_INT: Interrupt for Capture channel 1
frank26080115 0:84d7747641aa 233 * @return None
frank26080115 0:84d7747641aa 234 **********************************************************************/
frank26080115 0:84d7747641aa 235 void TIM_ClearIntCapturePending(LPC_TIM_TypeDef *TIMx, TIM_INT_TYPE IntFlag)
frank26080115 0:84d7747641aa 236 {
frank26080115 0:84d7747641aa 237 CHECK_PARAM(PARAM_TIMx(TIMx));
frank26080115 0:84d7747641aa 238 CHECK_PARAM(PARAM_TIM_INT_TYPE(IntFlag));
frank26080115 0:84d7747641aa 239 TIMx->IR |= (1<<(4+IntFlag));
frank26080115 0:84d7747641aa 240 }
frank26080115 0:84d7747641aa 241
frank26080115 0:84d7747641aa 242 /*********************************************************************//**
frank26080115 0:84d7747641aa 243 * @brief Configuration for Timer at initial time
frank26080115 0:84d7747641aa 244 * @param[in] TimerCounterMode timer counter mode, should be:
frank26080115 0:84d7747641aa 245 * - TIM_TIMER_MODE: Timer mode
frank26080115 0:84d7747641aa 246 * - TIM_COUNTER_RISING_MODE: Counter rising mode
frank26080115 0:84d7747641aa 247 * - TIM_COUNTER_FALLING_MODE: Counter falling mode
frank26080115 0:84d7747641aa 248 * - TIM_COUNTER_ANY_MODE:Counter on both edges
frank26080115 0:84d7747641aa 249 * @param[in] TIM_ConfigStruct pointer to TIM_TIMERCFG_Type or
frank26080115 0:84d7747641aa 250 * TIM_COUNTERCFG_Type
frank26080115 0:84d7747641aa 251 * @return None
frank26080115 0:84d7747641aa 252 **********************************************************************/
frank26080115 0:84d7747641aa 253 void TIM_ConfigStructInit(TIM_MODE_OPT TimerCounterMode, void *TIM_ConfigStruct)
frank26080115 0:84d7747641aa 254 {
frank26080115 0:84d7747641aa 255 if (TimerCounterMode == TIM_TIMER_MODE )
frank26080115 0:84d7747641aa 256 {
frank26080115 0:84d7747641aa 257 TIM_TIMERCFG_Type * pTimeCfg = (TIM_TIMERCFG_Type *)TIM_ConfigStruct;
frank26080115 0:84d7747641aa 258 pTimeCfg->PrescaleOption = TIM_PRESCALE_USVAL;
frank26080115 0:84d7747641aa 259 pTimeCfg->PrescaleValue = 1;
frank26080115 0:84d7747641aa 260 }
frank26080115 0:84d7747641aa 261 else
frank26080115 0:84d7747641aa 262 {
frank26080115 0:84d7747641aa 263 TIM_COUNTERCFG_Type * pCounterCfg = (TIM_COUNTERCFG_Type *)TIM_ConfigStruct;
frank26080115 0:84d7747641aa 264 pCounterCfg->CountInputSelect = TIM_COUNTER_INCAP0;
frank26080115 0:84d7747641aa 265 }
frank26080115 0:84d7747641aa 266 }
frank26080115 0:84d7747641aa 267
frank26080115 0:84d7747641aa 268 /*********************************************************************//**
frank26080115 0:84d7747641aa 269 * @brief Initial Timer/Counter device
frank26080115 0:84d7747641aa 270 * Set Clock frequency for Timer
frank26080115 0:84d7747641aa 271 * Set initial configuration for Timer
frank26080115 0:84d7747641aa 272 * @param[in] TIMx Timer selection, should be:
frank26080115 0:84d7747641aa 273 * - LPC_TIM0: TIMER0 peripheral
frank26080115 0:84d7747641aa 274 * - LPC_TIM1: TIMER1 peripheral
frank26080115 0:84d7747641aa 275 * - LPC_TIM2: TIMER2 peripheral
frank26080115 0:84d7747641aa 276 * - LPC_TIM3: TIMER3 peripheral
frank26080115 0:84d7747641aa 277 * @param[in] TimerCounterMode Timer counter mode, should be:
frank26080115 0:84d7747641aa 278 * - TIM_TIMER_MODE: Timer mode
frank26080115 0:84d7747641aa 279 * - TIM_COUNTER_RISING_MODE: Counter rising mode
frank26080115 0:84d7747641aa 280 * - TIM_COUNTER_FALLING_MODE: Counter falling mode
frank26080115 0:84d7747641aa 281 * - TIM_COUNTER_ANY_MODE:Counter on both edges
frank26080115 0:84d7747641aa 282 * @param[in] TIM_ConfigStruct pointer to TIM_TIMERCFG_Type
frank26080115 0:84d7747641aa 283 * that contains the configuration information for the
frank26080115 0:84d7747641aa 284 * specified Timer peripheral.
frank26080115 0:84d7747641aa 285 * @return None
frank26080115 0:84d7747641aa 286 **********************************************************************/
frank26080115 0:84d7747641aa 287 void TIM_Init(LPC_TIM_TypeDef *TIMx, TIM_MODE_OPT TimerCounterMode, void *TIM_ConfigStruct)
frank26080115 0:84d7747641aa 288 {
frank26080115 0:84d7747641aa 289 TIM_TIMERCFG_Type *pTimeCfg;
frank26080115 0:84d7747641aa 290 TIM_COUNTERCFG_Type *pCounterCfg;
frank26080115 0:84d7747641aa 291
frank26080115 0:84d7747641aa 292 CHECK_PARAM(PARAM_TIMx(TIMx));
frank26080115 0:84d7747641aa 293 CHECK_PARAM(PARAM_TIM_MODE_OPT(TimerCounterMode));
frank26080115 0:84d7747641aa 294
frank26080115 0:84d7747641aa 295 //set power
frank26080115 0:84d7747641aa 296 if (TIMx== LPC_TIM0)
frank26080115 0:84d7747641aa 297 {
frank26080115 0:84d7747641aa 298 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM0, ENABLE);
frank26080115 0:84d7747641aa 299 CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_TIMER0, CLKPWR_PCLKSEL_CCLK_DIV_4);
frank26080115 0:84d7747641aa 300 }
frank26080115 0:84d7747641aa 301 else if (TIMx== LPC_TIM1)
frank26080115 0:84d7747641aa 302 {
frank26080115 0:84d7747641aa 303 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM1, ENABLE);
frank26080115 0:84d7747641aa 304 CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_TIMER1, CLKPWR_PCLKSEL_CCLK_DIV_4);
frank26080115 0:84d7747641aa 305
frank26080115 0:84d7747641aa 306 }
frank26080115 0:84d7747641aa 307
frank26080115 0:84d7747641aa 308 else if (TIMx== LPC_TIM2)
frank26080115 0:84d7747641aa 309 {
frank26080115 0:84d7747641aa 310 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM2, ENABLE);
frank26080115 0:84d7747641aa 311 CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_TIMER2, CLKPWR_PCLKSEL_CCLK_DIV_4);
frank26080115 0:84d7747641aa 312 }
frank26080115 0:84d7747641aa 313 else if (TIMx== LPC_TIM3)
frank26080115 0:84d7747641aa 314 {
frank26080115 0:84d7747641aa 315 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM3, ENABLE);
frank26080115 0:84d7747641aa 316 CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_TIMER3, CLKPWR_PCLKSEL_CCLK_DIV_4);
frank26080115 0:84d7747641aa 317
frank26080115 0:84d7747641aa 318 }
frank26080115 0:84d7747641aa 319
frank26080115 0:84d7747641aa 320 TIMx->CCR &= ~TIM_CTCR_MODE_MASK;
frank26080115 0:84d7747641aa 321 TIMx->CCR |= TIM_TIMER_MODE;
frank26080115 0:84d7747641aa 322
frank26080115 0:84d7747641aa 323 TIMx->TC =0;
frank26080115 0:84d7747641aa 324 TIMx->PC =0;
frank26080115 0:84d7747641aa 325 TIMx->PR =0;
frank26080115 0:84d7747641aa 326 TIMx->TCR |= (1<<1); //Reset Counter
frank26080115 0:84d7747641aa 327 TIMx->TCR &= ~(1<<1); //release reset
frank26080115 0:84d7747641aa 328 if (TimerCounterMode == TIM_TIMER_MODE )
frank26080115 0:84d7747641aa 329 {
frank26080115 0:84d7747641aa 330 pTimeCfg = (TIM_TIMERCFG_Type *)TIM_ConfigStruct;
frank26080115 0:84d7747641aa 331 if (pTimeCfg->PrescaleOption == TIM_PRESCALE_TICKVAL)
frank26080115 0:84d7747641aa 332 {
frank26080115 0:84d7747641aa 333 TIMx->PR = pTimeCfg->PrescaleValue -1 ;
frank26080115 0:84d7747641aa 334 }
frank26080115 0:84d7747641aa 335 else
frank26080115 0:84d7747641aa 336 {
frank26080115 0:84d7747641aa 337 TIMx->PR = converUSecToVal (converPtrToTimeNum(TIMx),pTimeCfg->PrescaleValue)-1;
frank26080115 0:84d7747641aa 338 }
frank26080115 0:84d7747641aa 339 }
frank26080115 0:84d7747641aa 340 else
frank26080115 0:84d7747641aa 341 {
frank26080115 0:84d7747641aa 342
frank26080115 0:84d7747641aa 343 pCounterCfg = (TIM_COUNTERCFG_Type *)TIM_ConfigStruct;
frank26080115 0:84d7747641aa 344 TIMx->CCR &= ~TIM_CTCR_INPUT_MASK;
frank26080115 0:84d7747641aa 345 if (pCounterCfg->CountInputSelect == TIM_COUNTER_INCAP1)
frank26080115 0:84d7747641aa 346 TIMx->CCR |= _BIT(2);
frank26080115 0:84d7747641aa 347 }
frank26080115 0:84d7747641aa 348
frank26080115 0:84d7747641aa 349 // Clear interrupt pending
frank26080115 0:84d7747641aa 350 TIMx->IR = 0xFFFFFFFF;
frank26080115 0:84d7747641aa 351
frank26080115 0:84d7747641aa 352 }
frank26080115 0:84d7747641aa 353
frank26080115 0:84d7747641aa 354 /*********************************************************************//**
frank26080115 0:84d7747641aa 355 * @brief Close Timer/Counter device
frank26080115 0:84d7747641aa 356 * @param[in] TIMx Pointer to timer device, should be:
frank26080115 0:84d7747641aa 357 * - LPC_TIM0: TIMER0 peripheral
frank26080115 0:84d7747641aa 358 * - LPC_TIM1: TIMER1 peripheral
frank26080115 0:84d7747641aa 359 * - LPC_TIM2: TIMER2 peripheral
frank26080115 0:84d7747641aa 360 * - LPC_TIM3: TIMER3 peripheral
frank26080115 0:84d7747641aa 361 * @return None
frank26080115 0:84d7747641aa 362 **********************************************************************/
frank26080115 0:84d7747641aa 363 void TIM_DeInit (LPC_TIM_TypeDef *TIMx)
frank26080115 0:84d7747641aa 364 {
frank26080115 0:84d7747641aa 365 CHECK_PARAM(PARAM_TIMx(TIMx));
frank26080115 0:84d7747641aa 366 // Disable timer/counter
frank26080115 0:84d7747641aa 367 TIMx->TCR = 0x00;
frank26080115 0:84d7747641aa 368
frank26080115 0:84d7747641aa 369 // Disable power
frank26080115 0:84d7747641aa 370 if (TIMx== LPC_TIM0)
frank26080115 0:84d7747641aa 371 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM0, DISABLE);
frank26080115 0:84d7747641aa 372
frank26080115 0:84d7747641aa 373 else if (TIMx== LPC_TIM1)
frank26080115 0:84d7747641aa 374 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM1, DISABLE);
frank26080115 0:84d7747641aa 375
frank26080115 0:84d7747641aa 376 else if (TIMx== LPC_TIM2)
frank26080115 0:84d7747641aa 377 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM2, DISABLE);
frank26080115 0:84d7747641aa 378
frank26080115 0:84d7747641aa 379 else if (TIMx== LPC_TIM3)
frank26080115 0:84d7747641aa 380 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCTIM2, DISABLE);
frank26080115 0:84d7747641aa 381
frank26080115 0:84d7747641aa 382 }
frank26080115 0:84d7747641aa 383
frank26080115 0:84d7747641aa 384 /*********************************************************************//**
frank26080115 0:84d7747641aa 385 * @brief Start/Stop Timer/Counter device
frank26080115 0:84d7747641aa 386 * @param[in] TIMx Pointer to timer device, should be:
frank26080115 0:84d7747641aa 387 * - LPC_TIM0: TIMER0 peripheral
frank26080115 0:84d7747641aa 388 * - LPC_TIM1: TIMER1 peripheral
frank26080115 0:84d7747641aa 389 * - LPC_TIM2: TIMER2 peripheral
frank26080115 0:84d7747641aa 390 * - LPC_TIM3: TIMER3 peripheral
frank26080115 0:84d7747641aa 391 * @param[in] NewState
frank26080115 0:84d7747641aa 392 * - ENABLE : set timer enable
frank26080115 0:84d7747641aa 393 * - DISABLE : disable timer
frank26080115 0:84d7747641aa 394 * @return None
frank26080115 0:84d7747641aa 395 **********************************************************************/
frank26080115 0:84d7747641aa 396 void TIM_Cmd(LPC_TIM_TypeDef *TIMx, FunctionalState NewState)
frank26080115 0:84d7747641aa 397 {
frank26080115 0:84d7747641aa 398 CHECK_PARAM(PARAM_TIMx(TIMx));
frank26080115 0:84d7747641aa 399 if (NewState == ENABLE)
frank26080115 0:84d7747641aa 400 {
frank26080115 0:84d7747641aa 401 TIMx->TCR |= TIM_ENABLE;
frank26080115 0:84d7747641aa 402 }
frank26080115 0:84d7747641aa 403 else
frank26080115 0:84d7747641aa 404 {
frank26080115 0:84d7747641aa 405 TIMx->TCR &= ~TIM_ENABLE;
frank26080115 0:84d7747641aa 406 }
frank26080115 0:84d7747641aa 407 }
frank26080115 0:84d7747641aa 408
frank26080115 0:84d7747641aa 409 /*********************************************************************//**
frank26080115 0:84d7747641aa 410 * @brief Reset Timer/Counter device,
frank26080115 0:84d7747641aa 411 * Make TC and PC are synchronously reset on the next
frank26080115 0:84d7747641aa 412 * positive edge of PCLK
frank26080115 0:84d7747641aa 413 * @param[in] TIMx Pointer to timer device, should be:
frank26080115 0:84d7747641aa 414 * - LPC_TIM0: TIMER0 peripheral
frank26080115 0:84d7747641aa 415 * - LPC_TIM1: TIMER1 peripheral
frank26080115 0:84d7747641aa 416 * - LPC_TIM2: TIMER2 peripheral
frank26080115 0:84d7747641aa 417 * - LPC_TIM3: TIMER3 peripheral
frank26080115 0:84d7747641aa 418 * @return None
frank26080115 0:84d7747641aa 419 **********************************************************************/
frank26080115 0:84d7747641aa 420 void TIM_ResetCounter(LPC_TIM_TypeDef *TIMx)
frank26080115 0:84d7747641aa 421 {
frank26080115 0:84d7747641aa 422 CHECK_PARAM(PARAM_TIMx(TIMx));
frank26080115 0:84d7747641aa 423 TIMx->TCR |= TIM_RESET;
frank26080115 0:84d7747641aa 424 TIMx->TCR &= ~TIM_RESET;
frank26080115 0:84d7747641aa 425 }
frank26080115 0:84d7747641aa 426
frank26080115 0:84d7747641aa 427 /*********************************************************************//**
frank26080115 0:84d7747641aa 428 * @brief Configuration for Match register
frank26080115 0:84d7747641aa 429 * @param[in] TIMx Pointer to timer device, should be:
frank26080115 0:84d7747641aa 430 * - LPC_TIM0: TIMER0 peripheral
frank26080115 0:84d7747641aa 431 * - LPC_TIM1: TIMER1 peripheral
frank26080115 0:84d7747641aa 432 * - LPC_TIM2: TIMER2 peripheral
frank26080115 0:84d7747641aa 433 * - LPC_TIM3: TIMER3 peripheral
frank26080115 0:84d7747641aa 434 * @param[in] TIM_MatchConfigStruct Pointer to TIM_MATCHCFG_Type
frank26080115 0:84d7747641aa 435 * - MatchChannel : choose channel 0 or 1
frank26080115 0:84d7747641aa 436 * - IntOnMatch : if SET, interrupt will be generated when MRxx match
frank26080115 0:84d7747641aa 437 * the value in TC
frank26080115 0:84d7747641aa 438 * - StopOnMatch : if SET, TC and PC will be stopped whenM Rxx match
frank26080115 0:84d7747641aa 439 * the value in TC
frank26080115 0:84d7747641aa 440 * - ResetOnMatch : if SET, Reset on MR0 when MRxx match
frank26080115 0:84d7747641aa 441 * the value in TC
frank26080115 0:84d7747641aa 442 * -ExtMatchOutputType: Select output for external match
frank26080115 0:84d7747641aa 443 * + 0: Do nothing for external output pin if match
frank26080115 0:84d7747641aa 444 * + 1: Force external output pin to low if match
frank26080115 0:84d7747641aa 445 * + 2: Force external output pin to high if match
frank26080115 0:84d7747641aa 446 * + 3: Toggle external output pin if match
frank26080115 0:84d7747641aa 447 * MatchValue: Set the value to be compared with TC value
frank26080115 0:84d7747641aa 448 * @return None
frank26080115 0:84d7747641aa 449 **********************************************************************/
frank26080115 0:84d7747641aa 450 void TIM_ConfigMatch(LPC_TIM_TypeDef *TIMx, TIM_MATCHCFG_Type *TIM_MatchConfigStruct)
frank26080115 0:84d7747641aa 451 {
frank26080115 0:84d7747641aa 452
frank26080115 0:84d7747641aa 453 CHECK_PARAM(PARAM_TIMx(TIMx));
frank26080115 0:84d7747641aa 454 CHECK_PARAM(PARAM_TIM_EXTMATCH_OPT(TIM_MatchConfigStruct->ExtMatchOutputType));
frank26080115 0:84d7747641aa 455
frank26080115 0:84d7747641aa 456 switch(TIM_MatchConfigStruct->MatchChannel)
frank26080115 0:84d7747641aa 457 {
frank26080115 0:84d7747641aa 458 case 0:
frank26080115 0:84d7747641aa 459 TIMx->MR0 = TIM_MatchConfigStruct->MatchValue;
frank26080115 0:84d7747641aa 460 break;
frank26080115 0:84d7747641aa 461 case 1:
frank26080115 0:84d7747641aa 462 TIMx->MR1 = TIM_MatchConfigStruct->MatchValue;
frank26080115 0:84d7747641aa 463 break;
frank26080115 0:84d7747641aa 464 case 2:
frank26080115 0:84d7747641aa 465 TIMx->MR2 = TIM_MatchConfigStruct->MatchValue;
frank26080115 0:84d7747641aa 466 break;
frank26080115 0:84d7747641aa 467 case 3:
frank26080115 0:84d7747641aa 468 TIMx->MR3 = TIM_MatchConfigStruct->MatchValue;
frank26080115 0:84d7747641aa 469 break;
frank26080115 0:84d7747641aa 470 default:
frank26080115 0:84d7747641aa 471 //Error match value
frank26080115 0:84d7747641aa 472 //Error loop
frank26080115 0:84d7747641aa 473 while(1);
frank26080115 0:84d7747641aa 474 }
frank26080115 0:84d7747641aa 475 //interrupt on MRn
frank26080115 0:84d7747641aa 476 TIMx->MCR &=~TIM_MCR_CHANNEL_MASKBIT(TIM_MatchConfigStruct->MatchChannel);
frank26080115 0:84d7747641aa 477
frank26080115 0:84d7747641aa 478 if (TIM_MatchConfigStruct->IntOnMatch)
frank26080115 0:84d7747641aa 479 TIMx->MCR |= TIM_INT_ON_MATCH(TIM_MatchConfigStruct->MatchChannel);
frank26080115 0:84d7747641aa 480
frank26080115 0:84d7747641aa 481 //reset on MRn
frank26080115 0:84d7747641aa 482 if (TIM_MatchConfigStruct->ResetOnMatch)
frank26080115 0:84d7747641aa 483 TIMx->MCR |= TIM_RESET_ON_MATCH(TIM_MatchConfigStruct->MatchChannel);
frank26080115 0:84d7747641aa 484
frank26080115 0:84d7747641aa 485 //stop on MRn
frank26080115 0:84d7747641aa 486 if (TIM_MatchConfigStruct->StopOnMatch)
frank26080115 0:84d7747641aa 487 TIMx->MCR |= TIM_STOP_ON_MATCH(TIM_MatchConfigStruct->MatchChannel);
frank26080115 0:84d7747641aa 488
frank26080115 0:84d7747641aa 489 // match output type
frank26080115 0:84d7747641aa 490
frank26080115 0:84d7747641aa 491 TIMx->EMR &= ~TIM_EM_MASK(TIM_MatchConfigStruct->MatchChannel);
frank26080115 0:84d7747641aa 492 TIMx->EMR |= TIM_EM_SET(TIM_MatchConfigStruct->MatchChannel,TIM_MatchConfigStruct->ExtMatchOutputType);
frank26080115 0:84d7747641aa 493 }
frank26080115 0:84d7747641aa 494 /*********************************************************************//**
frank26080115 0:84d7747641aa 495 * @brief Update Match value
frank26080115 0:84d7747641aa 496 * @param[in] TIMx Pointer to timer device, should be:
frank26080115 0:84d7747641aa 497 * - LPC_TIM0: TIMER0 peripheral
frank26080115 0:84d7747641aa 498 * - LPC_TIM1: TIMER1 peripheral
frank26080115 0:84d7747641aa 499 * - LPC_TIM2: TIMER2 peripheral
frank26080115 0:84d7747641aa 500 * - LPC_TIM3: TIMER3 peripheral
frank26080115 0:84d7747641aa 501 * @param[in] MatchChannel Match channel, should be: 0..3
frank26080115 0:84d7747641aa 502 * @param[in] MatchValue updated match value
frank26080115 0:84d7747641aa 503 * @return None
frank26080115 0:84d7747641aa 504 **********************************************************************/
frank26080115 0:84d7747641aa 505 void TIM_UpdateMatchValue(LPC_TIM_TypeDef *TIMx,uint8_t MatchChannel, uint32_t MatchValue)
frank26080115 0:84d7747641aa 506 {
frank26080115 0:84d7747641aa 507 CHECK_PARAM(PARAM_TIMx(TIMx));
frank26080115 0:84d7747641aa 508 switch(MatchChannel)
frank26080115 0:84d7747641aa 509 {
frank26080115 0:84d7747641aa 510 case 0:
frank26080115 0:84d7747641aa 511 TIMx->MR0 = MatchValue;
frank26080115 0:84d7747641aa 512 break;
frank26080115 0:84d7747641aa 513 case 1:
frank26080115 0:84d7747641aa 514 TIMx->MR1 = MatchValue;
frank26080115 0:84d7747641aa 515 break;
frank26080115 0:84d7747641aa 516 case 2:
frank26080115 0:84d7747641aa 517 TIMx->MR2 = MatchValue;
frank26080115 0:84d7747641aa 518 break;
frank26080115 0:84d7747641aa 519 case 3:
frank26080115 0:84d7747641aa 520 TIMx->MR3 = MatchValue;
frank26080115 0:84d7747641aa 521 break;
frank26080115 0:84d7747641aa 522 default:
frank26080115 0:84d7747641aa 523 //Error Loop
frank26080115 0:84d7747641aa 524 while(1);
frank26080115 0:84d7747641aa 525 }
frank26080115 0:84d7747641aa 526
frank26080115 0:84d7747641aa 527 }
frank26080115 0:84d7747641aa 528 /*********************************************************************//**
frank26080115 0:84d7747641aa 529 * @brief Configuration for Capture register
frank26080115 0:84d7747641aa 530 * @param[in] TIMx Pointer to timer device, should be:
frank26080115 0:84d7747641aa 531 * - LPC_TIM0: TIMER0 peripheral
frank26080115 0:84d7747641aa 532 * - LPC_TIM1: TIMER1 peripheral
frank26080115 0:84d7747641aa 533 * - LPC_TIM2: TIMER2 peripheral
frank26080115 0:84d7747641aa 534 * - LPC_TIM3: TIMER3 peripheral
frank26080115 0:84d7747641aa 535 * - CaptureChannel: set the channel to capture data
frank26080115 0:84d7747641aa 536 * - RisingEdge : if SET, Capture at rising edge
frank26080115 0:84d7747641aa 537 * - FallingEdge : if SET, Capture at falling edge
frank26080115 0:84d7747641aa 538 * - IntOnCaption : if SET, Capture generate interrupt
frank26080115 0:84d7747641aa 539 * @param[in] TIM_CaptureConfigStruct Pointer to TIM_CAPTURECFG_Type
frank26080115 0:84d7747641aa 540 * @return None
frank26080115 0:84d7747641aa 541 **********************************************************************/
frank26080115 0:84d7747641aa 542 void TIM_ConfigCapture(LPC_TIM_TypeDef *TIMx, TIM_CAPTURECFG_Type *TIM_CaptureConfigStruct)
frank26080115 0:84d7747641aa 543 {
frank26080115 0:84d7747641aa 544
frank26080115 0:84d7747641aa 545 CHECK_PARAM(PARAM_TIMx(TIMx));
frank26080115 0:84d7747641aa 546 TIMx->CCR &= ~TIM_CCR_CHANNEL_MASKBIT(TIM_CaptureConfigStruct->CaptureChannel);
frank26080115 0:84d7747641aa 547
frank26080115 0:84d7747641aa 548 if (TIM_CaptureConfigStruct->RisingEdge)
frank26080115 0:84d7747641aa 549 TIMx->CCR |= TIM_CAP_RISING(TIM_CaptureConfigStruct->CaptureChannel);
frank26080115 0:84d7747641aa 550
frank26080115 0:84d7747641aa 551 if (TIM_CaptureConfigStruct->FallingEdge)
frank26080115 0:84d7747641aa 552 TIMx->CCR |= TIM_CAP_FALLING(TIM_CaptureConfigStruct->CaptureChannel);
frank26080115 0:84d7747641aa 553
frank26080115 0:84d7747641aa 554 if (TIM_CaptureConfigStruct->IntOnCaption)
frank26080115 0:84d7747641aa 555 TIMx->CCR |= TIM_INT_ON_CAP(TIM_CaptureConfigStruct->CaptureChannel);
frank26080115 0:84d7747641aa 556 }
frank26080115 0:84d7747641aa 557
frank26080115 0:84d7747641aa 558 /*********************************************************************//**
frank26080115 0:84d7747641aa 559 * @brief Read value of capture register in timer/counter device
frank26080115 0:84d7747641aa 560 * @param[in] TIMx Pointer to timer/counter device, should be:
frank26080115 0:84d7747641aa 561 * - LPC_TIM0: TIMER0 peripheral
frank26080115 0:84d7747641aa 562 * - LPC_TIM1: TIMER1 peripheral
frank26080115 0:84d7747641aa 563 * - LPC_TIM2: TIMER2 peripheral
frank26080115 0:84d7747641aa 564 * - LPC_TIM3: TIMER3 peripheral
frank26080115 0:84d7747641aa 565 * @param[in] CaptureChannel: capture channel number, should be:
frank26080115 0:84d7747641aa 566 * - TIM_COUNTER_INCAP0: CAPn.0 input pin for TIMERn
frank26080115 0:84d7747641aa 567 * - TIM_COUNTER_INCAP1: CAPn.1 input pin for TIMERn
frank26080115 0:84d7747641aa 568 * @return Value of capture register
frank26080115 0:84d7747641aa 569 **********************************************************************/
frank26080115 0:84d7747641aa 570 uint32_t TIM_GetCaptureValue(LPC_TIM_TypeDef *TIMx, TIM_COUNTER_INPUT_OPT CaptureChannel)
frank26080115 0:84d7747641aa 571 {
frank26080115 0:84d7747641aa 572 CHECK_PARAM(PARAM_TIMx(TIMx));
frank26080115 0:84d7747641aa 573 CHECK_PARAM(PARAM_TIM_COUNTER_INPUT_OPT(CaptureChannel));
frank26080115 0:84d7747641aa 574
frank26080115 0:84d7747641aa 575 if(CaptureChannel==0)
frank26080115 0:84d7747641aa 576 return TIMx->CR0;
frank26080115 0:84d7747641aa 577 else
frank26080115 0:84d7747641aa 578 return TIMx->CR1;
frank26080115 0:84d7747641aa 579 }
frank26080115 0:84d7747641aa 580
frank26080115 0:84d7747641aa 581 /**
frank26080115 0:84d7747641aa 582 * @}
frank26080115 0:84d7747641aa 583 */
frank26080115 0:84d7747641aa 584
frank26080115 0:84d7747641aa 585 #endif /* _TIMER */
frank26080115 0:84d7747641aa 586
frank26080115 0:84d7747641aa 587 /**
frank26080115 0:84d7747641aa 588 * @}
frank26080115 0:84d7747641aa 589 */
frank26080115 0:84d7747641aa 590
frank26080115 0:84d7747641aa 591 /* --------------------------------- End Of File ------------------------------ */