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_adc.c
igorsk 0:1063a091a062 3 * @brief : Contains all functions support for ADC firmware library on LPC17xx
igorsk 0:1063a091a062 4 * @version : 1.0
igorsk 0:1063a091a062 5 * @date : 3. April. 2009
igorsk 0:1063a091a062 6 * @author : NgaDinh
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 ADC
igorsk 0:1063a091a062 22 * @{
igorsk 0:1063a091a062 23 */
igorsk 0:1063a091a062 24
igorsk 0:1063a091a062 25 /* Includes ------------------------------------------------------------------- */
igorsk 0:1063a091a062 26 #include "lpc17xx_adc.h"
igorsk 0:1063a091a062 27 #include "lpc17xx_clkpwr.h"
igorsk 0:1063a091a062 28
igorsk 0:1063a091a062 29 /* If this source file built with example, the LPC17xx FW library configuration
igorsk 0:1063a091a062 30 * file in each example directory ("lpc17xx_libcfg.h") must be included,
igorsk 0:1063a091a062 31 * otherwise the default FW library configuration file must be included instead
igorsk 0:1063a091a062 32 */
igorsk 0:1063a091a062 33 #ifdef __BUILD_WITH_EXAMPLE__
igorsk 0:1063a091a062 34 #include "lpc17xx_libcfg.h"
igorsk 0:1063a091a062 35 #else
igorsk 0:1063a091a062 36 #include "lpc17xx_libcfg_default.h"
igorsk 0:1063a091a062 37 #endif /* __BUILD_WITH_EXAMPLE__ */
igorsk 0:1063a091a062 38
igorsk 0:1063a091a062 39
igorsk 0:1063a091a062 40 #ifdef _ADC
igorsk 0:1063a091a062 41
igorsk 0:1063a091a062 42 /* Public Functions ----------------------------------------------------------- */
igorsk 0:1063a091a062 43 /** @addtogroup ADC_Public_Functions
igorsk 0:1063a091a062 44 * @{
igorsk 0:1063a091a062 45 */
igorsk 0:1063a091a062 46
igorsk 0:1063a091a062 47 /*********************************************************************//**
igorsk 0:1063a091a062 48 * @brief Initial for ADC
igorsk 0:1063a091a062 49 * - Set bit PCADC
igorsk 0:1063a091a062 50 * - Set clock for ADC
igorsk 0:1063a091a062 51 * - Set Clock Frequency
igorsk 0:1063a091a062 52 *
igorsk 0:1063a091a062 53 * @param[in] ADCx pointer to LPC_ADC_TypeDef
igorsk 0:1063a091a062 54 * @param[in] ConvFreq Clock frequency
igorsk 0:1063a091a062 55 * @return None
igorsk 0:1063a091a062 56 **********************************************************************/
igorsk 0:1063a091a062 57 void ADC_Init(LPC_ADC_TypeDef *ADCx, uint32_t ConvFreq)
igorsk 0:1063a091a062 58
igorsk 0:1063a091a062 59 {
igorsk 0:1063a091a062 60 uint32_t temp, tmp;
igorsk 0:1063a091a062 61
igorsk 0:1063a091a062 62 CHECK_PARAM(PARAM_ADCx(ADCx));
igorsk 0:1063a091a062 63 CHECK_PARAM(PARAM_ADC_FREQUENCY(ConvFreq));
igorsk 0:1063a091a062 64
igorsk 0:1063a091a062 65 // Turn on power and clock
igorsk 0:1063a091a062 66 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCAD, ENABLE);
igorsk 0:1063a091a062 67 // Set clock divider for ADC to 4 from CCLK as default
igorsk 0:1063a091a062 68 // CLKPWR_SetPCLKDiv(CLKPWR_PCLKSEL_ADC,CLKPWR_PCLKSEL_CCLK_DIV_4);
igorsk 0:1063a091a062 69
igorsk 0:1063a091a062 70 ADCx->ADCR = 0;
igorsk 0:1063a091a062 71
igorsk 0:1063a091a062 72 //Enable PDN bit
igorsk 0:1063a091a062 73 tmp = ADC_CR_PDN;
igorsk 0:1063a091a062 74 // Set clock frequency
igorsk 0:1063a091a062 75 temp = CLKPWR_GetPCLK(CLKPWR_PCLKSEL_ADC) ;
igorsk 0:1063a091a062 76 temp = (temp /ConvFreq) - 1;
igorsk 0:1063a091a062 77 tmp |= ADC_CR_CLKDIV(temp);
igorsk 0:1063a091a062 78
igorsk 0:1063a091a062 79 ADCx->ADCR = tmp;
igorsk 0:1063a091a062 80 }
igorsk 0:1063a091a062 81
igorsk 0:1063a091a062 82
igorsk 0:1063a091a062 83 /*********************************************************************//**
igorsk 0:1063a091a062 84 * @brief Close ADC
igorsk 0:1063a091a062 85 * @param[in] ADCx pointer to ADC
igorsk 0:1063a091a062 86 * @return None
igorsk 0:1063a091a062 87 **********************************************************************/
igorsk 0:1063a091a062 88 void ADC_DeInit(LPC_ADC_TypeDef *ADCx)
igorsk 0:1063a091a062 89 {
igorsk 0:1063a091a062 90 CHECK_PARAM(PARAM_ADCx(ADCx));
igorsk 0:1063a091a062 91
igorsk 0:1063a091a062 92 // Clear PDN bit
igorsk 0:1063a091a062 93 ADCx->ADCR &= ~ADC_CR_PDN;
igorsk 0:1063a091a062 94 // Turn on power and clock
igorsk 0:1063a091a062 95 CLKPWR_ConfigPPWR (CLKPWR_PCONP_PCAD, DISABLE);
igorsk 0:1063a091a062 96 }
igorsk 0:1063a091a062 97
igorsk 0:1063a091a062 98
igorsk 0:1063a091a062 99 /*********************************************************************//**
igorsk 0:1063a091a062 100 * @brief Get Result conversion from A/D data register
igorsk 0:1063a091a062 101 * @param[in] channel number which want to read back the result
igorsk 0:1063a091a062 102 * @return Result of conversion
igorsk 0:1063a091a062 103 *********************************************************************/
igorsk 0:1063a091a062 104 uint32_t ADC_GetData(uint32_t channel)
igorsk 0:1063a091a062 105 {
igorsk 0:1063a091a062 106 uint32_t adc_value;
igorsk 0:1063a091a062 107
igorsk 0:1063a091a062 108 CHECK_PARAM(PARAM_ADC_CHANNEL_SELECTION(channel));
igorsk 0:1063a091a062 109
igorsk 0:1063a091a062 110 adc_value = *(uint32_t *)((&LPC_ADC->ADDR0) + channel);
igorsk 0:1063a091a062 111 return ADC_GDR_RESULT(adc_value);
igorsk 0:1063a091a062 112 }
igorsk 0:1063a091a062 113
igorsk 0:1063a091a062 114 /*********************************************************************//**
igorsk 0:1063a091a062 115 * @brief Set start mode for ADC
igorsk 0:1063a091a062 116 * @param[in] ADCx pointer to LPC_ADC_TypeDef
igorsk 0:1063a091a062 117 * @param[in] start_mode Start mode choose one of modes in
igorsk 0:1063a091a062 118 * 'ADC_START_OPT' enumeration type definition
igorsk 0:1063a091a062 119 * @return None
igorsk 0:1063a091a062 120 *********************************************************************/
igorsk 0:1063a091a062 121 void ADC_StartCmd(LPC_ADC_TypeDef *ADCx, uint8_t start_mode)
igorsk 0:1063a091a062 122 {
igorsk 0:1063a091a062 123 CHECK_PARAM(PARAM_ADCx(ADCx));
igorsk 0:1063a091a062 124 CHECK_PARAM(PARAM_ADC_START_OPT(start_mode));
igorsk 0:1063a091a062 125
igorsk 0:1063a091a062 126 ADCx->ADCR &= ~ADC_CR_START_MASK;
igorsk 0:1063a091a062 127 ADCx->ADCR |=ADC_CR_START_MODE_SEL((uint32_t)start_mode);
igorsk 0:1063a091a062 128 }
igorsk 0:1063a091a062 129
igorsk 0:1063a091a062 130
igorsk 0:1063a091a062 131 /*********************************************************************//**
igorsk 0:1063a091a062 132 * @brief ADC Burst mode setting
igorsk 0:1063a091a062 133 *
igorsk 0:1063a091a062 134 * @param[in] ADCx pointer to ADC
igorsk 0:1063a091a062 135 * @param[in] NewState
igorsk 0:1063a091a062 136 * - 1: Set Burst mode
igorsk 0:1063a091a062 137 * - 0: reset Burst mode
igorsk 0:1063a091a062 138 * @return None
igorsk 0:1063a091a062 139 **********************************************************************/
igorsk 0:1063a091a062 140 void ADC_BurstCmd(LPC_ADC_TypeDef *ADCx, FunctionalState NewState)
igorsk 0:1063a091a062 141 {
igorsk 0:1063a091a062 142 CHECK_PARAM(PARAM_ADCx(ADCx));
igorsk 0:1063a091a062 143
igorsk 0:1063a091a062 144 ADCx->ADCR &= ~ADC_CR_BURST;
igorsk 0:1063a091a062 145 if (NewState){
igorsk 0:1063a091a062 146 ADCx->ADCR |= ADC_CR_BURST;
igorsk 0:1063a091a062 147 }
igorsk 0:1063a091a062 148
igorsk 0:1063a091a062 149 }
igorsk 0:1063a091a062 150
igorsk 0:1063a091a062 151 /*********************************************************************//**
igorsk 0:1063a091a062 152 * @brief Set AD conversion in power mode
igorsk 0:1063a091a062 153 *
igorsk 0:1063a091a062 154 * @param[in] ADCx pointer to ADC
igorsk 0:1063a091a062 155 * @param[in] NewState
igorsk 0:1063a091a062 156 * - 1: AD converter is optional
igorsk 0:1063a091a062 157 * - 0: AD Converter is in power down mode
igorsk 0:1063a091a062 158 * @return None
igorsk 0:1063a091a062 159 **********************************************************************/
igorsk 0:1063a091a062 160 void ADC_PowerdownCmd(LPC_ADC_TypeDef *ADCx, FunctionalState NewState)
igorsk 0:1063a091a062 161 {
igorsk 0:1063a091a062 162 CHECK_PARAM(PARAM_ADCx(ADCx));
igorsk 0:1063a091a062 163
igorsk 0:1063a091a062 164 ADCx->ADCR &= ~ADC_CR_PDN;
igorsk 0:1063a091a062 165 if (NewState){
igorsk 0:1063a091a062 166 ADCx->ADCR |= ADC_CR_PDN;
igorsk 0:1063a091a062 167 }
igorsk 0:1063a091a062 168 }
igorsk 0:1063a091a062 169
igorsk 0:1063a091a062 170 /*********************************************************************//**
igorsk 0:1063a091a062 171 * @brief Set Edge start configuration
igorsk 0:1063a091a062 172 *
igorsk 0:1063a091a062 173 * @param[in] ADCx pointer to ADC
igorsk 0:1063a091a062 174 * @param[in] EdgeOption is ADC_START_ON_RISING and ADC_START_ON_FALLING
igorsk 0:1063a091a062 175 * 0:ADC_START_ON_RISING
igorsk 0:1063a091a062 176 * 1:ADC_START_ON_FALLING
igorsk 0:1063a091a062 177 *
igorsk 0:1063a091a062 178 * @return None
igorsk 0:1063a091a062 179 **********************************************************************/
igorsk 0:1063a091a062 180 void ADC_EdgeStartConfig(LPC_ADC_TypeDef *ADCx, uint8_t EdgeOption)
igorsk 0:1063a091a062 181 {
igorsk 0:1063a091a062 182 CHECK_PARAM(PARAM_ADCx(ADCx));
igorsk 0:1063a091a062 183 CHECK_PARAM(PARAM_ADC_START_ON_EDGE_OPT(EdgeOption));
igorsk 0:1063a091a062 184
igorsk 0:1063a091a062 185 ADCx->ADCR &= ~ADC_CR_EDGE;
igorsk 0:1063a091a062 186 if (EdgeOption){
igorsk 0:1063a091a062 187 ADCx->ADCR |= ADC_CR_EDGE;
igorsk 0:1063a091a062 188 }
igorsk 0:1063a091a062 189 }
igorsk 0:1063a091a062 190
igorsk 0:1063a091a062 191 /*********************************************************************//**
igorsk 0:1063a091a062 192 * @brief ADC interrupt configuration
igorsk 0:1063a091a062 193 * @param[in] ADCx pointer to ADC
igorsk 0:1063a091a062 194 * @param[in] IntType
igorsk 0:1063a091a062 195 * @param[in] NewState:
igorsk 0:1063a091a062 196 * - SET : enable ADC interrupt
igorsk 0:1063a091a062 197 * - RESET: disable ADC interrupt
igorsk 0:1063a091a062 198 *
igorsk 0:1063a091a062 199 * @return None
igorsk 0:1063a091a062 200 **********************************************************************/
igorsk 0:1063a091a062 201 void ADC_IntConfig (LPC_ADC_TypeDef *ADCx, ADC_TYPE_INT_OPT IntType, FunctionalState NewState)
igorsk 0:1063a091a062 202 {
igorsk 0:1063a091a062 203 CHECK_PARAM(PARAM_ADCx(ADCx));
igorsk 0:1063a091a062 204 CHECK_PARAM(PARAM_ADC_TYPE_INT_OPT(IntType));
igorsk 0:1063a091a062 205
igorsk 0:1063a091a062 206 ADCx->ADINTEN &= ~ADC_INTEN_CH(IntType);
igorsk 0:1063a091a062 207 if (NewState){
igorsk 0:1063a091a062 208 ADCx->ADINTEN |= ADC_INTEN_CH(IntType);
igorsk 0:1063a091a062 209 }
igorsk 0:1063a091a062 210 }
igorsk 0:1063a091a062 211
igorsk 0:1063a091a062 212 /*********************************************************************//**
igorsk 0:1063a091a062 213 * @brief Enable/Disable ADC channel number
igorsk 0:1063a091a062 214 * @param[in] ADCx pointer to ADC
igorsk 0:1063a091a062 215 * @param[in] Channel channel number
igorsk 0:1063a091a062 216 * @param[in] NewState Enable or Disable
igorsk 0:1063a091a062 217 *
igorsk 0:1063a091a062 218 * @return None
igorsk 0:1063a091a062 219 **********************************************************************/
igorsk 0:1063a091a062 220 void ADC_ChannelCmd (LPC_ADC_TypeDef *ADCx, uint8_t Channel, FunctionalState NewState)
igorsk 0:1063a091a062 221 {
igorsk 0:1063a091a062 222 CHECK_PARAM(PARAM_ADCx(ADCx));
igorsk 0:1063a091a062 223 CHECK_PARAM(PARAM_ADC_CHANNEL_SELECTION(Channel));
igorsk 0:1063a091a062 224
igorsk 0:1063a091a062 225 if (NewState == ENABLE) {
igorsk 0:1063a091a062 226 ADCx->ADCR |= ADC_CR_CH_SEL(Channel);
igorsk 0:1063a091a062 227 } else {
igorsk 0:1063a091a062 228 ADCx->ADCR &= ~ADC_CR_CH_SEL(Channel);
igorsk 0:1063a091a062 229 }
igorsk 0:1063a091a062 230 }
igorsk 0:1063a091a062 231
igorsk 0:1063a091a062 232 /*********************************************************************//**
igorsk 0:1063a091a062 233 * @brief Get ADC result
igorsk 0:1063a091a062 234 * @param[in] ADCx pointer to ADC
igorsk 0:1063a091a062 235 * @param[in] channel channel number
igorsk 0:1063a091a062 236 * @return Data conversion
igorsk 0:1063a091a062 237 **********************************************************************/
igorsk 0:1063a091a062 238 uint16_t ADC_ChannelGetData(LPC_ADC_TypeDef *ADCx, uint8_t channel)
igorsk 0:1063a091a062 239 {
igorsk 0:1063a091a062 240 uint32_t adc_value;
igorsk 0:1063a091a062 241
igorsk 0:1063a091a062 242 CHECK_PARAM(PARAM_ADCx(ADCx));
igorsk 0:1063a091a062 243 CHECK_PARAM(PARAM_ADC_CHANNEL_SELECTION(channel));
igorsk 0:1063a091a062 244
igorsk 0:1063a091a062 245 adc_value = *(uint32_t *) ((&ADCx->ADDR0) + channel);
igorsk 0:1063a091a062 246 return ADC_DR_RESULT(adc_value);
igorsk 0:1063a091a062 247 }
igorsk 0:1063a091a062 248
igorsk 0:1063a091a062 249 /*********************************************************************//**
igorsk 0:1063a091a062 250 * @brief Get ADC Chanel status from ADC data register
igorsk 0:1063a091a062 251 * @param[in] ADCx pointer to ADC
igorsk 0:1063a091a062 252 * @param[in] channel channel number
igorsk 0:1063a091a062 253 * @param[in] StatusType
igorsk 0:1063a091a062 254 * 0:Burst status
igorsk 0:1063a091a062 255 * 1:Done status
igorsk 0:1063a091a062 256 * @return SET / RESET
igorsk 0:1063a091a062 257 **********************************************************************/
igorsk 0:1063a091a062 258 FlagStatus ADC_ChannelGetStatus(LPC_ADC_TypeDef *ADCx, uint8_t channel, uint32_t StatusType)
igorsk 0:1063a091a062 259 {
igorsk 0:1063a091a062 260 uint32_t temp;
igorsk 0:1063a091a062 261
igorsk 0:1063a091a062 262 CHECK_PARAM(PARAM_ADCx(ADCx));
igorsk 0:1063a091a062 263 CHECK_PARAM(PARAM_ADC_CHANNEL_SELECTION(channel));
igorsk 0:1063a091a062 264 CHECK_PARAM(PARAM_ADC_DATA_STATUS(StatusType));
igorsk 0:1063a091a062 265
igorsk 0:1063a091a062 266 temp = *(uint32_t *) ((&ADCx->ADDR0) + channel);
igorsk 0:1063a091a062 267 if (StatusType) {
igorsk 0:1063a091a062 268 temp &= ADC_DR_DONE_FLAG;
igorsk 0:1063a091a062 269 }else{
igorsk 0:1063a091a062 270 temp &= ADC_DR_OVERRUN_FLAG;
igorsk 0:1063a091a062 271 }
igorsk 0:1063a091a062 272 if (temp) {
igorsk 0:1063a091a062 273 return SET;
igorsk 0:1063a091a062 274 } else {
igorsk 0:1063a091a062 275 return RESET;
igorsk 0:1063a091a062 276 }
igorsk 0:1063a091a062 277
igorsk 0:1063a091a062 278 }
igorsk 0:1063a091a062 279
igorsk 0:1063a091a062 280 /*********************************************************************//**
igorsk 0:1063a091a062 281 * @brief Get ADC Data from AD Global register
igorsk 0:1063a091a062 282 * @param[in] ADCx pointer to ADC
igorsk 0:1063a091a062 283 * @param[in] channel channel number
igorsk 0:1063a091a062 284 * @return Result of conversion
igorsk 0:1063a091a062 285 **********************************************************************/
igorsk 0:1063a091a062 286 uint16_t ADC_GlobalGetData(LPC_ADC_TypeDef *ADCx, uint8_t channel)
igorsk 0:1063a091a062 287 {
igorsk 0:1063a091a062 288 CHECK_PARAM(PARAM_ADCx(ADCx));
igorsk 0:1063a091a062 289 CHECK_PARAM(PARAM_ADC_CHANNEL_SELECTION(channel));
igorsk 0:1063a091a062 290
igorsk 0:1063a091a062 291 //ADCx->ADGDR &= ~ADC_GDR_CH_MASK;
igorsk 0:1063a091a062 292 //ADCx->ADGDR |= ADC_GDR_CH(channel);
igorsk 0:1063a091a062 293 return (uint16_t)(ADC_GDR_RESULT(ADCx->ADGDR));
igorsk 0:1063a091a062 294 }
igorsk 0:1063a091a062 295
igorsk 0:1063a091a062 296 /*********************************************************************//**
igorsk 0:1063a091a062 297 * @brief Get ADC Chanel status from AD global data register
igorsk 0:1063a091a062 298 * @param[in] ADCx pointer to ADC
igorsk 0:1063a091a062 299 * @param[in] StatusType
igorsk 0:1063a091a062 300 * 0:Burst status
igorsk 0:1063a091a062 301 * 1:Done status
igorsk 0:1063a091a062 302 * @return SET / RESET
igorsk 0:1063a091a062 303 **********************************************************************/
igorsk 0:1063a091a062 304 FlagStatus ADC_GlobalGetStatus(LPC_ADC_TypeDef *ADCx, uint32_t StatusType)
igorsk 0:1063a091a062 305 {
igorsk 0:1063a091a062 306 uint32_t temp;
igorsk 0:1063a091a062 307
igorsk 0:1063a091a062 308 CHECK_PARAM(PARAM_ADCx(ADCx));
igorsk 0:1063a091a062 309 CHECK_PARAM(PARAM_ADC_DATA_STATUS(StatusType));
igorsk 0:1063a091a062 310
igorsk 0:1063a091a062 311 temp = ADCx->ADGDR;
igorsk 0:1063a091a062 312 if (StatusType){
igorsk 0:1063a091a062 313 temp &= ADC_DR_DONE_FLAG;
igorsk 0:1063a091a062 314 }else{
igorsk 0:1063a091a062 315 temp &= ADC_DR_OVERRUN_FLAG;
igorsk 0:1063a091a062 316 }
igorsk 0:1063a091a062 317 if (temp){
igorsk 0:1063a091a062 318 return SET;
igorsk 0:1063a091a062 319 }else{
igorsk 0:1063a091a062 320 return RESET;
igorsk 0:1063a091a062 321 }
igorsk 0:1063a091a062 322 }
igorsk 0:1063a091a062 323
igorsk 0:1063a091a062 324 /**
igorsk 0:1063a091a062 325 * @}
igorsk 0:1063a091a062 326 */
igorsk 0:1063a091a062 327
igorsk 0:1063a091a062 328 #endif /* _ADC */
igorsk 0:1063a091a062 329
igorsk 0:1063a091a062 330 /**
igorsk 0:1063a091a062 331 * @}
igorsk 0:1063a091a062 332 */
igorsk 0:1063a091a062 333
igorsk 0:1063a091a062 334 /* --------------------------------- End Of File ------------------------------ */
igorsk 0:1063a091a062 335