mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
181:57724642e740
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 181:57724642e740 1 /* mbed Microcontroller Library
AnnaBridge 181:57724642e740 2 * Copyright (c) 2006-2013 ARM Limited
AnnaBridge 181:57724642e740 3 *
AnnaBridge 181:57724642e740 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 181:57724642e740 5 * you may not use this file except in compliance with the License.
AnnaBridge 181:57724642e740 6 * You may obtain a copy of the License at
AnnaBridge 181:57724642e740 7 *
AnnaBridge 181:57724642e740 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 181:57724642e740 9 *
AnnaBridge 181:57724642e740 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 181:57724642e740 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 181:57724642e740 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 181:57724642e740 13 * See the License for the specific language governing permissions and
AnnaBridge 181:57724642e740 14 * limitations under the License.
AnnaBridge 181:57724642e740 15 */
AnnaBridge 181:57724642e740 16 #include "mbed_assert.h"
AnnaBridge 181:57724642e740 17 #include "analogin_api.h"
AnnaBridge 181:57724642e740 18
AnnaBridge 181:57724642e740 19 #include "cmsis.h"
AnnaBridge 181:57724642e740 20 #include "PeripheralPins.h"
AnnaBridge 181:57724642e740 21
AnnaBridge 181:57724642e740 22 #include "iodefine.h"
AnnaBridge 181:57724642e740 23
AnnaBridge 181:57724642e740 24 #define ANALOGIN_MEDIAN_FILTER 0
AnnaBridge 181:57724642e740 25
AnnaBridge 181:57724642e740 26 static volatile uint16_t *ADCDR[] = {
AnnaBridge 181:57724642e740 27 &ADCADDRA,
AnnaBridge 181:57724642e740 28 &ADCADDRB,
AnnaBridge 181:57724642e740 29 &ADCADDRC,
AnnaBridge 181:57724642e740 30 &ADCADDRD,
AnnaBridge 181:57724642e740 31 &ADCADDRE,
AnnaBridge 181:57724642e740 32 &ADCADDRF,
AnnaBridge 181:57724642e740 33 &ADCADDRG,
AnnaBridge 181:57724642e740 34 &ADCADDRH,
AnnaBridge 181:57724642e740 35 };
AnnaBridge 181:57724642e740 36
AnnaBridge 181:57724642e740 37 void analogin_init(analogin_t *obj, PinName pin) {
AnnaBridge 181:57724642e740 38 obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
AnnaBridge 181:57724642e740 39 MBED_ASSERT(obj->adc != (ADCName)NC);
AnnaBridge 181:57724642e740 40
AnnaBridge 181:57724642e740 41 CPGSTBCR3 &= ~(1 << 1);
AnnaBridge 181:57724642e740 42 CPGSTBCR6 &= ~(1 << 7);
AnnaBridge 181:57724642e740 43
AnnaBridge 181:57724642e740 44 // 15: ADF 14: ADIE 13: ADST, [12:9] TRGS..0
AnnaBridge 181:57724642e740 45 // [8:6] CKS 010 :: 340tclk
AnnaBridge 181:57724642e740 46 // [5:3] MDS 000 :: single mode
AnnaBridge 181:57724642e740 47 // [2:0] CH 000 :: AN0
AnnaBridge 181:57724642e740 48 ADCADCSR = 0x0080;
AnnaBridge 181:57724642e740 49
AnnaBridge 181:57724642e740 50 pinmap_pinout(pin, PinMap_ADC);
AnnaBridge 181:57724642e740 51 }
AnnaBridge 181:57724642e740 52
AnnaBridge 181:57724642e740 53 static inline uint32_t adc_read(analogin_t *obj) {
AnnaBridge 181:57724642e740 54 volatile uint16_t data;
AnnaBridge 181:57724642e740 55
AnnaBridge 181:57724642e740 56 // Select the appropriate channel and start conversion
AnnaBridge 181:57724642e740 57 ADCADCSR &= 0xfff8;
AnnaBridge 181:57724642e740 58 ADCADCSR |= (1 << 13 | (obj->adc & 0x7));
AnnaBridge 181:57724642e740 59
AnnaBridge 181:57724642e740 60 // Wait end of conversion
AnnaBridge 181:57724642e740 61 do {
AnnaBridge 181:57724642e740 62 data = ADCADCSR;
AnnaBridge 181:57724642e740 63 } while (((data & (1 << 15)) == 0) || ((data & (1 << 13)) != 0));
AnnaBridge 181:57724642e740 64
AnnaBridge 181:57724642e740 65 // clear flag
AnnaBridge 181:57724642e740 66 ADCADCSR &= ~(1 << 15);
AnnaBridge 181:57724642e740 67
AnnaBridge 181:57724642e740 68 return ((*(ADCDR[obj->adc])) >> 4) & 0x0FFF; // 12 bits range
AnnaBridge 181:57724642e740 69 }
AnnaBridge 181:57724642e740 70
AnnaBridge 181:57724642e740 71 #if ANALOGIN_MEDIAN_FILTER
AnnaBridge 181:57724642e740 72 static inline void order(uint32_t *a, uint32_t *b) {
AnnaBridge 181:57724642e740 73 if (*a > *b) {
AnnaBridge 181:57724642e740 74 uint32_t t = *a;
AnnaBridge 181:57724642e740 75 *a = *b;
AnnaBridge 181:57724642e740 76 *b = t;
AnnaBridge 181:57724642e740 77 }
AnnaBridge 181:57724642e740 78 }
AnnaBridge 181:57724642e740 79 #endif
AnnaBridge 181:57724642e740 80
AnnaBridge 181:57724642e740 81 static inline uint32_t adc_read_u32(analogin_t *obj) {
AnnaBridge 181:57724642e740 82 uint32_t value;
AnnaBridge 181:57724642e740 83 #if ANALOGIN_MEDIAN_FILTER
AnnaBridge 181:57724642e740 84 uint32_t v1 = adc_read(obj);
AnnaBridge 181:57724642e740 85 uint32_t v2 = adc_read(obj);
AnnaBridge 181:57724642e740 86 uint32_t v3 = adc_read(obj);
AnnaBridge 181:57724642e740 87 order(&v1, &v2);
AnnaBridge 181:57724642e740 88 order(&v2, &v3);
AnnaBridge 181:57724642e740 89 order(&v1, &v2);
AnnaBridge 181:57724642e740 90 value = v2;
AnnaBridge 181:57724642e740 91 #else
AnnaBridge 181:57724642e740 92 value = adc_read(obj);
AnnaBridge 181:57724642e740 93 #endif
AnnaBridge 181:57724642e740 94 return value;
AnnaBridge 181:57724642e740 95 }
AnnaBridge 181:57724642e740 96
AnnaBridge 181:57724642e740 97 uint16_t analogin_read_u16(analogin_t *obj) {
AnnaBridge 181:57724642e740 98 uint32_t value = adc_read_u32(obj);
AnnaBridge 181:57724642e740 99
AnnaBridge 181:57724642e740 100 return (value << 4) | ((value >> 8) & 0x000F); // 12-bit to 16-bit conversion
AnnaBridge 181:57724642e740 101 }
AnnaBridge 181:57724642e740 102
AnnaBridge 181:57724642e740 103 float analogin_read(analogin_t *obj) {
AnnaBridge 181:57724642e740 104 uint32_t value = adc_read_u32(obj);
AnnaBridge 181:57724642e740 105
AnnaBridge 181:57724642e740 106 return (float)value * (1.0f / (float)0x0FFF); // 12 bits range
AnnaBridge 181:57724642e740 107 }