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_pwm.c
frank26080115 0:84d7747641aa 3 * @brief Contains all functions support for PWM firmware library on LPC17xx
frank26080115 0:84d7747641aa 4 * @version 2.0
frank26080115 0:84d7747641aa 5 * @date 21. May. 2010
frank26080115 0:84d7747641aa 6 * @author NXP MCU SW Application Team
frank26080115 0:84d7747641aa 7 **************************************************************************
frank26080115 0:84d7747641aa 8 * Software that is described herein is for illustrative purposes only
frank26080115 0:84d7747641aa 9 * which provides customers with programming information regarding the
frank26080115 0:84d7747641aa 10 * products. This software is supplied "AS IS" without any warranties.
frank26080115 0:84d7747641aa 11 * NXP Semiconductors assumes no responsibility or liability for the
frank26080115 0:84d7747641aa 12 * use of the software, conveys no license or title under any patent,
frank26080115 0:84d7747641aa 13 * copyright, or mask work right to the product. NXP Semiconductors
frank26080115 0:84d7747641aa 14 * reserves the right to make changes in the software without
frank26080115 0:84d7747641aa 15 * notification. NXP Semiconductors also make no representation or
frank26080115 0:84d7747641aa 16 * warranty that such application will be suitable for the specified
frank26080115 0:84d7747641aa 17 * use without further testing or modification.
frank26080115 0:84d7747641aa 18 **********************************************************************/
frank26080115 0:84d7747641aa 19
frank26080115 0:84d7747641aa 20 /* Peripheral group ----------------------------------------------------------- */
frank26080115 0:84d7747641aa 21 /** @addtogroup PWM
frank26080115 0:84d7747641aa 22 * @{
frank26080115 0:84d7747641aa 23 */
frank26080115 0:84d7747641aa 24
frank26080115 0:84d7747641aa 25 /* Includes ------------------------------------------------------------------- */
frank26080115 0:84d7747641aa 26 #include "lpc17xx_pwm.h"
frank26080115 0:84d7747641aa 27 #include "lpc17xx_clkpwr.h"
frank26080115 0:84d7747641aa 28
frank26080115 0:84d7747641aa 29 /* If this source file built with example, the LPC17xx FW library configuration
frank26080115 0:84d7747641aa 30 * file in each example directory ("lpc17xx_libcfg.h") must be included,
frank26080115 0:84d7747641aa 31 * otherwise the default FW library configuration file must be included instead
frank26080115 0:84d7747641aa 32 */
frank26080115 0:84d7747641aa 33 #ifdef __BUILD_WITH_EXAMPLE__
frank26080115 0:84d7747641aa 34 #include "lpc17xx_libcfg.h"
frank26080115 0:84d7747641aa 35 #else
frank26080115 0:84d7747641aa 36 #include "lpc17xx_libcfg_default.h"
frank26080115 0:84d7747641aa 37 #endif /* __BUILD_WITH_EXAMPLE__ */
frank26080115 0:84d7747641aa 38
frank26080115 0:84d7747641aa 39
frank26080115 0:84d7747641aa 40 #ifdef _PWM
frank26080115 0:84d7747641aa 41
frank26080115 0:84d7747641aa 42
frank26080115 0:84d7747641aa 43 /* Public Functions ----------------------------------------------------------- */
frank26080115 0:84d7747641aa 44 /** @addtogroup PWM_Public_Functions
frank26080115 0:84d7747641aa 45 * @{
frank26080115 0:84d7747641aa 46 */
frank26080115 0:84d7747641aa 47
frank26080115 0:84d7747641aa 48
frank26080115 0:84d7747641aa 49 /*********************************************************************//**
frank26080115 0:84d7747641aa 50 * @brief Check whether specified interrupt flag in PWM is set or not
frank26080115 0:84d7747641aa 51 * @param[in] PWMx: PWM peripheral, should be LPC_PWM1
frank26080115 0:84d7747641aa 52 * @param[in] IntFlag: PWM interrupt flag, should be:
frank26080115 0:84d7747641aa 53 * - PWM_INTSTAT_MR0: Interrupt flag for PWM match channel 0
frank26080115 0:84d7747641aa 54 * - PWM_INTSTAT_MR1: Interrupt flag for PWM match channel 1
frank26080115 0:84d7747641aa 55 * - PWM_INTSTAT_MR2: Interrupt flag for PWM match channel 2
frank26080115 0:84d7747641aa 56 * - PWM_INTSTAT_MR3: Interrupt flag for PWM match channel 3
frank26080115 0:84d7747641aa 57 * - PWM_INTSTAT_MR4: Interrupt flag for PWM match channel 4
frank26080115 0:84d7747641aa 58 * - PWM_INTSTAT_MR5: Interrupt flag for PWM match channel 5
frank26080115 0:84d7747641aa 59 * - PWM_INTSTAT_MR6: Interrupt flag for PWM match channel 6
frank26080115 0:84d7747641aa 60 * - PWM_INTSTAT_CAP0: Interrupt flag for capture input 0
frank26080115 0:84d7747641aa 61 * - PWM_INTSTAT_CAP1: Interrupt flag for capture input 1
frank26080115 0:84d7747641aa 62 * @return New State of PWM interrupt flag (SET or RESET)
frank26080115 0:84d7747641aa 63 **********************************************************************/
frank26080115 0:84d7747641aa 64 IntStatus PWM_GetIntStatus(LPC_PWM_TypeDef *PWMx, uint32_t IntFlag)
frank26080115 0:84d7747641aa 65 {
frank26080115 0:84d7747641aa 66 CHECK_PARAM(PARAM_PWMx(PWMx));
frank26080115 0:84d7747641aa 67 CHECK_PARAM(PARAM_PWM_INTSTAT(IntFlag));
frank26080115 0:84d7747641aa 68
frank26080115 0:84d7747641aa 69 return ((PWMx->IR & IntFlag) ? SET : RESET);
frank26080115 0:84d7747641aa 70 }
frank26080115 0:84d7747641aa 71
frank26080115 0:84d7747641aa 72
frank26080115 0:84d7747641aa 73
frank26080115 0:84d7747641aa 74 /*********************************************************************//**
frank26080115 0:84d7747641aa 75 * @brief Clear specified PWM Interrupt pending
frank26080115 0:84d7747641aa 76 * @param[in] PWMx: PWM peripheral, should be LPC_PWM1
frank26080115 0:84d7747641aa 77 * @param[in] IntFlag: PWM interrupt flag, should be:
frank26080115 0:84d7747641aa 78 * - PWM_INTSTAT_MR0: Interrupt flag for PWM match channel 0
frank26080115 0:84d7747641aa 79 * - PWM_INTSTAT_MR1: Interrupt flag for PWM match channel 1
frank26080115 0:84d7747641aa 80 * - PWM_INTSTAT_MR2: Interrupt flag for PWM match channel 2
frank26080115 0:84d7747641aa 81 * - PWM_INTSTAT_MR3: Interrupt flag for PWM match channel 3
frank26080115 0:84d7747641aa 82 * - PWM_INTSTAT_MR4: Interrupt flag for PWM match channel 4
frank26080115 0:84d7747641aa 83 * - PWM_INTSTAT_MR5: Interrupt flag for PWM match channel 5
frank26080115 0:84d7747641aa 84 * - PWM_INTSTAT_MR6: Interrupt flag for PWM match channel 6
frank26080115 0:84d7747641aa 85 * - PWM_INTSTAT_CAP0: Interrupt flag for capture input 0
frank26080115 0:84d7747641aa 86 * - PWM_INTSTAT_CAP1: Interrupt flag for capture input 1
frank26080115 0:84d7747641aa 87 * @return None
frank26080115 0:84d7747641aa 88 **********************************************************************/
frank26080115 0:84d7747641aa 89 void PWM_ClearIntPending(LPC_PWM_TypeDef *PWMx, uint32_t IntFlag)
frank26080115 0:84d7747641aa 90 {
frank26080115 0:84d7747641aa 91 CHECK_PARAM(PARAM_PWMx(PWMx));
frank26080115 0:84d7747641aa 92 CHECK_PARAM(PARAM_PWM_INTSTAT(IntFlag));
frank26080115 0:84d7747641aa 93 PWMx->IR = IntFlag;
frank26080115 0:84d7747641aa 94 }
frank26080115 0:84d7747641aa 95
frank26080115 0:84d7747641aa 96
frank26080115 0:84d7747641aa 97
frank26080115 0:84d7747641aa 98 /*****************************************************************************//**
frank26080115 0:84d7747641aa 99 * @brief Fills each PWM_InitStruct member with its default value:
frank26080115 0:84d7747641aa 100 * - If PWMCounterMode = PWM_MODE_TIMER:
frank26080115 0:84d7747641aa 101 * + PrescaleOption = PWM_TIMER_PRESCALE_USVAL
frank26080115 0:84d7747641aa 102 * + PrescaleValue = 1
frank26080115 0:84d7747641aa 103 * - If PWMCounterMode = PWM_MODE_COUNTER:
frank26080115 0:84d7747641aa 104 * + CountInputSelect = PWM_COUNTER_PCAP1_0
frank26080115 0:84d7747641aa 105 * + CounterOption = PWM_COUNTER_RISING
frank26080115 0:84d7747641aa 106 * @param[in] PWMTimerCounterMode Timer or Counter mode, should be:
frank26080115 0:84d7747641aa 107 * - PWM_MODE_TIMER: Counter of PWM peripheral is in Timer mode
frank26080115 0:84d7747641aa 108 * - PWM_MODE_COUNTER: Counter of PWM peripheral is in Counter mode
frank26080115 0:84d7747641aa 109 * @param[in] PWM_InitStruct Pointer to structure (PWM_TIMERCFG_Type or
frank26080115 0:84d7747641aa 110 * PWM_COUNTERCFG_Type) which will be initialized.
frank26080115 0:84d7747641aa 111 * @return None
frank26080115 0:84d7747641aa 112 * Note: PWM_InitStruct pointer will be assigned to corresponding structure
frank26080115 0:84d7747641aa 113 * (PWM_TIMERCFG_Type or PWM_COUNTERCFG_Type) due to PWMTimerCounterMode.
frank26080115 0:84d7747641aa 114 *******************************************************************************/
frank26080115 0:84d7747641aa 115 void PWM_ConfigStructInit(uint8_t PWMTimerCounterMode, void *PWM_InitStruct)
frank26080115 0:84d7747641aa 116 {
frank26080115 0:84d7747641aa 117 PWM_TIMERCFG_Type *pTimeCfg;
frank26080115 0:84d7747641aa 118 PWM_COUNTERCFG_Type *pCounterCfg;
frank26080115 0:84d7747641aa 119 CHECK_PARAM(PARAM_PWM_TC_MODE(PWMTimerCounterMode));
frank26080115 0:84d7747641aa 120
frank26080115 0:84d7747641aa 121 pTimeCfg = (PWM_TIMERCFG_Type *) PWM_InitStruct;
frank26080115 0:84d7747641aa 122 pCounterCfg = (PWM_COUNTERCFG_Type *) PWM_InitStruct;
frank26080115 0:84d7747641aa 123
frank26080115 0:84d7747641aa 124 if (PWMTimerCounterMode == PWM_MODE_TIMER )
frank26080115 0:84d7747641aa 125 {
frank26080115 0:84d7747641aa 126 pTimeCfg->PrescaleOption = PWM_TIMER_PRESCALE_USVAL;
frank26080115 0:84d7747641aa 127 pTimeCfg->PrescaleValue = 1;
frank26080115 0:84d7747641aa 128 }
frank26080115 0:84d7747641aa 129 else if (PWMTimerCounterMode == PWM_MODE_COUNTER)
frank26080115 0:84d7747641aa 130 {
frank26080115 0:84d7747641aa 131 pCounterCfg->CountInputSelect = PWM_COUNTER_PCAP1_0;
frank26080115 0:84d7747641aa 132 pCounterCfg->CounterOption = PWM_COUNTER_RISING;
frank26080115 0:84d7747641aa 133 }
frank26080115 0:84d7747641aa 134 }
frank26080115 0:84d7747641aa 135
frank26080115 0:84d7747641aa 136
frank26080115 0:84d7747641aa 137 /*********************************************************************//**
frank26080115 0:84d7747641aa 138 * @brief Initializes the PWMx peripheral corresponding to the specified
frank26080115 0:84d7747641aa 139 * parameters in the PWM_ConfigStruct.
frank26080115 0:84d7747641aa 140 * @param[in] PWMx PWM peripheral, should be LPC_PWM1
frank26080115 0:84d7747641aa 141 * @param[in] PWMTimerCounterMode Timer or Counter mode, should be:
frank26080115 0:84d7747641aa 142 * - PWM_MODE_TIMER: Counter of PWM peripheral is in Timer mode
frank26080115 0:84d7747641aa 143 * - PWM_MODE_COUNTER: Counter of PWM peripheral is in Counter mode
frank26080115 0:84d7747641aa 144 * @param[in] PWM_ConfigStruct Pointer to structure (PWM_TIMERCFG_Type or
frank26080115 0:84d7747641aa 145 * PWM_COUNTERCFG_Type) which will be initialized.
frank26080115 0:84d7747641aa 146 * @return None
frank26080115 0:84d7747641aa 147 * Note: PWM_ConfigStruct pointer will be assigned to corresponding structure
frank26080115 0:84d7747641aa 148 * (PWM_TIMERCFG_Type or PWM_COUNTERCFG_Type) due to PWMTimerCounterMode.
frank26080115 0:84d7747641aa 149 **********************************************************************/
frank26080115 0:84d7747641aa 150 void PWM_Init(LPC_PWM_TypeDef *PWMx, uint32_t PWMTimerCounterMode, void *PWM_ConfigStruct)
frank26080115 0:84d7747641aa 151 {
frank26080115 0:84d7747641aa 152 PWM_TIMERCFG_Type *pTimeCfg;
frank26080115 0:84d7747641aa 153 PWM_COUNTERCFG_Type *pCounterCfg;
frank26080115 0:84d7747641aa 154 uint64_t clkdlycnt;
frank26080115 0:84d7747641aa 155
frank26080115 0:84d7747641aa 156 CHECK_PARAM(PARAM_PWMx(PWMx));
frank26080115 0:84d7747641aa 157 CHECK_PARAM(PARAM_PWM_TC_MODE(PWMTimerCounterMode));
frank26080115 0:84d7747641aa 158
frank26080115 0:84d7747641aa 159 pTimeCfg = (PWM_TIMERCFG_Type *)PWM_ConfigStruct;
frank26080115 0:84d7747641aa 160 pCounterCfg = (PWM_COUNTERCFG_Type *)PWM_ConfigStruct;
frank26080115 0:84d7747641aa 161
frank26080115 0:84d7747641aa 162
frank26080115 0:84d7747641aa 163 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCPWM1, ENABLE);
frank26080115 0:84d7747641aa 164 CLKPWR_SetPCLKDiv (CLKPWR_PCLKSEL_PWM1, CLKPWR_PCLKSEL_CCLK_DIV_4);
frank26080115 0:84d7747641aa 165 // Get peripheral clock of PWM1
frank26080115 0:84d7747641aa 166 clkdlycnt = (uint64_t) CLKPWR_GetPCLK (CLKPWR_PCLKSEL_PWM1);
frank26080115 0:84d7747641aa 167
frank26080115 0:84d7747641aa 168
frank26080115 0:84d7747641aa 169 // Clear all interrupts pending
frank26080115 0:84d7747641aa 170 PWMx->IR = 0xFF & PWM_IR_BITMASK;
frank26080115 0:84d7747641aa 171 PWMx->TCR = 0x00;
frank26080115 0:84d7747641aa 172 PWMx->CTCR = 0x00;
frank26080115 0:84d7747641aa 173 PWMx->MCR = 0x00;
frank26080115 0:84d7747641aa 174 PWMx->CCR = 0x00;
frank26080115 0:84d7747641aa 175 PWMx->PCR = 0x00;
frank26080115 0:84d7747641aa 176 PWMx->LER = 0x00;
frank26080115 0:84d7747641aa 177
frank26080115 0:84d7747641aa 178 if (PWMTimerCounterMode == PWM_MODE_TIMER)
frank26080115 0:84d7747641aa 179 {
frank26080115 0:84d7747641aa 180 CHECK_PARAM(PARAM_PWM_TIMER_PRESCALE(pTimeCfg->PrescaleOption));
frank26080115 0:84d7747641aa 181
frank26080115 0:84d7747641aa 182 /* Absolute prescale value */
frank26080115 0:84d7747641aa 183 if (pTimeCfg->PrescaleOption == PWM_TIMER_PRESCALE_TICKVAL)
frank26080115 0:84d7747641aa 184 {
frank26080115 0:84d7747641aa 185 PWMx->PR = pTimeCfg->PrescaleValue - 1;
frank26080115 0:84d7747641aa 186 }
frank26080115 0:84d7747641aa 187 /* uSecond prescale value */
frank26080115 0:84d7747641aa 188 else
frank26080115 0:84d7747641aa 189 {
frank26080115 0:84d7747641aa 190 clkdlycnt = (clkdlycnt * pTimeCfg->PrescaleValue) / 1000000;
frank26080115 0:84d7747641aa 191 PWMx->PR = ((uint32_t) clkdlycnt) - 1;
frank26080115 0:84d7747641aa 192 }
frank26080115 0:84d7747641aa 193
frank26080115 0:84d7747641aa 194 }
frank26080115 0:84d7747641aa 195 else if (PWMTimerCounterMode == PWM_MODE_COUNTER)
frank26080115 0:84d7747641aa 196 {
frank26080115 0:84d7747641aa 197 CHECK_PARAM(PARAM_PWM_COUNTER_INPUTSEL(pCounterCfg->CountInputSelect));
frank26080115 0:84d7747641aa 198 CHECK_PARAM(PARAM_PWM_COUNTER_EDGE(pCounterCfg->CounterOption));
frank26080115 0:84d7747641aa 199
frank26080115 0:84d7747641aa 200 PWMx->CTCR |= (PWM_CTCR_MODE((uint32_t)pCounterCfg->CounterOption)) \
frank26080115 0:84d7747641aa 201 | (PWM_CTCR_SELECT_INPUT((uint32_t)pCounterCfg->CountInputSelect));
frank26080115 0:84d7747641aa 202 }
frank26080115 0:84d7747641aa 203 }
frank26080115 0:84d7747641aa 204
frank26080115 0:84d7747641aa 205 /*********************************************************************//**
frank26080115 0:84d7747641aa 206 * @brief De-initializes the PWM peripheral registers to their
frank26080115 0:84d7747641aa 207 * default reset values.
frank26080115 0:84d7747641aa 208 * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1
frank26080115 0:84d7747641aa 209 * @return None
frank26080115 0:84d7747641aa 210 **********************************************************************/
frank26080115 0:84d7747641aa 211 void PWM_DeInit (LPC_PWM_TypeDef *PWMx)
frank26080115 0:84d7747641aa 212 {
frank26080115 0:84d7747641aa 213 CHECK_PARAM(PARAM_PWMx(PWMx));
frank26080115 0:84d7747641aa 214
frank26080115 0:84d7747641aa 215 // Disable PWM control (timer, counter and PWM)
frank26080115 0:84d7747641aa 216 PWMx->TCR = 0x00;
frank26080115 0:84d7747641aa 217 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCPWM1, DISABLE);
frank26080115 0:84d7747641aa 218
frank26080115 0:84d7747641aa 219 }
frank26080115 0:84d7747641aa 220
frank26080115 0:84d7747641aa 221
frank26080115 0:84d7747641aa 222 /*********************************************************************//**
frank26080115 0:84d7747641aa 223 * @brief Enable/Disable PWM peripheral
frank26080115 0:84d7747641aa 224 * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1
frank26080115 0:84d7747641aa 225 * @param[in] NewState New State of this function, should be:
frank26080115 0:84d7747641aa 226 * - ENABLE: Enable PWM peripheral
frank26080115 0:84d7747641aa 227 * - DISABLE: Disable PWM peripheral
frank26080115 0:84d7747641aa 228 * @return None
frank26080115 0:84d7747641aa 229 **********************************************************************/
frank26080115 0:84d7747641aa 230 void PWM_Cmd(LPC_PWM_TypeDef *PWMx, FunctionalState NewState)
frank26080115 0:84d7747641aa 231 {
frank26080115 0:84d7747641aa 232 CHECK_PARAM(PARAM_PWMx(PWMx));
frank26080115 0:84d7747641aa 233 CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));
frank26080115 0:84d7747641aa 234
frank26080115 0:84d7747641aa 235 if (NewState == ENABLE)
frank26080115 0:84d7747641aa 236 {
frank26080115 0:84d7747641aa 237 PWMx->TCR |= PWM_TCR_PWM_ENABLE;
frank26080115 0:84d7747641aa 238 }
frank26080115 0:84d7747641aa 239 else
frank26080115 0:84d7747641aa 240 {
frank26080115 0:84d7747641aa 241 PWMx->TCR &= (~PWM_TCR_PWM_ENABLE) & PWM_TCR_BITMASK;
frank26080115 0:84d7747641aa 242 }
frank26080115 0:84d7747641aa 243 }
frank26080115 0:84d7747641aa 244
frank26080115 0:84d7747641aa 245
frank26080115 0:84d7747641aa 246 /*********************************************************************//**
frank26080115 0:84d7747641aa 247 * @brief Enable/Disable Counter in PWM peripheral
frank26080115 0:84d7747641aa 248 * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1
frank26080115 0:84d7747641aa 249 * @param[in] NewState New State of this function, should be:
frank26080115 0:84d7747641aa 250 * - ENABLE: Enable Counter in PWM peripheral
frank26080115 0:84d7747641aa 251 * - DISABLE: Disable Counter in PWM peripheral
frank26080115 0:84d7747641aa 252 * @return None
frank26080115 0:84d7747641aa 253 **********************************************************************/
frank26080115 0:84d7747641aa 254 void PWM_CounterCmd(LPC_PWM_TypeDef *PWMx, FunctionalState NewState)
frank26080115 0:84d7747641aa 255 {
frank26080115 0:84d7747641aa 256 CHECK_PARAM(PARAM_PWMx(PWMx));
frank26080115 0:84d7747641aa 257 CHECK_PARAM(PARAM_FUNCTIONALSTATE(NewState));
frank26080115 0:84d7747641aa 258 if (NewState == ENABLE)
frank26080115 0:84d7747641aa 259 {
frank26080115 0:84d7747641aa 260 PWMx->TCR |= PWM_TCR_COUNTER_ENABLE;
frank26080115 0:84d7747641aa 261 }
frank26080115 0:84d7747641aa 262 else
frank26080115 0:84d7747641aa 263 {
frank26080115 0:84d7747641aa 264 PWMx->TCR &= (~PWM_TCR_COUNTER_ENABLE) & PWM_TCR_BITMASK;
frank26080115 0:84d7747641aa 265 }
frank26080115 0:84d7747641aa 266 }
frank26080115 0:84d7747641aa 267
frank26080115 0:84d7747641aa 268
frank26080115 0:84d7747641aa 269 /*********************************************************************//**
frank26080115 0:84d7747641aa 270 * @brief Reset Counter in PWM peripheral
frank26080115 0:84d7747641aa 271 * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1
frank26080115 0:84d7747641aa 272 * @return None
frank26080115 0:84d7747641aa 273 **********************************************************************/
frank26080115 0:84d7747641aa 274 void PWM_ResetCounter(LPC_PWM_TypeDef *PWMx)
frank26080115 0:84d7747641aa 275 {
frank26080115 0:84d7747641aa 276 CHECK_PARAM(PARAM_PWMx(PWMx));
frank26080115 0:84d7747641aa 277 PWMx->TCR |= PWM_TCR_COUNTER_RESET;
frank26080115 0:84d7747641aa 278 PWMx->TCR &= (~PWM_TCR_COUNTER_RESET) & PWM_TCR_BITMASK;
frank26080115 0:84d7747641aa 279 }
frank26080115 0:84d7747641aa 280
frank26080115 0:84d7747641aa 281
frank26080115 0:84d7747641aa 282 /*********************************************************************//**
frank26080115 0:84d7747641aa 283 * @brief Configures match for PWM peripheral
frank26080115 0:84d7747641aa 284 * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1
frank26080115 0:84d7747641aa 285 * @param[in] PWM_MatchConfigStruct Pointer to a PWM_MATCHCFG_Type structure
frank26080115 0:84d7747641aa 286 * that contains the configuration information for the
frank26080115 0:84d7747641aa 287 * specified PWM match function.
frank26080115 0:84d7747641aa 288 * @return None
frank26080115 0:84d7747641aa 289 **********************************************************************/
frank26080115 0:84d7747641aa 290 void PWM_ConfigMatch(LPC_PWM_TypeDef *PWMx, PWM_MATCHCFG_Type *PWM_MatchConfigStruct)
frank26080115 0:84d7747641aa 291 {
frank26080115 0:84d7747641aa 292 CHECK_PARAM(PARAM_PWMx(PWMx));
frank26080115 0:84d7747641aa 293 CHECK_PARAM(PARAM_PWM1_MATCH_CHANNEL(PWM_MatchConfigStruct->MatchChannel));
frank26080115 0:84d7747641aa 294 CHECK_PARAM(PARAM_FUNCTIONALSTATE(PWM_MatchConfigStruct->IntOnMatch));
frank26080115 0:84d7747641aa 295 CHECK_PARAM(PARAM_FUNCTIONALSTATE(PWM_MatchConfigStruct->ResetOnMatch));
frank26080115 0:84d7747641aa 296 CHECK_PARAM(PARAM_FUNCTIONALSTATE(PWM_MatchConfigStruct->StopOnMatch));
frank26080115 0:84d7747641aa 297
frank26080115 0:84d7747641aa 298 //interrupt on MRn
frank26080115 0:84d7747641aa 299 if (PWM_MatchConfigStruct->IntOnMatch == ENABLE)
frank26080115 0:84d7747641aa 300 {
frank26080115 0:84d7747641aa 301 PWMx->MCR |= PWM_MCR_INT_ON_MATCH(PWM_MatchConfigStruct->MatchChannel);
frank26080115 0:84d7747641aa 302 }
frank26080115 0:84d7747641aa 303 else
frank26080115 0:84d7747641aa 304 {
frank26080115 0:84d7747641aa 305 PWMx->MCR &= (~PWM_MCR_INT_ON_MATCH(PWM_MatchConfigStruct->MatchChannel)) \
frank26080115 0:84d7747641aa 306 & PWM_MCR_BITMASK;
frank26080115 0:84d7747641aa 307 }
frank26080115 0:84d7747641aa 308
frank26080115 0:84d7747641aa 309 //reset on MRn
frank26080115 0:84d7747641aa 310 if (PWM_MatchConfigStruct->ResetOnMatch == ENABLE)
frank26080115 0:84d7747641aa 311 {
frank26080115 0:84d7747641aa 312 PWMx->MCR |= PWM_MCR_RESET_ON_MATCH(PWM_MatchConfigStruct->MatchChannel);
frank26080115 0:84d7747641aa 313 }
frank26080115 0:84d7747641aa 314 else
frank26080115 0:84d7747641aa 315 {
frank26080115 0:84d7747641aa 316 PWMx->MCR &= (~PWM_MCR_RESET_ON_MATCH(PWM_MatchConfigStruct->MatchChannel)) \
frank26080115 0:84d7747641aa 317 & PWM_MCR_BITMASK;
frank26080115 0:84d7747641aa 318 }
frank26080115 0:84d7747641aa 319
frank26080115 0:84d7747641aa 320 //stop on MRn
frank26080115 0:84d7747641aa 321 if (PWM_MatchConfigStruct->StopOnMatch == ENABLE)
frank26080115 0:84d7747641aa 322 {
frank26080115 0:84d7747641aa 323 PWMx->MCR |= PWM_MCR_STOP_ON_MATCH(PWM_MatchConfigStruct->MatchChannel);
frank26080115 0:84d7747641aa 324 }
frank26080115 0:84d7747641aa 325 else
frank26080115 0:84d7747641aa 326 {
frank26080115 0:84d7747641aa 327 PWMx->MCR &= (~PWM_MCR_STOP_ON_MATCH(PWM_MatchConfigStruct->MatchChannel)) \
frank26080115 0:84d7747641aa 328 & PWM_MCR_BITMASK;
frank26080115 0:84d7747641aa 329 }
frank26080115 0:84d7747641aa 330 }
frank26080115 0:84d7747641aa 331
frank26080115 0:84d7747641aa 332
frank26080115 0:84d7747641aa 333 /*********************************************************************//**
frank26080115 0:84d7747641aa 334 * @brief Configures capture input for PWM peripheral
frank26080115 0:84d7747641aa 335 * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1
frank26080115 0:84d7747641aa 336 * @param[in] PWM_CaptureConfigStruct Pointer to a PWM_CAPTURECFG_Type structure
frank26080115 0:84d7747641aa 337 * that contains the configuration information for the
frank26080115 0:84d7747641aa 338 * specified PWM capture input function.
frank26080115 0:84d7747641aa 339 * @return None
frank26080115 0:84d7747641aa 340 **********************************************************************/
frank26080115 0:84d7747641aa 341 void PWM_ConfigCapture(LPC_PWM_TypeDef *PWMx, PWM_CAPTURECFG_Type *PWM_CaptureConfigStruct)
frank26080115 0:84d7747641aa 342 {
frank26080115 0:84d7747641aa 343 CHECK_PARAM(PARAM_PWMx(PWMx));
frank26080115 0:84d7747641aa 344 CHECK_PARAM(PARAM_PWM1_CAPTURE_CHANNEL(PWM_CaptureConfigStruct->CaptureChannel));
frank26080115 0:84d7747641aa 345 CHECK_PARAM(PARAM_FUNCTIONALSTATE(PWM_CaptureConfigStruct->FallingEdge));
frank26080115 0:84d7747641aa 346 CHECK_PARAM(PARAM_FUNCTIONALSTATE(PWM_CaptureConfigStruct->IntOnCaption));
frank26080115 0:84d7747641aa 347 CHECK_PARAM(PARAM_FUNCTIONALSTATE(PWM_CaptureConfigStruct->RisingEdge));
frank26080115 0:84d7747641aa 348
frank26080115 0:84d7747641aa 349 if (PWM_CaptureConfigStruct->RisingEdge == ENABLE)
frank26080115 0:84d7747641aa 350 {
frank26080115 0:84d7747641aa 351 PWMx->CCR |= PWM_CCR_CAP_RISING(PWM_CaptureConfigStruct->CaptureChannel);
frank26080115 0:84d7747641aa 352 }
frank26080115 0:84d7747641aa 353 else
frank26080115 0:84d7747641aa 354 {
frank26080115 0:84d7747641aa 355 PWMx->CCR &= (~PWM_CCR_CAP_RISING(PWM_CaptureConfigStruct->CaptureChannel)) \
frank26080115 0:84d7747641aa 356 & PWM_CCR_BITMASK;
frank26080115 0:84d7747641aa 357 }
frank26080115 0:84d7747641aa 358
frank26080115 0:84d7747641aa 359 if (PWM_CaptureConfigStruct->FallingEdge == ENABLE)
frank26080115 0:84d7747641aa 360 {
frank26080115 0:84d7747641aa 361 PWMx->CCR |= PWM_CCR_CAP_FALLING(PWM_CaptureConfigStruct->CaptureChannel);
frank26080115 0:84d7747641aa 362 }
frank26080115 0:84d7747641aa 363 else
frank26080115 0:84d7747641aa 364 {
frank26080115 0:84d7747641aa 365 PWMx->CCR &= (~PWM_CCR_CAP_FALLING(PWM_CaptureConfigStruct->CaptureChannel)) \
frank26080115 0:84d7747641aa 366 & PWM_CCR_BITMASK;
frank26080115 0:84d7747641aa 367 }
frank26080115 0:84d7747641aa 368
frank26080115 0:84d7747641aa 369 if (PWM_CaptureConfigStruct->IntOnCaption == ENABLE)
frank26080115 0:84d7747641aa 370 {
frank26080115 0:84d7747641aa 371 PWMx->CCR |= PWM_CCR_INT_ON_CAP(PWM_CaptureConfigStruct->CaptureChannel);
frank26080115 0:84d7747641aa 372 }
frank26080115 0:84d7747641aa 373 else
frank26080115 0:84d7747641aa 374 {
frank26080115 0:84d7747641aa 375 PWMx->CCR &= (~PWM_CCR_INT_ON_CAP(PWM_CaptureConfigStruct->CaptureChannel)) \
frank26080115 0:84d7747641aa 376 & PWM_CCR_BITMASK;
frank26080115 0:84d7747641aa 377 }
frank26080115 0:84d7747641aa 378 }
frank26080115 0:84d7747641aa 379
frank26080115 0:84d7747641aa 380
frank26080115 0:84d7747641aa 381 /*********************************************************************//**
frank26080115 0:84d7747641aa 382 * @brief Read value of capture register PWM peripheral
frank26080115 0:84d7747641aa 383 * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1
frank26080115 0:84d7747641aa 384 * @param[in] CaptureChannel: capture channel number, should be in
frank26080115 0:84d7747641aa 385 * range 0 to 1
frank26080115 0:84d7747641aa 386 * @return Value of capture register
frank26080115 0:84d7747641aa 387 **********************************************************************/
frank26080115 0:84d7747641aa 388 uint32_t PWM_GetCaptureValue(LPC_PWM_TypeDef *PWMx, uint8_t CaptureChannel)
frank26080115 0:84d7747641aa 389 {
frank26080115 0:84d7747641aa 390 CHECK_PARAM(PARAM_PWMx(PWMx));
frank26080115 0:84d7747641aa 391 CHECK_PARAM(PARAM_PWM1_CAPTURE_CHANNEL(CaptureChannel));
frank26080115 0:84d7747641aa 392
frank26080115 0:84d7747641aa 393 switch (CaptureChannel)
frank26080115 0:84d7747641aa 394 {
frank26080115 0:84d7747641aa 395 case 0:
frank26080115 0:84d7747641aa 396 return PWMx->CR0;
frank26080115 0:84d7747641aa 397
frank26080115 0:84d7747641aa 398 case 1:
frank26080115 0:84d7747641aa 399 return PWMx->CR1;
frank26080115 0:84d7747641aa 400
frank26080115 0:84d7747641aa 401 default:
frank26080115 0:84d7747641aa 402 return (0);
frank26080115 0:84d7747641aa 403 }
frank26080115 0:84d7747641aa 404 }
frank26080115 0:84d7747641aa 405
frank26080115 0:84d7747641aa 406
frank26080115 0:84d7747641aa 407 /********************************************************************//**
frank26080115 0:84d7747641aa 408 * @brief Update value for each PWM channel with update type option
frank26080115 0:84d7747641aa 409 * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1
frank26080115 0:84d7747641aa 410 * @param[in] MatchChannel Match channel
frank26080115 0:84d7747641aa 411 * @param[in] MatchValue Match value
frank26080115 0:84d7747641aa 412 * @param[in] UpdateType Type of Update, should be:
frank26080115 0:84d7747641aa 413 * - PWM_MATCH_UPDATE_NOW: The update value will be updated for
frank26080115 0:84d7747641aa 414 * this channel immediately
frank26080115 0:84d7747641aa 415 * - PWM_MATCH_UPDATE_NEXT_RST: The update value will be updated for
frank26080115 0:84d7747641aa 416 * this channel on next reset by a PWM Match event.
frank26080115 0:84d7747641aa 417 * @return None
frank26080115 0:84d7747641aa 418 *********************************************************************/
frank26080115 0:84d7747641aa 419 void PWM_MatchUpdate(LPC_PWM_TypeDef *PWMx, uint8_t MatchChannel, \
frank26080115 0:84d7747641aa 420 uint32_t MatchValue, uint8_t UpdateType)
frank26080115 0:84d7747641aa 421 {
frank26080115 0:84d7747641aa 422 CHECK_PARAM(PARAM_PWMx(PWMx));
frank26080115 0:84d7747641aa 423 CHECK_PARAM(PARAM_PWM1_MATCH_CHANNEL(MatchChannel));
frank26080115 0:84d7747641aa 424 CHECK_PARAM(PARAM_PWM_MATCH_UPDATE(UpdateType));
frank26080115 0:84d7747641aa 425
frank26080115 0:84d7747641aa 426 switch (MatchChannel)
frank26080115 0:84d7747641aa 427 {
frank26080115 0:84d7747641aa 428 case 0:
frank26080115 0:84d7747641aa 429 PWMx->MR0 = MatchValue;
frank26080115 0:84d7747641aa 430 break;
frank26080115 0:84d7747641aa 431
frank26080115 0:84d7747641aa 432 case 1:
frank26080115 0:84d7747641aa 433 PWMx->MR1 = MatchValue;
frank26080115 0:84d7747641aa 434 break;
frank26080115 0:84d7747641aa 435
frank26080115 0:84d7747641aa 436 case 2:
frank26080115 0:84d7747641aa 437 PWMx->MR2 = MatchValue;
frank26080115 0:84d7747641aa 438 break;
frank26080115 0:84d7747641aa 439
frank26080115 0:84d7747641aa 440 case 3:
frank26080115 0:84d7747641aa 441 PWMx->MR3 = MatchValue;
frank26080115 0:84d7747641aa 442 break;
frank26080115 0:84d7747641aa 443
frank26080115 0:84d7747641aa 444 case 4:
frank26080115 0:84d7747641aa 445 PWMx->MR4 = MatchValue;
frank26080115 0:84d7747641aa 446 break;
frank26080115 0:84d7747641aa 447
frank26080115 0:84d7747641aa 448 case 5:
frank26080115 0:84d7747641aa 449 PWMx->MR5 = MatchValue;
frank26080115 0:84d7747641aa 450 break;
frank26080115 0:84d7747641aa 451
frank26080115 0:84d7747641aa 452 case 6:
frank26080115 0:84d7747641aa 453 PWMx->MR6 = MatchValue;
frank26080115 0:84d7747641aa 454 break;
frank26080115 0:84d7747641aa 455 }
frank26080115 0:84d7747641aa 456
frank26080115 0:84d7747641aa 457 // Write Latch register
frank26080115 0:84d7747641aa 458 PWMx->LER |= PWM_LER_EN_MATCHn_LATCH(MatchChannel);
frank26080115 0:84d7747641aa 459
frank26080115 0:84d7747641aa 460 // In case of update now
frank26080115 0:84d7747641aa 461 if (UpdateType == PWM_MATCH_UPDATE_NOW)
frank26080115 0:84d7747641aa 462 {
frank26080115 0:84d7747641aa 463 PWMx->TCR |= PWM_TCR_COUNTER_RESET;
frank26080115 0:84d7747641aa 464 PWMx->TCR &= (~PWM_TCR_COUNTER_RESET) & PWM_TCR_BITMASK;
frank26080115 0:84d7747641aa 465 }
frank26080115 0:84d7747641aa 466 }
frank26080115 0:84d7747641aa 467
frank26080115 0:84d7747641aa 468
frank26080115 0:84d7747641aa 469 /********************************************************************//**
frank26080115 0:84d7747641aa 470 * @brief Configure Edge mode for each PWM channel
frank26080115 0:84d7747641aa 471 * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1
frank26080115 0:84d7747641aa 472 * @param[in] PWMChannel PWM channel, should be in range from 2 to 6
frank26080115 0:84d7747641aa 473 * @param[in] ModeOption PWM mode option, should be:
frank26080115 0:84d7747641aa 474 * - PWM_CHANNEL_SINGLE_EDGE: Single Edge mode
frank26080115 0:84d7747641aa 475 * - PWM_CHANNEL_DUAL_EDGE: Dual Edge mode
frank26080115 0:84d7747641aa 476 * @return None
frank26080115 0:84d7747641aa 477 * Note: PWM Channel 1 can not be selected for mode option
frank26080115 0:84d7747641aa 478 *********************************************************************/
frank26080115 0:84d7747641aa 479 void PWM_ChannelConfig(LPC_PWM_TypeDef *PWMx, uint8_t PWMChannel, uint8_t ModeOption)
frank26080115 0:84d7747641aa 480 {
frank26080115 0:84d7747641aa 481 CHECK_PARAM(PARAM_PWMx(PWMx));
frank26080115 0:84d7747641aa 482 CHECK_PARAM(PARAM_PWM1_EDGE_MODE_CHANNEL(PWMChannel));
frank26080115 0:84d7747641aa 483 CHECK_PARAM(PARAM_PWM_CHANNEL_EDGE(ModeOption));
frank26080115 0:84d7747641aa 484
frank26080115 0:84d7747641aa 485 // Single edge mode
frank26080115 0:84d7747641aa 486 if (ModeOption == PWM_CHANNEL_SINGLE_EDGE)
frank26080115 0:84d7747641aa 487 {
frank26080115 0:84d7747641aa 488 PWMx->PCR &= (~PWM_PCR_PWMSELn(PWMChannel)) & PWM_PCR_BITMASK;
frank26080115 0:84d7747641aa 489 }
frank26080115 0:84d7747641aa 490 // Double edge mode
frank26080115 0:84d7747641aa 491 else if (PWM_CHANNEL_DUAL_EDGE)
frank26080115 0:84d7747641aa 492 {
frank26080115 0:84d7747641aa 493 PWMx->PCR |= PWM_PCR_PWMSELn(PWMChannel);
frank26080115 0:84d7747641aa 494 }
frank26080115 0:84d7747641aa 495 }
frank26080115 0:84d7747641aa 496
frank26080115 0:84d7747641aa 497
frank26080115 0:84d7747641aa 498
frank26080115 0:84d7747641aa 499 /********************************************************************//**
frank26080115 0:84d7747641aa 500 * @brief Enable/Disable PWM channel output
frank26080115 0:84d7747641aa 501 * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1
frank26080115 0:84d7747641aa 502 * @param[in] PWMChannel PWM channel, should be in range from 1 to 6
frank26080115 0:84d7747641aa 503 * @param[in] NewState New State of this function, should be:
frank26080115 0:84d7747641aa 504 * - ENABLE: Enable this PWM channel output
frank26080115 0:84d7747641aa 505 * - DISABLE: Disable this PWM channel output
frank26080115 0:84d7747641aa 506 * @return None
frank26080115 0:84d7747641aa 507 *********************************************************************/
frank26080115 0:84d7747641aa 508 void PWM_ChannelCmd(LPC_PWM_TypeDef *PWMx, uint8_t PWMChannel, FunctionalState NewState)
frank26080115 0:84d7747641aa 509 {
frank26080115 0:84d7747641aa 510 CHECK_PARAM(PARAM_PWMx(PWMx));
frank26080115 0:84d7747641aa 511 CHECK_PARAM(PARAM_PWM1_CHANNEL(PWMChannel));
frank26080115 0:84d7747641aa 512
frank26080115 0:84d7747641aa 513 if (NewState == ENABLE)
frank26080115 0:84d7747641aa 514 {
frank26080115 0:84d7747641aa 515 PWMx->PCR |= PWM_PCR_PWMENAn(PWMChannel);
frank26080115 0:84d7747641aa 516 }
frank26080115 0:84d7747641aa 517 else
frank26080115 0:84d7747641aa 518 {
frank26080115 0:84d7747641aa 519 PWMx->PCR &= (~PWM_PCR_PWMENAn(PWMChannel)) & PWM_PCR_BITMASK;
frank26080115 0:84d7747641aa 520 }
frank26080115 0:84d7747641aa 521 }
frank26080115 0:84d7747641aa 522
frank26080115 0:84d7747641aa 523 /**
frank26080115 0:84d7747641aa 524 * @}
frank26080115 0:84d7747641aa 525 */
frank26080115 0:84d7747641aa 526
frank26080115 0:84d7747641aa 527 #endif /* _PWM */
frank26080115 0:84d7747641aa 528
frank26080115 0:84d7747641aa 529 /**
frank26080115 0:84d7747641aa 530 * @}
frank26080115 0:84d7747641aa 531 */
frank26080115 0:84d7747641aa 532
frank26080115 0:84d7747641aa 533 /* --------------------------------- End Of File ------------------------------ */