mbed library sources. Supersedes mbed-src.

Fork of mbed-dev by mbed official

Committer:
Anna Bridge
Date:
Wed Jan 17 15:23:54 2018 +0000
Revision:
181:96ed750bd169
mbed-dev libray. Release version 158

Who changed what in which revision?

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