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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Anna Bridge 180:96ed750bd169 1 /* mbed Microcontroller Library
Anna Bridge 180:96ed750bd169 2 * Copyright (c) 2016, STMicroelectronics
Anna Bridge 180:96ed750bd169 3 * All rights reserved.
Anna Bridge 180:96ed750bd169 4 *
Anna Bridge 180:96ed750bd169 5 * Redistribution and use in source and binary forms, with or without
Anna Bridge 180:96ed750bd169 6 * modification, are permitted provided that the following conditions are met:
Anna Bridge 180:96ed750bd169 7 *
Anna Bridge 180:96ed750bd169 8 * 1. Redistributions of source code must retain the above copyright notice,
Anna Bridge 180:96ed750bd169 9 * this list of conditions and the following disclaimer.
Anna Bridge 180:96ed750bd169 10 * 2. Redistributions in binary form must reproduce the above copyright notice,
Anna Bridge 180:96ed750bd169 11 * this list of conditions and the following disclaimer in the documentation
Anna Bridge 180:96ed750bd169 12 * and/or other materials provided with the distribution.
Anna Bridge 180:96ed750bd169 13 * 3. Neither the name of STMicroelectronics nor the names of its contributors
Anna Bridge 180:96ed750bd169 14 * may be used to endorse or promote products derived from this software
Anna Bridge 180:96ed750bd169 15 * without specific prior written permission.
Anna Bridge 180:96ed750bd169 16 *
Anna Bridge 180:96ed750bd169 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Anna Bridge 180:96ed750bd169 18 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Anna Bridge 180:96ed750bd169 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Anna Bridge 180:96ed750bd169 20 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
Anna Bridge 180:96ed750bd169 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Anna Bridge 180:96ed750bd169 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
Anna Bridge 180:96ed750bd169 23 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
Anna Bridge 180:96ed750bd169 24 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Anna Bridge 180:96ed750bd169 25 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Anna Bridge 180:96ed750bd169 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Anna Bridge 180:96ed750bd169 27 */
Anna Bridge 180:96ed750bd169 28 #include "mbed_assert.h"
Anna Bridge 180:96ed750bd169 29 #include "analogin_api.h"
Anna Bridge 180:96ed750bd169 30
Anna Bridge 180:96ed750bd169 31 #if DEVICE_ANALOGIN
Anna Bridge 180:96ed750bd169 32
Anna Bridge 180:96ed750bd169 33 #include "mbed_wait_api.h"
Anna Bridge 180:96ed750bd169 34 #include "cmsis.h"
Anna Bridge 180:96ed750bd169 35 #include "pinmap.h"
Anna Bridge 180:96ed750bd169 36 #include "mbed_error.h"
Anna Bridge 180:96ed750bd169 37 #include "PeripheralPins.h"
Anna Bridge 180:96ed750bd169 38
Anna Bridge 180:96ed750bd169 39 void analogin_init(analogin_t *obj, PinName pin)
Anna Bridge 180:96ed750bd169 40 {
Anna Bridge 180:96ed750bd169 41 uint32_t function = (uint32_t)NC;
Anna Bridge 180:96ed750bd169 42
Anna Bridge 180:96ed750bd169 43 // ADC Internal Channels "pins" (Temperature, Vref, Vbat, ...)
Anna Bridge 180:96ed750bd169 44 // are described in PinNames.h and PeripheralPins.c
Anna Bridge 180:96ed750bd169 45 // Pin value must be between 0xF0 and 0xFF
Anna Bridge 180:96ed750bd169 46 if ((pin < 0xF0) || (pin >= 0x100)) {
Anna Bridge 180:96ed750bd169 47 // Normal channels
Anna Bridge 180:96ed750bd169 48 // Get the peripheral name from the pin and assign it to the object
Anna Bridge 180:96ed750bd169 49 obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC);
Anna Bridge 180:96ed750bd169 50 // Get the functions (adc channel) from the pin and assign it to the object
Anna Bridge 180:96ed750bd169 51 function = pinmap_function(pin, PinMap_ADC);
Anna Bridge 180:96ed750bd169 52 // Configure GPIO
Anna Bridge 180:96ed750bd169 53 pinmap_pinout(pin, PinMap_ADC);
Anna Bridge 180:96ed750bd169 54 } else {
Anna Bridge 180:96ed750bd169 55 // Internal channels
Anna Bridge 180:96ed750bd169 56 obj->handle.Instance = (ADC_TypeDef *)pinmap_peripheral(pin, PinMap_ADC_Internal);
Anna Bridge 180:96ed750bd169 57 function = pinmap_function(pin, PinMap_ADC_Internal);
Anna Bridge 180:96ed750bd169 58 // No GPIO configuration for internal channels
Anna Bridge 180:96ed750bd169 59 }
Anna Bridge 180:96ed750bd169 60 MBED_ASSERT(obj->handle.Instance != (ADC_TypeDef *)NC);
Anna Bridge 180:96ed750bd169 61 MBED_ASSERT(function != (uint32_t)NC);
Anna Bridge 180:96ed750bd169 62
Anna Bridge 180:96ed750bd169 63 obj->channel = STM_PIN_CHANNEL(function);
Anna Bridge 180:96ed750bd169 64
Anna Bridge 180:96ed750bd169 65 // Save pin number for the read function
Anna Bridge 180:96ed750bd169 66 obj->pin = pin;
Anna Bridge 180:96ed750bd169 67
Anna Bridge 180:96ed750bd169 68 // Configure ADC object structures
Anna Bridge 180:96ed750bd169 69 obj->handle.State = HAL_ADC_STATE_RESET;
Anna Bridge 180:96ed750bd169 70 obj->handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4;
Anna Bridge 180:96ed750bd169 71 obj->handle.Init.Resolution = ADC_RESOLUTION_12B;
Anna Bridge 180:96ed750bd169 72 obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
Anna Bridge 180:96ed750bd169 73 obj->handle.Init.ScanConvMode = DISABLE; // Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1)
Anna Bridge 180:96ed750bd169 74 obj->handle.Init.EOCSelection = EOC_SINGLE_CONV; // On STM32L1xx ADC, overrun detection is enabled only if EOC selection is set to each conversion (or transfer by DMA enabled, this is not the case in this example).
Anna Bridge 180:96ed750bd169 75 obj->handle.Init.LowPowerAutoWait = ADC_AUTOWAIT_UNTIL_DATA_READ; // Enable the dynamic low power Auto Delay: new conversion start only when the previous conversion (for regular group) or previous sequence (for injected group) has been treated by user software.
Anna Bridge 180:96ed750bd169 76 obj->handle.Init.LowPowerAutoPowerOff = ADC_AUTOPOWEROFF_IDLE_PHASE; // Enable the auto-off mode: the ADC automatically powers-off after a conversion and automatically wakes-up when a new conversion is triggered (with startup time between trigger and start of sampling).
Anna Bridge 180:96ed750bd169 77 obj->handle.Init.ChannelsBank = ADC_CHANNELS_BANK_A;
Anna Bridge 180:96ed750bd169 78 obj->handle.Init.ContinuousConvMode = DISABLE; // Continuous mode disabled to have only 1 conversion at each conversion trig
Anna Bridge 180:96ed750bd169 79 obj->handle.Init.NbrOfConversion = 1; // Parameter discarded because sequencer is disabled
Anna Bridge 180:96ed750bd169 80 obj->handle.Init.DiscontinuousConvMode = DISABLE; // Parameter discarded because sequencer is disabled
Anna Bridge 180:96ed750bd169 81 obj->handle.Init.NbrOfDiscConversion = 1; // Parameter discarded because sequencer is disabled
Anna Bridge 180:96ed750bd169 82 obj->handle.Init.ExternalTrigConv = 0; // Not used
Anna Bridge 180:96ed750bd169 83 obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
Anna Bridge 180:96ed750bd169 84 obj->handle.Init.DMAContinuousRequests = DISABLE;
Anna Bridge 180:96ed750bd169 85
Anna Bridge 180:96ed750bd169 86 __HAL_RCC_ADC1_CLK_ENABLE();
Anna Bridge 180:96ed750bd169 87
Anna Bridge 180:96ed750bd169 88 if (HAL_ADC_Init(&obj->handle) != HAL_OK) {
Anna Bridge 180:96ed750bd169 89 error("Cannot initialize ADC");
Anna Bridge 180:96ed750bd169 90 }
Anna Bridge 180:96ed750bd169 91
Anna Bridge 186:707f6e361f3e 92 if (!__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY)) {
Anna Bridge 180:96ed750bd169 93 // Enable the HSI (to clock the ADC)
Anna Bridge 186:707f6e361f3e 94 RCC_OscInitTypeDef RCC_OscInitStruct;
Anna Bridge 180:96ed750bd169 95 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
Anna Bridge 180:96ed750bd169 96 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
Anna Bridge 180:96ed750bd169 97 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
Anna Bridge 180:96ed750bd169 98 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
Anna Bridge 180:96ed750bd169 99 HAL_RCC_OscConfig(&RCC_OscInitStruct);
Anna Bridge 180:96ed750bd169 100 }
Anna Bridge 180:96ed750bd169 101 }
Anna Bridge 180:96ed750bd169 102
Anna Bridge 180:96ed750bd169 103 uint16_t adc_read(analogin_t *obj)
Anna Bridge 180:96ed750bd169 104 {
Anna Bridge 180:96ed750bd169 105 ADC_ChannelConfTypeDef sConfig = {0};
Anna Bridge 180:96ed750bd169 106
Anna Bridge 180:96ed750bd169 107 // Configure ADC channel
AnnaBridge 188:bcfe06ba3d64 108 sConfig.Rank = ADC_REGULAR_RANK_1;
AnnaBridge 188:bcfe06ba3d64 109 sConfig.SamplingTime = ADC_SAMPLETIME_48CYCLES;
AnnaBridge 188:bcfe06ba3d64 110
Anna Bridge 180:96ed750bd169 111 switch (obj->channel) {
Anna Bridge 180:96ed750bd169 112 case 0:
Anna Bridge 180:96ed750bd169 113 sConfig.Channel = ADC_CHANNEL_0;
Anna Bridge 180:96ed750bd169 114 break;
Anna Bridge 180:96ed750bd169 115 case 1:
Anna Bridge 180:96ed750bd169 116 sConfig.Channel = ADC_CHANNEL_1;
Anna Bridge 180:96ed750bd169 117 break;
Anna Bridge 180:96ed750bd169 118 case 2:
Anna Bridge 180:96ed750bd169 119 sConfig.Channel = ADC_CHANNEL_2;
Anna Bridge 180:96ed750bd169 120 break;
Anna Bridge 180:96ed750bd169 121 case 3:
Anna Bridge 180:96ed750bd169 122 sConfig.Channel = ADC_CHANNEL_3;
Anna Bridge 180:96ed750bd169 123 break;
Anna Bridge 180:96ed750bd169 124 case 4:
Anna Bridge 180:96ed750bd169 125 sConfig.Channel = ADC_CHANNEL_4;
Anna Bridge 180:96ed750bd169 126 break;
Anna Bridge 180:96ed750bd169 127 case 5:
Anna Bridge 180:96ed750bd169 128 sConfig.Channel = ADC_CHANNEL_5;
Anna Bridge 180:96ed750bd169 129 break;
Anna Bridge 180:96ed750bd169 130 case 6:
Anna Bridge 180:96ed750bd169 131 sConfig.Channel = ADC_CHANNEL_6;
Anna Bridge 180:96ed750bd169 132 break;
Anna Bridge 180:96ed750bd169 133 case 7:
Anna Bridge 180:96ed750bd169 134 sConfig.Channel = ADC_CHANNEL_7;
Anna Bridge 180:96ed750bd169 135 break;
Anna Bridge 180:96ed750bd169 136 case 8:
Anna Bridge 180:96ed750bd169 137 sConfig.Channel = ADC_CHANNEL_8;
Anna Bridge 180:96ed750bd169 138 break;
Anna Bridge 180:96ed750bd169 139 case 9:
Anna Bridge 180:96ed750bd169 140 sConfig.Channel = ADC_CHANNEL_9;
Anna Bridge 180:96ed750bd169 141 break;
Anna Bridge 180:96ed750bd169 142 case 10:
Anna Bridge 180:96ed750bd169 143 sConfig.Channel = ADC_CHANNEL_10;
Anna Bridge 180:96ed750bd169 144 break;
Anna Bridge 180:96ed750bd169 145 case 11:
Anna Bridge 180:96ed750bd169 146 sConfig.Channel = ADC_CHANNEL_11;
Anna Bridge 180:96ed750bd169 147 break;
Anna Bridge 180:96ed750bd169 148 case 12:
Anna Bridge 180:96ed750bd169 149 sConfig.Channel = ADC_CHANNEL_12;
Anna Bridge 180:96ed750bd169 150 break;
Anna Bridge 180:96ed750bd169 151 case 13:
Anna Bridge 180:96ed750bd169 152 sConfig.Channel = ADC_CHANNEL_13;
Anna Bridge 180:96ed750bd169 153 break;
Anna Bridge 180:96ed750bd169 154 case 14:
Anna Bridge 180:96ed750bd169 155 sConfig.Channel = ADC_CHANNEL_14;
Anna Bridge 180:96ed750bd169 156 break;
Anna Bridge 180:96ed750bd169 157 case 15:
Anna Bridge 180:96ed750bd169 158 sConfig.Channel = ADC_CHANNEL_15;
Anna Bridge 180:96ed750bd169 159 break;
Anna Bridge 180:96ed750bd169 160 case 16:
Anna Bridge 180:96ed750bd169 161 sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
AnnaBridge 188:bcfe06ba3d64 162 sConfig.SamplingTime = ADC_SAMPLETIME_384CYCLES;
Anna Bridge 180:96ed750bd169 163 break;
Anna Bridge 180:96ed750bd169 164 case 17:
Anna Bridge 180:96ed750bd169 165 sConfig.Channel = ADC_CHANNEL_VREFINT;
AnnaBridge 188:bcfe06ba3d64 166 sConfig.SamplingTime = ADC_SAMPLETIME_384CYCLES;
Anna Bridge 180:96ed750bd169 167 break;
Anna Bridge 180:96ed750bd169 168 case 18:
Anna Bridge 180:96ed750bd169 169 sConfig.Channel = ADC_CHANNEL_18;
Anna Bridge 180:96ed750bd169 170 break;
Anna Bridge 180:96ed750bd169 171 case 19:
Anna Bridge 180:96ed750bd169 172 sConfig.Channel = ADC_CHANNEL_19;
Anna Bridge 180:96ed750bd169 173 break;
Anna Bridge 180:96ed750bd169 174 case 20:
Anna Bridge 180:96ed750bd169 175 sConfig.Channel = ADC_CHANNEL_20;
Anna Bridge 180:96ed750bd169 176 break;
Anna Bridge 180:96ed750bd169 177 case 21:
Anna Bridge 180:96ed750bd169 178 sConfig.Channel = ADC_CHANNEL_21;
Anna Bridge 180:96ed750bd169 179 break;
Anna Bridge 180:96ed750bd169 180 case 22:
Anna Bridge 180:96ed750bd169 181 sConfig.Channel = ADC_CHANNEL_22;
Anna Bridge 180:96ed750bd169 182 break;
Anna Bridge 180:96ed750bd169 183 case 23:
Anna Bridge 180:96ed750bd169 184 sConfig.Channel = ADC_CHANNEL_23;
Anna Bridge 180:96ed750bd169 185 break;
Anna Bridge 180:96ed750bd169 186 case 24:
Anna Bridge 180:96ed750bd169 187 sConfig.Channel = ADC_CHANNEL_24;
Anna Bridge 180:96ed750bd169 188 break;
Anna Bridge 180:96ed750bd169 189 case 25:
Anna Bridge 180:96ed750bd169 190 sConfig.Channel = ADC_CHANNEL_25;
Anna Bridge 180:96ed750bd169 191 break;
Anna Bridge 180:96ed750bd169 192 case 26:
Anna Bridge 180:96ed750bd169 193 sConfig.Channel = ADC_CHANNEL_26;
Anna Bridge 180:96ed750bd169 194 break;
Anna Bridge 180:96ed750bd169 195 #ifdef ADC_CHANNEL_27
Anna Bridge 180:96ed750bd169 196 case 27:
Anna Bridge 180:96ed750bd169 197 sConfig.Channel = ADC_CHANNEL_27;
Anna Bridge 180:96ed750bd169 198 break;
Anna Bridge 180:96ed750bd169 199 #endif
Anna Bridge 180:96ed750bd169 200 #ifdef ADC_CHANNEL_28
Anna Bridge 180:96ed750bd169 201 case 28:
Anna Bridge 180:96ed750bd169 202 sConfig.Channel = ADC_CHANNEL_28;
Anna Bridge 180:96ed750bd169 203 break;
Anna Bridge 180:96ed750bd169 204 #endif
Anna Bridge 180:96ed750bd169 205 #ifdef ADC_CHANNEL_29
Anna Bridge 180:96ed750bd169 206 case 29:
Anna Bridge 180:96ed750bd169 207 sConfig.Channel = ADC_CHANNEL_29;
Anna Bridge 180:96ed750bd169 208 break;
Anna Bridge 180:96ed750bd169 209 #endif
Anna Bridge 180:96ed750bd169 210 #ifdef ADC_CHANNEL_30
Anna Bridge 180:96ed750bd169 211 case 30:
Anna Bridge 180:96ed750bd169 212 sConfig.Channel = ADC_CHANNEL_30;
Anna Bridge 180:96ed750bd169 213 break;
Anna Bridge 180:96ed750bd169 214 #endif
Anna Bridge 180:96ed750bd169 215 #ifdef ADC_CHANNEL_31
Anna Bridge 180:96ed750bd169 216 case 31:
Anna Bridge 180:96ed750bd169 217 sConfig.Channel = ADC_CHANNEL_31;
Anna Bridge 180:96ed750bd169 218 break;
Anna Bridge 180:96ed750bd169 219 #endif
Anna Bridge 180:96ed750bd169 220 default:
Anna Bridge 180:96ed750bd169 221 return 0;
Anna Bridge 180:96ed750bd169 222 }
Anna Bridge 180:96ed750bd169 223
Anna Bridge 180:96ed750bd169 224 HAL_ADC_ConfigChannel(&obj->handle, &sConfig);
Anna Bridge 180:96ed750bd169 225
Anna Bridge 180:96ed750bd169 226 HAL_ADC_Start(&obj->handle); // Start conversion
Anna Bridge 180:96ed750bd169 227
Anna Bridge 180:96ed750bd169 228 // Wait end of conversion and get value
Anna Bridge 180:96ed750bd169 229 if (HAL_ADC_PollForConversion(&obj->handle, 10) == HAL_OK) {
Anna Bridge 180:96ed750bd169 230 return (uint16_t)HAL_ADC_GetValue(&obj->handle);
Anna Bridge 180:96ed750bd169 231 } else {
Anna Bridge 180:96ed750bd169 232 return 0;
Anna Bridge 180:96ed750bd169 233 }
Anna Bridge 180:96ed750bd169 234 }
Anna Bridge 180:96ed750bd169 235
Anna Bridge 180:96ed750bd169 236 #endif