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 * Copyright (c) 2018 GigaDevice Semiconductor Inc.
AnnaBridge 189:f392fc9709a3 3 *
AnnaBridge 189:f392fc9709a3 4 * SPDX-License-Identifier: Apache-2.0
AnnaBridge 189:f392fc9709a3 5 *
AnnaBridge 189:f392fc9709a3 6 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 189:f392fc9709a3 7 * you may not use this file except in compliance with the License.
AnnaBridge 189:f392fc9709a3 8 * You may obtain a copy of the License at
AnnaBridge 189:f392fc9709a3 9 *
AnnaBridge 189:f392fc9709a3 10 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 189:f392fc9709a3 11 *
AnnaBridge 189:f392fc9709a3 12 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 189:f392fc9709a3 13 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 189:f392fc9709a3 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 189:f392fc9709a3 15 * See the License for the specific language governing permissions and
AnnaBridge 189:f392fc9709a3 16 * limitations under the License.
AnnaBridge 189:f392fc9709a3 17 */
AnnaBridge 189:f392fc9709a3 18 #include "mbed_assert.h"
AnnaBridge 189:f392fc9709a3 19 #include "analogin_api.h"
AnnaBridge 189:f392fc9709a3 20
AnnaBridge 189:f392fc9709a3 21 #if DEVICE_ANALOGIN
AnnaBridge 189:f392fc9709a3 22
AnnaBridge 189:f392fc9709a3 23 #include "cmsis.h"
AnnaBridge 189:f392fc9709a3 24 #include "pinmap.h"
AnnaBridge 189:f392fc9709a3 25 #include "PeripheralPins.h"
AnnaBridge 189:f392fc9709a3 26 #include "mbed_error.h"
AnnaBridge 189:f392fc9709a3 27
AnnaBridge 189:f392fc9709a3 28 #define DEV_ADC_ACCURACY_12BIT 0xFFF
AnnaBridge 189:f392fc9709a3 29 #define DEV_ADC_PRECISION_12TO16(val) ((val << 4)| ((val >> 8) & (uint16_t)0x000F))
AnnaBridge 189:f392fc9709a3 30 #define AND_NUMBER (0xFF)
AnnaBridge 189:f392fc9709a3 31
AnnaBridge 189:f392fc9709a3 32 FlagStatus temperature_sample_flag = RESET;
AnnaBridge 189:f392fc9709a3 33
AnnaBridge 189:f392fc9709a3 34 /** software delay
AnnaBridge 189:f392fc9709a3 35 *
AnnaBridge 189:f392fc9709a3 36 * @param time The time need to delay
AnnaBridge 189:f392fc9709a3 37 */
AnnaBridge 189:f392fc9709a3 38 static void _delay(uint16_t time)
AnnaBridge 189:f392fc9709a3 39 {
AnnaBridge 189:f392fc9709a3 40 uint16_t i;
AnnaBridge 189:f392fc9709a3 41 for (i = 0; i < time; i++) {
AnnaBridge 189:f392fc9709a3 42 }
AnnaBridge 189:f392fc9709a3 43 }
AnnaBridge 189:f392fc9709a3 44
AnnaBridge 189:f392fc9709a3 45 /** Initialize the analogin peripheral
AnnaBridge 189:f392fc9709a3 46 *
AnnaBridge 189:f392fc9709a3 47 * Configures the pin used by analogin.
AnnaBridge 189:f392fc9709a3 48 * @param obj The analogin object to initialize
AnnaBridge 189:f392fc9709a3 49 * @param pin The analogin pin name
AnnaBridge 189:f392fc9709a3 50 */
AnnaBridge 189:f392fc9709a3 51 void analogin_init(analogin_t *obj, PinName pin)
AnnaBridge 189:f392fc9709a3 52 {
AnnaBridge 189:f392fc9709a3 53 uint32_t periph;
AnnaBridge 189:f392fc9709a3 54
AnnaBridge 189:f392fc9709a3 55 MBED_ASSERT(obj);
AnnaBridge 189:f392fc9709a3 56
AnnaBridge 189:f392fc9709a3 57 obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
AnnaBridge 189:f392fc9709a3 58 MBED_ASSERT(obj->adc != (ADCName)NC);
AnnaBridge 189:f392fc9709a3 59
AnnaBridge 189:f392fc9709a3 60 uint32_t function = pinmap_function(pin, PinMap_ADC);
AnnaBridge 189:f392fc9709a3 61 MBED_ASSERT(function != (uint32_t)NC);
AnnaBridge 189:f392fc9709a3 62
AnnaBridge 189:f392fc9709a3 63 obj->channel = GD_PIN_CHANNEL_GET(function);
AnnaBridge 189:f392fc9709a3 64 MBED_ASSERT(obj->channel <= ADC_CHANNEL_17);
AnnaBridge 189:f392fc9709a3 65
AnnaBridge 189:f392fc9709a3 66 periph = obj->adc;
AnnaBridge 189:f392fc9709a3 67 /* save the pin for future use */
AnnaBridge 189:f392fc9709a3 68 obj->pin = pin;
AnnaBridge 189:f392fc9709a3 69
AnnaBridge 189:f392fc9709a3 70 /* ADC clock enable and pin number reset */
AnnaBridge 189:f392fc9709a3 71 switch (periph) {
AnnaBridge 189:f392fc9709a3 72 case ADC0:
AnnaBridge 189:f392fc9709a3 73 rcu_periph_clock_enable(RCU_ADC0);
AnnaBridge 189:f392fc9709a3 74 break;
AnnaBridge 189:f392fc9709a3 75
AnnaBridge 189:f392fc9709a3 76 case ADC1:
AnnaBridge 189:f392fc9709a3 77 rcu_periph_clock_enable(RCU_ADC1);
AnnaBridge 189:f392fc9709a3 78 /* reset pin number */
AnnaBridge 189:f392fc9709a3 79 pin = (PinName)(pin & AND_NUMBER);
AnnaBridge 189:f392fc9709a3 80 break;
AnnaBridge 189:f392fc9709a3 81 }
AnnaBridge 189:f392fc9709a3 82
AnnaBridge 189:f392fc9709a3 83 /* ADC clock cannot be greater than 40M */
AnnaBridge 189:f392fc9709a3 84 rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV4);
AnnaBridge 189:f392fc9709a3 85
AnnaBridge 189:f392fc9709a3 86 if ((ADC_CHANNEL_16 == obj->channel)) {
AnnaBridge 189:f392fc9709a3 87 /* ADC Vrefint enable */
AnnaBridge 189:f392fc9709a3 88 adc_tempsensor_vrefint_enable();
AnnaBridge 189:f392fc9709a3 89 /* set temperature sample flag */
AnnaBridge 189:f392fc9709a3 90 temperature_sample_flag = SET;
AnnaBridge 189:f392fc9709a3 91 }
AnnaBridge 189:f392fc9709a3 92 if ((ADC_CHANNEL_17 == obj->channel)) {
AnnaBridge 189:f392fc9709a3 93 /* ADC Vrefint enable */
AnnaBridge 189:f392fc9709a3 94 adc_tempsensor_vrefint_enable();
AnnaBridge 189:f392fc9709a3 95 }
AnnaBridge 189:f392fc9709a3 96
AnnaBridge 189:f392fc9709a3 97 /* when pin >= ADC_TEMP, it indicates that the channel has no external pins */
AnnaBridge 189:f392fc9709a3 98 if (pin < ADC_TEMP) {
AnnaBridge 189:f392fc9709a3 99 pinmap_pinout(pin, PinMap_ADC);
AnnaBridge 189:f392fc9709a3 100 }
AnnaBridge 189:f392fc9709a3 101
AnnaBridge 189:f392fc9709a3 102 /* ADC configuration */
AnnaBridge 189:f392fc9709a3 103 adc_special_function_config(obj->adc, ADC_SCAN_MODE, DISABLE);
AnnaBridge 189:f392fc9709a3 104 adc_special_function_config(obj->adc, ADC_CONTINUOUS_MODE, DISABLE);
AnnaBridge 189:f392fc9709a3 105 /* ADC trigger config */
AnnaBridge 189:f392fc9709a3 106 adc_external_trigger_source_config(obj->adc, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_NONE);
AnnaBridge 189:f392fc9709a3 107 /* ADC mode config */
AnnaBridge 189:f392fc9709a3 108 adc_mode_config(ADC_MODE_FREE);
AnnaBridge 189:f392fc9709a3 109 /* ADC data alignment config */
AnnaBridge 189:f392fc9709a3 110 adc_data_alignment_config(obj->adc, ADC_DATAALIGN_RIGHT);
AnnaBridge 189:f392fc9709a3 111 /* ADC channel length config */
AnnaBridge 189:f392fc9709a3 112 adc_channel_length_config(obj->adc, ADC_REGULAR_CHANNEL, 1);
AnnaBridge 189:f392fc9709a3 113
AnnaBridge 189:f392fc9709a3 114 if (temperature_sample_flag == SET) {
AnnaBridge 189:f392fc9709a3 115 /* sample temperature needs more time */
AnnaBridge 189:f392fc9709a3 116 adc_regular_channel_config(obj->adc, 0, obj->channel, ADC_SAMPLETIME_239POINT5);
AnnaBridge 189:f392fc9709a3 117 /* clear temperature sample flag */
AnnaBridge 189:f392fc9709a3 118 temperature_sample_flag = RESET;
AnnaBridge 189:f392fc9709a3 119 } else {
AnnaBridge 189:f392fc9709a3 120 adc_regular_channel_config(obj->adc, 0, obj->channel, ADC_SAMPLETIME_28POINT5);
AnnaBridge 189:f392fc9709a3 121 }
AnnaBridge 189:f392fc9709a3 122 adc_external_trigger_config(obj->adc, ADC_REGULAR_CHANNEL, ENABLE);
AnnaBridge 189:f392fc9709a3 123
AnnaBridge 189:f392fc9709a3 124 /* ADC enable */
AnnaBridge 189:f392fc9709a3 125 adc_enable(obj->adc);
AnnaBridge 189:f392fc9709a3 126 /* wait for ADC to stabilize */
AnnaBridge 189:f392fc9709a3 127 _delay(500);
AnnaBridge 189:f392fc9709a3 128 adc_calibration_enable(obj->adc);
AnnaBridge 189:f392fc9709a3 129 }
AnnaBridge 189:f392fc9709a3 130
AnnaBridge 189:f392fc9709a3 131 /** Read the value from analogin pin, represented as an unsigned 16bit value
AnnaBridge 189:f392fc9709a3 132 *
AnnaBridge 189:f392fc9709a3 133 * @param obj The analogin object
AnnaBridge 189:f392fc9709a3 134 * @return An unsigned 16bit value representing the current input voltage
AnnaBridge 189:f392fc9709a3 135 */
AnnaBridge 189:f392fc9709a3 136 uint16_t analogin_read_u16(analogin_t *obj)
AnnaBridge 189:f392fc9709a3 137 {
AnnaBridge 189:f392fc9709a3 138 uint16_t reval;
AnnaBridge 189:f392fc9709a3 139
AnnaBridge 189:f392fc9709a3 140 adc_flag_clear(obj->adc, ADC_FLAG_EOC);
AnnaBridge 189:f392fc9709a3 141 /* start Conversion */
AnnaBridge 189:f392fc9709a3 142 adc_software_trigger_enable(obj->adc, ADC_REGULAR_CHANNEL);
AnnaBridge 189:f392fc9709a3 143
AnnaBridge 189:f392fc9709a3 144 while (SET != adc_flag_get(obj->adc, ADC_FLAG_EOC)) {
AnnaBridge 189:f392fc9709a3 145 }
AnnaBridge 189:f392fc9709a3 146 /* ADC actual accuracy is 12 bits */
AnnaBridge 189:f392fc9709a3 147 reval = adc_regular_data_read(obj->adc);
AnnaBridge 189:f392fc9709a3 148
AnnaBridge 189:f392fc9709a3 149 reval = DEV_ADC_PRECISION_12TO16(reval);
AnnaBridge 189:f392fc9709a3 150
AnnaBridge 189:f392fc9709a3 151 return reval;
AnnaBridge 189:f392fc9709a3 152 }
AnnaBridge 189:f392fc9709a3 153
AnnaBridge 189:f392fc9709a3 154 /** Read the input voltage, represented as a float in the range [0.0, 1.0]
AnnaBridge 189:f392fc9709a3 155 *
AnnaBridge 189:f392fc9709a3 156 * @param obj The analogin object
AnnaBridge 189:f392fc9709a3 157 * @return A floating value representing the current input voltage
AnnaBridge 189:f392fc9709a3 158 */
AnnaBridge 189:f392fc9709a3 159 float analogin_read(analogin_t *obj)
AnnaBridge 189:f392fc9709a3 160 {
AnnaBridge 189:f392fc9709a3 161 uint16_t reval;
AnnaBridge 189:f392fc9709a3 162
AnnaBridge 189:f392fc9709a3 163 adc_flag_clear(obj->adc, ADC_FLAG_EOC);
AnnaBridge 189:f392fc9709a3 164 /* start Conversion */
AnnaBridge 189:f392fc9709a3 165 adc_software_trigger_enable(obj->adc, ADC_REGULAR_CHANNEL);
AnnaBridge 189:f392fc9709a3 166 /* wait for conversion to complete */
AnnaBridge 189:f392fc9709a3 167 while (SET != adc_flag_get(obj->adc, ADC_FLAG_EOC)) {
AnnaBridge 189:f392fc9709a3 168 }
AnnaBridge 189:f392fc9709a3 169 /* ADC actual accuracy is 12 bits */
AnnaBridge 189:f392fc9709a3 170 reval = adc_regular_data_read(obj->adc);
AnnaBridge 189:f392fc9709a3 171
AnnaBridge 189:f392fc9709a3 172 return (float)reval * (1.0f / (float)DEV_ADC_ACCURACY_12BIT);
AnnaBridge 189:f392fc9709a3 173 }
AnnaBridge 189:f392fc9709a3 174
AnnaBridge 189:f392fc9709a3 175 #endif /* DEVICE_ANALOGIN */