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