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
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 189:f392fc9709a3 1 /* mbed Microcontroller Library
AnnaBridge 189:f392fc9709a3 2 * (C)Copyright TOSHIBA ELECTRONIC DEVICES & STORAGE CORPORATION 2018 All rights reserved
AnnaBridge 189:f392fc9709a3 3 * SPDX-License-Identifier: Apache-2.0
AnnaBridge 189:f392fc9709a3 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 189:f392fc9709a3 5 * you may not use this file except in compliance with the License.
AnnaBridge 189:f392fc9709a3 6 * You may obtain a copy of the License at
AnnaBridge 189:f392fc9709a3 7 *
AnnaBridge 189:f392fc9709a3 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 189:f392fc9709a3 9 *
AnnaBridge 189:f392fc9709a3 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 189:f392fc9709a3 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 189:f392fc9709a3 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 189:f392fc9709a3 13 * See the License for the specific language governing permissions and
AnnaBridge 189:f392fc9709a3 14 * limitations under the License.
AnnaBridge 189:f392fc9709a3 15 */
AnnaBridge 189:f392fc9709a3 16 #include "analogin_api.h"
AnnaBridge 189:f392fc9709a3 17 #include "PeripheralNames.h"
AnnaBridge 189:f392fc9709a3 18 #include "pinmap.h"
AnnaBridge 189:f392fc9709a3 19 #include "mbed_wait_api.h"
AnnaBridge 189:f392fc9709a3 20 #include "gpio_include.h"
AnnaBridge 189:f392fc9709a3 21
AnnaBridge 189:f392fc9709a3 22 static const PinMap PinMap_ADC[] = {
AnnaBridge 189:f392fc9709a3 23 {PD0, ADC_AINA00, PIN_DATA(0, 0)},
AnnaBridge 189:f392fc9709a3 24 {PD1, ADC_AINA01, PIN_DATA(0, 0)},
AnnaBridge 189:f392fc9709a3 25 {PD2, ADC_AINA02, PIN_DATA(0, 0)},
AnnaBridge 189:f392fc9709a3 26 {PD3, ADC_AINA03, PIN_DATA(0, 0)},
AnnaBridge 189:f392fc9709a3 27 {PE0, ADC_AINA04, PIN_DATA(0, 0)},
AnnaBridge 189:f392fc9709a3 28 {PE1, ADC_AINA05, PIN_DATA(0, 0)},
AnnaBridge 189:f392fc9709a3 29 {PE2, ADC_AINA06, PIN_DATA(0, 0)},
AnnaBridge 189:f392fc9709a3 30 {PE3, ADC_AINA07, PIN_DATA(0, 0)},
AnnaBridge 189:f392fc9709a3 31 {PE4, ADC_AINA08, PIN_DATA(0, 0)},
AnnaBridge 189:f392fc9709a3 32 {PE5, ADC_AINA09, PIN_DATA(0, 0)},
AnnaBridge 189:f392fc9709a3 33 {PE6, ADC_AINA10, PIN_DATA(0, 0)},
AnnaBridge 189:f392fc9709a3 34 {PF0, ADC_AINA11, PIN_DATA(0, 0)},
AnnaBridge 189:f392fc9709a3 35 {PF1, ADC_AINA12, PIN_DATA(0, 0)},
AnnaBridge 189:f392fc9709a3 36 {PF2, ADC_AINA13, PIN_DATA(0, 0)},
AnnaBridge 189:f392fc9709a3 37 {PF3, ADC_AINA14, PIN_DATA(0, 0)},
AnnaBridge 189:f392fc9709a3 38 {PF4, ADC_AINA15, PIN_DATA(0, 0)},
AnnaBridge 189:f392fc9709a3 39 {PF5, ADC_AINA16, PIN_DATA(0, 0)},
AnnaBridge 189:f392fc9709a3 40 {PF6, ADC_AINA17, PIN_DATA(0, 0)},
AnnaBridge 189:f392fc9709a3 41 {PF7, ADC_AINA18, PIN_DATA(0, 0)},
AnnaBridge 189:f392fc9709a3 42 {PD4, ADC_AINA19, PIN_DATA(0, 0)},
AnnaBridge 189:f392fc9709a3 43 {PD5, ADC_AINA20, PIN_DATA(0, 0)},
AnnaBridge 189:f392fc9709a3 44 {NC, NC, 0}
AnnaBridge 189:f392fc9709a3 45 };
AnnaBridge 189:f392fc9709a3 46
AnnaBridge 189:f392fc9709a3 47 /**
AnnaBridge 189:f392fc9709a3 48 * [analogin_init]
AnnaBridge 189:f392fc9709a3 49 * @param obj
AnnaBridge 189:f392fc9709a3 50 * @param pin
AnnaBridge 189:f392fc9709a3 51 * @description Initialize analog input
AnnaBridge 189:f392fc9709a3 52 */
AnnaBridge 189:f392fc9709a3 53 void analogin_init(analogin_t *obj, PinName pin)
AnnaBridge 189:f392fc9709a3 54 {
AnnaBridge 189:f392fc9709a3 55 // Check that pin belong to ADC module
AnnaBridge 189:f392fc9709a3 56 obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
AnnaBridge 189:f392fc9709a3 57 // Assert that ADC channel is valid
AnnaBridge 189:f392fc9709a3 58 MBED_ASSERT(obj->adc != (ADCName)NC);
AnnaBridge 189:f392fc9709a3 59 obj->obj = TSB_ADA;
AnnaBridge 189:f392fc9709a3 60 // ADC CG Fsys Enable
AnnaBridge 189:f392fc9709a3 61 TSB_CG_FSYSENB_IPENB15 = ENABLE;
AnnaBridge 189:f392fc9709a3 62 // ADC Clock Enable
AnnaBridge 189:f392fc9709a3 63 TSB_CG_SPCLKEN_ADCKEN = ENABLE;
AnnaBridge 189:f392fc9709a3 64 // Set pin function as ADC
AnnaBridge 189:f392fc9709a3 65 pinmap_pinout(pin, PinMap_ADC);
AnnaBridge 189:f392fc9709a3 66 // Set sample hold time and pre-scale clock
AnnaBridge 189:f392fc9709a3 67 obj->obj->CLK = (ADC_SCLK_1 | ADC_SAMPLING_PERIOD_3V);
AnnaBridge 189:f392fc9709a3 68 obj->obj->MOD0 = (ADxMOD0_RCUT_NORMAL | ADxMOD0_DACON_ON);
AnnaBridge 189:f392fc9709a3 69 obj->obj->MOD1 = ADC_MOD1_AVDD5_3V;
AnnaBridge 189:f392fc9709a3 70 obj->obj->MOD2 = ADC_MOD2_TMPM3Hx;
AnnaBridge 189:f392fc9709a3 71 }
AnnaBridge 189:f392fc9709a3 72
AnnaBridge 189:f392fc9709a3 73 /**
AnnaBridge 189:f392fc9709a3 74 * [analogin_read_u16]
AnnaBridge 189:f392fc9709a3 75 * @param obj
AnnaBridge 189:f392fc9709a3 76 * @return An unsigned short in the range [0x00, 0x0FFF]
AnnaBridge 189:f392fc9709a3 77 * @description Read the ADC input
AnnaBridge 189:f392fc9709a3 78 */
AnnaBridge 189:f392fc9709a3 79 uint16_t analogin_read_u16(analogin_t *obj)
AnnaBridge 189:f392fc9709a3 80 {
AnnaBridge 189:f392fc9709a3 81 uint16_t ADCResultValue = 0;
AnnaBridge 189:f392fc9709a3 82 uint32_t ADCResultStored = 0;
AnnaBridge 189:f392fc9709a3 83
AnnaBridge 189:f392fc9709a3 84 // Wait at least 3us to ensure the voltage is stable
AnnaBridge 189:f392fc9709a3 85 wait_us(300);
AnnaBridge 189:f392fc9709a3 86 // ADC configuration for data Conversion
AnnaBridge 189:f392fc9709a3 87 obj->obj->CR0 = (ADxCR0_ADEN_DISABLE | ADxCR0_CNT_DISABLE);
AnnaBridge 189:f392fc9709a3 88 obj->obj->TSET0 = (ADxTSETn_ENINT_DISABLE | ADxTSETn_TRGS_SGL | obj->adc);
AnnaBridge 189:f392fc9709a3 89 obj->obj->CR1 = (ADxCR1_CNTDMEN_DISABLE | ADxCR1_SGLDMEN_DISABLE
AnnaBridge 189:f392fc9709a3 90 | ADxCR1_TRGDMEN_DISABLE | ADxCR1_TRGEN_DISABLE);
AnnaBridge 189:f392fc9709a3 91 obj->obj->CR0 = (ADxCR0_ADEN_ENABLE | ADxCR0_SGL_ENABLE | ADxCR0_CNT_DISABLE);
AnnaBridge 189:f392fc9709a3 92 // Wait until AD conversion complete
AnnaBridge 189:f392fc9709a3 93 while( (obj->obj->ST & ADxST_SNGF_RUN) != ADxST_SNGF_IDLE);
AnnaBridge 189:f392fc9709a3 94 // Wait for register to update with convert value
AnnaBridge 189:f392fc9709a3 95 wait_us(30);
AnnaBridge 189:f392fc9709a3 96 // Convert result
AnnaBridge 189:f392fc9709a3 97 ADCResultStored = (obj->obj->REG0 | obj->adc);
AnnaBridge 189:f392fc9709a3 98 if ((ADCResultStored & ADxREGn_ADRFn_MASK) == ADxREGn_ADRFn_ON) {
AnnaBridge 189:f392fc9709a3 99 ADCResultValue = (uint16_t)((ADCResultStored & ADxREGn_ADRn_MASK) >> 4);
AnnaBridge 189:f392fc9709a3 100 }
AnnaBridge 189:f392fc9709a3 101 return ADCResultValue;
AnnaBridge 189:f392fc9709a3 102 }
AnnaBridge 189:f392fc9709a3 103
AnnaBridge 189:f392fc9709a3 104 /**
AnnaBridge 189:f392fc9709a3 105 * [analogin_read]
AnnaBridge 189:f392fc9709a3 106 * @param obj
AnnaBridge 189:f392fc9709a3 107 * @return A float in the range [0.0, 1.0]
AnnaBridge 189:f392fc9709a3 108 * @description Read the ADC input
AnnaBridge 189:f392fc9709a3 109 */
AnnaBridge 189:f392fc9709a3 110 float analogin_read(analogin_t *obj)
AnnaBridge 189:f392fc9709a3 111 {
AnnaBridge 189:f392fc9709a3 112 uint16_t value = analogin_read_u16(obj);
AnnaBridge 189:f392fc9709a3 113 return ((float)(value * (1.0f / (float)ADC_12BIT_RANGE)));
AnnaBridge 189:f392fc9709a3 114 }