mbed library sources

Dependents:   frdm_kl05z_gpio_test

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Thu Feb 20 23:00:08 2014 +0000
Revision:
103:9b881da47c92
Child:
214:b6ec89a903fb
Synchronized with git revision 1f2da5f6047218c8c45334c11bdaaaeab3c18841

Full URL: https://github.com/mbedmicro/mbed/commit/1f2da5f6047218c8c45334c11bdaaaeab3c18841/

NXP master merge

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 103:9b881da47c92 1 /* mbed Microcontroller Library
mbed_official 103:9b881da47c92 2 * Copyright (c) 2006-2013 ARM Limited
mbed_official 103:9b881da47c92 3 *
mbed_official 103:9b881da47c92 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 103:9b881da47c92 5 * you may not use this file except in compliance with the License.
mbed_official 103:9b881da47c92 6 * You may obtain a copy of the License at
mbed_official 103:9b881da47c92 7 *
mbed_official 103:9b881da47c92 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 103:9b881da47c92 9 *
mbed_official 103:9b881da47c92 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 103:9b881da47c92 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 103:9b881da47c92 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 103:9b881da47c92 13 * See the License for the specific language governing permissions and
mbed_official 103:9b881da47c92 14 * limitations under the License.
mbed_official 103:9b881da47c92 15 */
mbed_official 103:9b881da47c92 16
mbed_official 103:9b881da47c92 17 #include "analogin_api.h"
mbed_official 103:9b881da47c92 18 #include "cmsis.h"
mbed_official 103:9b881da47c92 19 #include "pinmap.h"
mbed_official 103:9b881da47c92 20 #include "error.h"
mbed_official 103:9b881da47c92 21
mbed_official 103:9b881da47c92 22 #define ANALOGIN_MEDIAN_FILTER 1
mbed_official 103:9b881da47c92 23
mbed_official 103:9b881da47c92 24 #define ADC_10BIT_RANGE 0x3FF
mbed_official 103:9b881da47c92 25 #define ADC_12BIT_RANGE 0xFFF
mbed_official 103:9b881da47c92 26
mbed_official 103:9b881da47c92 27 #define ADC_RANGE ADC_12BIT_RANGE
mbed_official 103:9b881da47c92 28
mbed_official 103:9b881da47c92 29 static const PinMap PinMap_ADC[] = {
mbed_official 103:9b881da47c92 30 {P0_8 , ADC0_0, 0},
mbed_official 103:9b881da47c92 31 {P0_7 , ADC0_1, 0},
mbed_official 103:9b881da47c92 32 {P0_6 , ADC0_2, 0},
mbed_official 103:9b881da47c92 33 {P0_5 , ADC0_3, 0},
mbed_official 103:9b881da47c92 34 {P0_4 , ADC0_4, 0},
mbed_official 103:9b881da47c92 35 {P0_3 , ADC0_5, 0},
mbed_official 103:9b881da47c92 36 {P0_2 , ADC0_6, 0},
mbed_official 103:9b881da47c92 37 {P0_1 , ADC0_7, 0},
mbed_official 103:9b881da47c92 38 {P1_0 , ADC0_8, 0},
mbed_official 103:9b881da47c92 39 {P0_31, ADC0_9, 0},
mbed_official 103:9b881da47c92 40 {P0_0 , ADC0_10,0},
mbed_official 103:9b881da47c92 41 {P0_30, ADC0_11,0},
mbed_official 103:9b881da47c92 42 {P1_1 , ADC1_0, 0},
mbed_official 103:9b881da47c92 43 {P0_9 , ADC1_1, 0},
mbed_official 103:9b881da47c92 44 {P0_10, ADC1_2, 0},
mbed_official 103:9b881da47c92 45 {P0_11, ADC1_3, 0},
mbed_official 103:9b881da47c92 46 {P1_2 , ADC1_4, 0},
mbed_official 103:9b881da47c92 47 {P1_3 , ADC1_5, 0},
mbed_official 103:9b881da47c92 48 {P0_13, ADC1_6, 0},
mbed_official 103:9b881da47c92 49 {P0_14, ADC1_7, 0},
mbed_official 103:9b881da47c92 50 {P0_15, ADC1_8, 0},
mbed_official 103:9b881da47c92 51 {P0_16, ADC1_9, 0},
mbed_official 103:9b881da47c92 52 {P1_4 , ADC1_10,0},
mbed_official 103:9b881da47c92 53 {P1_5 , ADC1_11,0},
mbed_official 103:9b881da47c92 54 };
mbed_official 103:9b881da47c92 55
mbed_official 103:9b881da47c92 56 void analogin_init(analogin_t *obj, PinName pin) {
mbed_official 103:9b881da47c92 57 obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
mbed_official 103:9b881da47c92 58 if (obj->adc == (uint32_t)NC) {
mbed_official 103:9b881da47c92 59 error("ADC pin mapping failed");
mbed_official 103:9b881da47c92 60 }
mbed_official 103:9b881da47c92 61 uint32_t port = (pin >> 5);
mbed_official 103:9b881da47c92 62 // enable clock for GPIOx
mbed_official 103:9b881da47c92 63 LPC_SYSCON->SYSAHBCLKCTRL0 |= (1UL << (14 + port));
mbed_official 103:9b881da47c92 64 // pin enable
mbed_official 103:9b881da47c92 65 LPC_SWM->PINENABLE0 &= ~(1UL << obj->adc);
mbed_official 103:9b881da47c92 66 // configure GPIO as input
mbed_official 103:9b881da47c92 67 LPC_GPIO_PORT->DIR[port] &= ~(1UL << (pin & 0x1F));
mbed_official 103:9b881da47c92 68
mbed_official 103:9b881da47c92 69 // power up ADC
mbed_official 103:9b881da47c92 70 if (obj->adc < ADC1_0)
mbed_official 103:9b881da47c92 71 {
mbed_official 103:9b881da47c92 72 // ADC0
mbed_official 103:9b881da47c92 73 LPC_SYSCON->PDRUNCFG &= ~(1 << 10);
mbed_official 103:9b881da47c92 74 LPC_SYSCON->SYSAHBCLKCTRL0 |= (1 << 27);
mbed_official 103:9b881da47c92 75 }
mbed_official 103:9b881da47c92 76 else {
mbed_official 103:9b881da47c92 77 // ADC1
mbed_official 103:9b881da47c92 78 LPC_SYSCON->PDRUNCFG &= ~(1 << 11);
mbed_official 103:9b881da47c92 79 LPC_SYSCON->SYSAHBCLKCTRL0 |= (1 << 28);
mbed_official 103:9b881da47c92 80 }
mbed_official 103:9b881da47c92 81
mbed_official 103:9b881da47c92 82 // select IRC as async. clock, divided by 1
mbed_official 103:9b881da47c92 83 LPC_SYSCON->ADCASYNCCLKSEL = 0;
mbed_official 103:9b881da47c92 84 LPC_SYSCON->ADCASYNCCLKDIV = 1;
mbed_official 103:9b881da47c92 85
mbed_official 103:9b881da47c92 86 __IO LPC_ADC0_Type *adc_reg = (obj->adc < ADC1_0) ? (__IO LPC_ADC0_Type*)(LPC_ADC0) : (__IO LPC_ADC0_Type*)(LPC_ADC1);
mbed_official 103:9b881da47c92 87
mbed_official 103:9b881da47c92 88 // start calibration
mbed_official 103:9b881da47c92 89 adc_reg->CTRL |= (1UL << 30);
mbed_official 103:9b881da47c92 90 __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
mbed_official 103:9b881da47c92 91
mbed_official 103:9b881da47c92 92 // asynchronous mode
mbed_official 103:9b881da47c92 93 adc_reg->CTRL = (1UL << 8);
mbed_official 103:9b881da47c92 94
mbed_official 103:9b881da47c92 95 }
mbed_official 103:9b881da47c92 96
mbed_official 103:9b881da47c92 97 static inline uint32_t adc_read(analogin_t *obj) {
mbed_official 103:9b881da47c92 98
mbed_official 103:9b881da47c92 99 __IO LPC_ADC0_Type *adc_reg = (obj->adc < ADC1_0) ? (__IO LPC_ADC0_Type*)(LPC_ADC0) : (__IO LPC_ADC0_Type*)(LPC_ADC1);
mbed_official 103:9b881da47c92 100
mbed_official 103:9b881da47c92 101 // select channel
mbed_official 103:9b881da47c92 102 adc_reg->SEQA_CTRL &= ~(0xFFF);
mbed_official 103:9b881da47c92 103 adc_reg->SEQA_CTRL |= (1UL << (obj->adc & 0x1F));
mbed_official 103:9b881da47c92 104
mbed_official 103:9b881da47c92 105 // start conversion and sequence enable
mbed_official 103:9b881da47c92 106 adc_reg->SEQA_CTRL |= ((1UL << 26) | (1UL << 31));
mbed_official 103:9b881da47c92 107
mbed_official 103:9b881da47c92 108 // Repeatedly get the sample data until DONE bit
mbed_official 103:9b881da47c92 109 volatile uint32_t data;
mbed_official 103:9b881da47c92 110 do {
mbed_official 103:9b881da47c92 111 data = adc_reg->SEQA_GDAT;
mbed_official 103:9b881da47c92 112 } while ((data & (1UL << 31)) == 0);
mbed_official 103:9b881da47c92 113
mbed_official 103:9b881da47c92 114 // Stop conversion
mbed_official 103:9b881da47c92 115 adc_reg->SEQA_CTRL &= ~(1UL << 31);
mbed_official 103:9b881da47c92 116
mbed_official 103:9b881da47c92 117 return ((data >> 4) & ADC_RANGE);
mbed_official 103:9b881da47c92 118 }
mbed_official 103:9b881da47c92 119
mbed_official 103:9b881da47c92 120 static inline void order(uint32_t *a, uint32_t *b) {
mbed_official 103:9b881da47c92 121 if (*a > *b) {
mbed_official 103:9b881da47c92 122 uint32_t t = *a;
mbed_official 103:9b881da47c92 123 *a = *b;
mbed_official 103:9b881da47c92 124 *b = t;
mbed_official 103:9b881da47c92 125 }
mbed_official 103:9b881da47c92 126 }
mbed_official 103:9b881da47c92 127
mbed_official 103:9b881da47c92 128 static inline uint32_t adc_read_u32(analogin_t *obj) {
mbed_official 103:9b881da47c92 129 uint32_t value;
mbed_official 103:9b881da47c92 130 #if ANALOGIN_MEDIAN_FILTER
mbed_official 103:9b881da47c92 131 uint32_t v1 = adc_read(obj);
mbed_official 103:9b881da47c92 132 uint32_t v2 = adc_read(obj);
mbed_official 103:9b881da47c92 133 uint32_t v3 = adc_read(obj);
mbed_official 103:9b881da47c92 134 order(&v1, &v2);
mbed_official 103:9b881da47c92 135 order(&v2, &v3);
mbed_official 103:9b881da47c92 136 order(&v1, &v2);
mbed_official 103:9b881da47c92 137 value = v2;
mbed_official 103:9b881da47c92 138 #else
mbed_official 103:9b881da47c92 139 value = adc_read(obj);
mbed_official 103:9b881da47c92 140 #endif
mbed_official 103:9b881da47c92 141 return value;
mbed_official 103:9b881da47c92 142 }
mbed_official 103:9b881da47c92 143
mbed_official 103:9b881da47c92 144 uint16_t analogin_read_u16(analogin_t *obj) {
mbed_official 103:9b881da47c92 145 uint32_t value = adc_read_u32(obj);
mbed_official 103:9b881da47c92 146 return (value << 4) | ((value >> 8) & 0x000F); // 12 bit
mbed_official 103:9b881da47c92 147 }
mbed_official 103:9b881da47c92 148
mbed_official 103:9b881da47c92 149 float analogin_read(analogin_t *obj) {
mbed_official 103:9b881da47c92 150 uint32_t value = adc_read_u32(obj);
mbed_official 103:9b881da47c92 151 return (float)value * (1.0f / (float)ADC_RANGE);
mbed_official 103:9b881da47c92 152 }