mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Mon Jul 06 09:00:34 2015 +0100
Revision:
582:a89625bcd809
Parent:
573:ad23fe03a082
Synchronized with git revision 45004fb61e4af8f74f4e916318df5207fcf6076d

Full URL: https://github.com/mbedmicro/mbed/commit/45004fb61e4af8f74f4e916318df5207fcf6076d/

DISCO_F746NG - Fix several issues

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 573:ad23fe03a082 1 /* mbed Microcontroller Library
mbed_official 573:ad23fe03a082 2 * Copyright (c) 2015, STMicroelectronics
mbed_official 573:ad23fe03a082 3 * All rights reserved.
mbed_official 573:ad23fe03a082 4 *
mbed_official 573:ad23fe03a082 5 * Redistribution and use in source and binary forms, with or without
mbed_official 573:ad23fe03a082 6 * modification, are permitted provided that the following conditions are met:
mbed_official 573:ad23fe03a082 7 *
mbed_official 573:ad23fe03a082 8 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 573:ad23fe03a082 9 * this list of conditions and the following disclaimer.
mbed_official 573:ad23fe03a082 10 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 573:ad23fe03a082 11 * this list of conditions and the following disclaimer in the documentation
mbed_official 573:ad23fe03a082 12 * and/or other materials provided with the distribution.
mbed_official 573:ad23fe03a082 13 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 573:ad23fe03a082 14 * may be used to endorse or promote products derived from this software
mbed_official 573:ad23fe03a082 15 * without specific prior written permission.
mbed_official 573:ad23fe03a082 16 *
mbed_official 573:ad23fe03a082 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 573:ad23fe03a082 18 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 573:ad23fe03a082 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 573:ad23fe03a082 20 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 573:ad23fe03a082 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 573:ad23fe03a082 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 573:ad23fe03a082 23 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 573:ad23fe03a082 24 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 573:ad23fe03a082 25 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 573:ad23fe03a082 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 573:ad23fe03a082 27 */
mbed_official 573:ad23fe03a082 28 #include "mbed_assert.h"
mbed_official 573:ad23fe03a082 29 #include "analogin_api.h"
mbed_official 573:ad23fe03a082 30
mbed_official 573:ad23fe03a082 31 #if DEVICE_ANALOGIN
mbed_official 573:ad23fe03a082 32
mbed_official 573:ad23fe03a082 33 #include "wait_api.h"
mbed_official 573:ad23fe03a082 34 #include "cmsis.h"
mbed_official 573:ad23fe03a082 35 #include "pinmap.h"
mbed_official 573:ad23fe03a082 36 #include "PeripheralPins.h"
mbed_official 582:a89625bcd809 37 #include "mbed_error.h"
mbed_official 573:ad23fe03a082 38
mbed_official 573:ad23fe03a082 39 ADC_HandleTypeDef AdcHandle;
mbed_official 573:ad23fe03a082 40
mbed_official 573:ad23fe03a082 41 void analogin_init(analogin_t *obj, PinName pin)
mbed_official 573:ad23fe03a082 42 {
mbed_official 582:a89625bcd809 43 #if defined(ADC1)
mbed_official 582:a89625bcd809 44 static int adc1_inited = 0;
mbed_official 582:a89625bcd809 45 #endif
mbed_official 582:a89625bcd809 46 #if defined(ADC2)
mbed_official 582:a89625bcd809 47 static int adc2_inited = 0;
mbed_official 582:a89625bcd809 48 #endif
mbed_official 582:a89625bcd809 49 #if defined(ADC3)
mbed_official 582:a89625bcd809 50 static int adc3_inited = 0;
mbed_official 582:a89625bcd809 51 #endif
mbed_official 582:a89625bcd809 52
mbed_official 573:ad23fe03a082 53 // Get the peripheral name from the pin and assign it to the object
mbed_official 573:ad23fe03a082 54 obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
mbed_official 573:ad23fe03a082 55 MBED_ASSERT(obj->adc != (ADCName)NC);
mbed_official 573:ad23fe03a082 56
mbed_official 573:ad23fe03a082 57 // Get the functions (adc channel) from the pin and assign it to the object
mbed_official 573:ad23fe03a082 58 uint32_t function = pinmap_function(pin, PinMap_ADC);
mbed_official 573:ad23fe03a082 59 MBED_ASSERT(function != (uint32_t)NC);
mbed_official 573:ad23fe03a082 60 obj->channel = STM_PIN_CHANNEL(function);
mbed_official 573:ad23fe03a082 61
mbed_official 573:ad23fe03a082 62 // Configure GPIO
mbed_official 573:ad23fe03a082 63 pinmap_pinout(pin, PinMap_ADC);
mbed_official 573:ad23fe03a082 64
mbed_official 573:ad23fe03a082 65 // Save pin number for the read function
mbed_official 573:ad23fe03a082 66 obj->pin = pin;
mbed_official 573:ad23fe03a082 67
mbed_official 582:a89625bcd809 68 // Check if ADC is already initialized
mbed_official 582:a89625bcd809 69 // Enable ADC clock
mbed_official 582:a89625bcd809 70 #if defined(ADC1)
mbed_official 582:a89625bcd809 71 if ((obj->adc == ADC_1) && adc1_inited) return;
mbed_official 582:a89625bcd809 72 if (obj->adc == ADC_1) {
mbed_official 582:a89625bcd809 73 __HAL_RCC_ADC1_CLK_ENABLE();
mbed_official 582:a89625bcd809 74 adc1_inited = 1;
mbed_official 582:a89625bcd809 75 }
mbed_official 582:a89625bcd809 76 #endif
mbed_official 582:a89625bcd809 77 #if defined(ADC2)
mbed_official 582:a89625bcd809 78 if ((obj->adc == ADC_2) && adc2_inited) return;
mbed_official 582:a89625bcd809 79 if (obj->adc == ADC_2) {
mbed_official 582:a89625bcd809 80 __HAL_RCC_ADC2_CLK_ENABLE();
mbed_official 582:a89625bcd809 81 adc2_inited = 1;
mbed_official 582:a89625bcd809 82 }
mbed_official 582:a89625bcd809 83 #endif
mbed_official 582:a89625bcd809 84 #if defined(ADC3)
mbed_official 582:a89625bcd809 85 if ((obj->adc == ADC_3) && adc3_inited) return;
mbed_official 582:a89625bcd809 86 if (obj->adc == ADC_3) {
mbed_official 582:a89625bcd809 87 __HAL_RCC_ADC3_CLK_ENABLE();
mbed_official 582:a89625bcd809 88 adc3_inited = 1;
mbed_official 582:a89625bcd809 89 }
mbed_official 582:a89625bcd809 90 #endif
mbed_official 573:ad23fe03a082 91
mbed_official 582:a89625bcd809 92 // Configure ADC
mbed_official 582:a89625bcd809 93 AdcHandle.Instance = (ADC_TypeDef *)(obj->adc);
mbed_official 582:a89625bcd809 94 AdcHandle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV4;
mbed_official 582:a89625bcd809 95 AdcHandle.Init.Resolution = ADC_RESOLUTION_12B;
mbed_official 582:a89625bcd809 96 AdcHandle.Init.ScanConvMode = DISABLE;
mbed_official 582:a89625bcd809 97 AdcHandle.Init.ContinuousConvMode = DISABLE;
mbed_official 582:a89625bcd809 98 AdcHandle.Init.DiscontinuousConvMode = DISABLE;
mbed_official 582:a89625bcd809 99 AdcHandle.Init.NbrOfDiscConversion = 0;
mbed_official 582:a89625bcd809 100 AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
mbed_official 582:a89625bcd809 101 AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
mbed_official 582:a89625bcd809 102 AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
mbed_official 582:a89625bcd809 103 AdcHandle.Init.NbrOfConversion = 1;
mbed_official 582:a89625bcd809 104 AdcHandle.Init.DMAContinuousRequests = DISABLE;
mbed_official 582:a89625bcd809 105 AdcHandle.Init.EOCSelection = DISABLE;
mbed_official 582:a89625bcd809 106
mbed_official 582:a89625bcd809 107 if (HAL_ADC_Init(&AdcHandle) != HAL_OK) {
mbed_official 582:a89625bcd809 108 error("Cannot initialize ADC");
mbed_official 573:ad23fe03a082 109 }
mbed_official 573:ad23fe03a082 110 }
mbed_official 573:ad23fe03a082 111
mbed_official 573:ad23fe03a082 112 static inline uint16_t adc_read(analogin_t *obj)
mbed_official 573:ad23fe03a082 113 {
mbed_official 582:a89625bcd809 114 ADC_ChannelConfTypeDef sConfig = {0};
mbed_official 573:ad23fe03a082 115
mbed_official 573:ad23fe03a082 116 AdcHandle.Instance = (ADC_TypeDef *)(obj->adc);
mbed_official 573:ad23fe03a082 117
mbed_official 573:ad23fe03a082 118 // Configure ADC channel
mbed_official 573:ad23fe03a082 119 sConfig.Rank = 1;
mbed_official 582:a89625bcd809 120 sConfig.SamplingTime = ADC_SAMPLETIME_15CYCLES;
mbed_official 573:ad23fe03a082 121 sConfig.Offset = 0;
mbed_official 573:ad23fe03a082 122
mbed_official 573:ad23fe03a082 123 switch (obj->channel) {
mbed_official 573:ad23fe03a082 124 case 0:
mbed_official 573:ad23fe03a082 125 sConfig.Channel = ADC_CHANNEL_0;
mbed_official 573:ad23fe03a082 126 break;
mbed_official 573:ad23fe03a082 127 case 1:
mbed_official 573:ad23fe03a082 128 sConfig.Channel = ADC_CHANNEL_1;
mbed_official 573:ad23fe03a082 129 break;
mbed_official 573:ad23fe03a082 130 case 2:
mbed_official 573:ad23fe03a082 131 sConfig.Channel = ADC_CHANNEL_2;
mbed_official 573:ad23fe03a082 132 break;
mbed_official 573:ad23fe03a082 133 case 3:
mbed_official 573:ad23fe03a082 134 sConfig.Channel = ADC_CHANNEL_3;
mbed_official 573:ad23fe03a082 135 break;
mbed_official 573:ad23fe03a082 136 case 4:
mbed_official 573:ad23fe03a082 137 sConfig.Channel = ADC_CHANNEL_4;
mbed_official 573:ad23fe03a082 138 break;
mbed_official 573:ad23fe03a082 139 case 5:
mbed_official 573:ad23fe03a082 140 sConfig.Channel = ADC_CHANNEL_5;
mbed_official 573:ad23fe03a082 141 break;
mbed_official 573:ad23fe03a082 142 case 6:
mbed_official 573:ad23fe03a082 143 sConfig.Channel = ADC_CHANNEL_6;
mbed_official 573:ad23fe03a082 144 break;
mbed_official 573:ad23fe03a082 145 case 7:
mbed_official 573:ad23fe03a082 146 sConfig.Channel = ADC_CHANNEL_7;
mbed_official 573:ad23fe03a082 147 break;
mbed_official 573:ad23fe03a082 148 case 8:
mbed_official 573:ad23fe03a082 149 sConfig.Channel = ADC_CHANNEL_8;
mbed_official 573:ad23fe03a082 150 break;
mbed_official 573:ad23fe03a082 151 case 9:
mbed_official 573:ad23fe03a082 152 sConfig.Channel = ADC_CHANNEL_9;
mbed_official 573:ad23fe03a082 153 break;
mbed_official 573:ad23fe03a082 154 case 10:
mbed_official 573:ad23fe03a082 155 sConfig.Channel = ADC_CHANNEL_10;
mbed_official 573:ad23fe03a082 156 break;
mbed_official 573:ad23fe03a082 157 case 11:
mbed_official 573:ad23fe03a082 158 sConfig.Channel = ADC_CHANNEL_11;
mbed_official 573:ad23fe03a082 159 break;
mbed_official 573:ad23fe03a082 160 case 12:
mbed_official 573:ad23fe03a082 161 sConfig.Channel = ADC_CHANNEL_12;
mbed_official 573:ad23fe03a082 162 break;
mbed_official 573:ad23fe03a082 163 case 13:
mbed_official 573:ad23fe03a082 164 sConfig.Channel = ADC_CHANNEL_13;
mbed_official 573:ad23fe03a082 165 break;
mbed_official 573:ad23fe03a082 166 case 14:
mbed_official 573:ad23fe03a082 167 sConfig.Channel = ADC_CHANNEL_14;
mbed_official 573:ad23fe03a082 168 break;
mbed_official 573:ad23fe03a082 169 case 15:
mbed_official 573:ad23fe03a082 170 sConfig.Channel = ADC_CHANNEL_15;
mbed_official 573:ad23fe03a082 171 break;
mbed_official 582:a89625bcd809 172 case 16:
mbed_official 582:a89625bcd809 173 sConfig.Channel = ADC_CHANNEL_16;
mbed_official 582:a89625bcd809 174 break;
mbed_official 582:a89625bcd809 175 case 17:
mbed_official 582:a89625bcd809 176 sConfig.Channel = ADC_CHANNEL_17;
mbed_official 582:a89625bcd809 177 break;
mbed_official 582:a89625bcd809 178 case 18:
mbed_official 582:a89625bcd809 179 sConfig.Channel = ADC_CHANNEL_18;
mbed_official 582:a89625bcd809 180 break;
mbed_official 573:ad23fe03a082 181 default:
mbed_official 573:ad23fe03a082 182 return 0;
mbed_official 573:ad23fe03a082 183 }
mbed_official 573:ad23fe03a082 184
mbed_official 582:a89625bcd809 185 if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK) {
mbed_official 582:a89625bcd809 186 error("Cannot configure ADC channel");
mbed_official 582:a89625bcd809 187 }
mbed_official 573:ad23fe03a082 188
mbed_official 573:ad23fe03a082 189 HAL_ADC_Start(&AdcHandle); // Start conversion
mbed_official 573:ad23fe03a082 190
mbed_official 573:ad23fe03a082 191 // Wait end of conversion and get value
mbed_official 582:a89625bcd809 192 HAL_ADC_PollForConversion(&AdcHandle, 10);
mbed_official 582:a89625bcd809 193 if (HAL_ADC_GetState(&AdcHandle) == HAL_ADC_STATE_EOC_REG) {
mbed_official 573:ad23fe03a082 194 return (HAL_ADC_GetValue(&AdcHandle));
mbed_official 573:ad23fe03a082 195 } else {
mbed_official 573:ad23fe03a082 196 return 0;
mbed_official 573:ad23fe03a082 197 }
mbed_official 573:ad23fe03a082 198 }
mbed_official 573:ad23fe03a082 199
mbed_official 573:ad23fe03a082 200 uint16_t analogin_read_u16(analogin_t *obj)
mbed_official 573:ad23fe03a082 201 {
mbed_official 573:ad23fe03a082 202 uint16_t value = adc_read(obj);
mbed_official 573:ad23fe03a082 203 // 12-bit to 16-bit conversion
mbed_official 573:ad23fe03a082 204 value = ((value << 4) & (uint16_t)0xFFF0) | ((value >> 8) & (uint16_t)0x000F);
mbed_official 573:ad23fe03a082 205 return value;
mbed_official 573:ad23fe03a082 206 }
mbed_official 573:ad23fe03a082 207
mbed_official 573:ad23fe03a082 208 float analogin_read(analogin_t *obj)
mbed_official 573:ad23fe03a082 209 {
mbed_official 573:ad23fe03a082 210 uint16_t value = adc_read(obj);
mbed_official 573:ad23fe03a082 211 return (float)value * (1.0f / (float)0xFFF); // 12 bits range
mbed_official 573:ad23fe03a082 212 }
mbed_official 573:ad23fe03a082 213
mbed_official 573:ad23fe03a082 214 #endif