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:
Wed Aug 27 03:45:07 2014 +0100
Revision:
298:7557d401dbc3
Parent:
227:7bd0639b8911
Child:
402:09075a3b15e3
Synchronized with git revision 74958e0f7294def61da58f82b5f48fa2b2c55e00

Full URL: https://github.com/mbedmicro/mbed/commit/74958e0f7294def61da58f82b5f48fa2b2c55e00/

[NUCLEOs] Fix bug (normalization to 16bit) in adc read_u16()

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 52:a51c77007319 1 /* mbed Microcontroller Library
mbed_official 70:c1fbde68b492 2 * Copyright (c) 2014, STMicroelectronics
mbed_official 70:c1fbde68b492 3 * All rights reserved.
mbed_official 52:a51c77007319 4 *
mbed_official 70:c1fbde68b492 5 * Redistribution and use in source and binary forms, with or without
mbed_official 70:c1fbde68b492 6 * modification, are permitted provided that the following conditions are met:
mbed_official 52:a51c77007319 7 *
mbed_official 70:c1fbde68b492 8 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 70:c1fbde68b492 9 * this list of conditions and the following disclaimer.
mbed_official 70:c1fbde68b492 10 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 70:c1fbde68b492 11 * this list of conditions and the following disclaimer in the documentation
mbed_official 70:c1fbde68b492 12 * and/or other materials provided with the distribution.
mbed_official 70:c1fbde68b492 13 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 70:c1fbde68b492 14 * may be used to endorse or promote products derived from this software
mbed_official 70:c1fbde68b492 15 * without specific prior written permission.
mbed_official 52:a51c77007319 16 *
mbed_official 70:c1fbde68b492 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 70:c1fbde68b492 18 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 70:c1fbde68b492 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 70:c1fbde68b492 20 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 70:c1fbde68b492 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 70:c1fbde68b492 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 70:c1fbde68b492 23 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 70:c1fbde68b492 24 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 70:c1fbde68b492 25 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 70:c1fbde68b492 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 52:a51c77007319 27 */
mbed_official 227:7bd0639b8911 28 #include "mbed_assert.h"
mbed_official 52:a51c77007319 29 #include "analogin_api.h"
mbed_official 52:a51c77007319 30
mbed_official 52:a51c77007319 31 #if DEVICE_ANALOGIN
mbed_official 52:a51c77007319 32
mbed_official 52:a51c77007319 33 #include "cmsis.h"
mbed_official 52:a51c77007319 34 #include "pinmap.h"
mbed_official 174:8bb9f3a33240 35 #include "wait_api.h"
mbed_official 52:a51c77007319 36
mbed_official 52:a51c77007319 37 static const PinMap PinMap_ADC[] = {
mbed_official 167:d5744491c362 38 {PA_0, ADC_1, STM_PIN_DATA(GPIO_Mode_AIN, 0)}, // ADC12_IN0
mbed_official 167:d5744491c362 39 {PA_1, ADC_1, STM_PIN_DATA(GPIO_Mode_AIN, 0)}, // ADC12_IN1
mbed_official 167:d5744491c362 40 {PA_2, ADC_1, STM_PIN_DATA(GPIO_Mode_AIN, 0)}, // ADC12_IN2
mbed_official 167:d5744491c362 41 {PA_3, ADC_1, STM_PIN_DATA(GPIO_Mode_AIN, 0)}, // ADC12_IN3
mbed_official 167:d5744491c362 42 {PA_4, ADC_1, STM_PIN_DATA(GPIO_Mode_AIN, 0)}, // ADC12_IN4
mbed_official 167:d5744491c362 43 {PA_5, ADC_1, STM_PIN_DATA(GPIO_Mode_AIN, 0)}, // ADC12_IN5
mbed_official 167:d5744491c362 44 {PA_6, ADC_1, STM_PIN_DATA(GPIO_Mode_AIN, 0)}, // ADC12_IN6
mbed_official 167:d5744491c362 45 {PA_7, ADC_1, STM_PIN_DATA(GPIO_Mode_AIN, 0)}, // ADC12_IN7
mbed_official 167:d5744491c362 46 {PB_0, ADC_1, STM_PIN_DATA(GPIO_Mode_AIN, 0)}, // ADC12_IN8
mbed_official 167:d5744491c362 47 {PB_1, ADC_1, STM_PIN_DATA(GPIO_Mode_AIN, 0)}, // ADC12_IN9
mbed_official 167:d5744491c362 48 {PC_0, ADC_1, STM_PIN_DATA(GPIO_Mode_AIN, 0)}, // ADC12_IN10
mbed_official 167:d5744491c362 49 {PC_1, ADC_1, STM_PIN_DATA(GPIO_Mode_AIN, 0)}, // ADC12_IN11
mbed_official 167:d5744491c362 50 {PC_2, ADC_1, STM_PIN_DATA(GPIO_Mode_AIN, 0)}, // ADC12_IN12
mbed_official 167:d5744491c362 51 {PC_3, ADC_1, STM_PIN_DATA(GPIO_Mode_AIN, 0)}, // ADC12_IN13
mbed_official 167:d5744491c362 52 {PC_4, ADC_1, STM_PIN_DATA(GPIO_Mode_AIN, 0)}, // ADC12_IN14
mbed_official 167:d5744491c362 53 {PC_5, ADC_1, STM_PIN_DATA(GPIO_Mode_AIN, 0)}, // ADC12_IN15
mbed_official 52:a51c77007319 54 {NC, NC, 0}
mbed_official 52:a51c77007319 55 };
mbed_official 52:a51c77007319 56
mbed_official 52:a51c77007319 57 int adc_inited = 0;
mbed_official 52:a51c77007319 58
mbed_official 52:a51c77007319 59 void analogin_init(analogin_t *obj, PinName pin) {
mbed_official 174:8bb9f3a33240 60 ADC_TypeDef *adc;
mbed_official 52:a51c77007319 61 ADC_InitTypeDef ADC_InitStructure;
mbed_official 174:8bb9f3a33240 62
mbed_official 167:d5744491c362 63 // Get the peripheral name from the pin and assign it to the object
mbed_official 52:a51c77007319 64 obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
mbed_official 227:7bd0639b8911 65 MBED_ASSERT(obj->adc != (ADCName)NC);
mbed_official 52:a51c77007319 66
mbed_official 52:a51c77007319 67 // Configure GPIO
mbed_official 52:a51c77007319 68 pinmap_pinout(pin, PinMap_ADC);
mbed_official 52:a51c77007319 69
mbed_official 52:a51c77007319 70 // Save pin number for the read function
mbed_official 52:a51c77007319 71 obj->pin = pin;
mbed_official 52:a51c77007319 72
mbed_official 52:a51c77007319 73 // The ADC initialization is done once
mbed_official 52:a51c77007319 74 if (adc_inited == 0) {
mbed_official 52:a51c77007319 75 adc_inited = 1;
mbed_official 52:a51c77007319 76
mbed_official 52:a51c77007319 77 // Get ADC registers structure address
mbed_official 52:a51c77007319 78 adc = (ADC_TypeDef *)(obj->adc);
mbed_official 174:8bb9f3a33240 79
mbed_official 167:d5744491c362 80 // Enable ADC clock (14 MHz maximum)
mbed_official 167:d5744491c362 81 // PCLK2 = 64 MHz --> ADC clock = 64/6 = 10.666 MHz
mbed_official 167:d5744491c362 82 RCC_ADCCLKConfig(RCC_PCLK2_Div6);
mbed_official 52:a51c77007319 83 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
mbed_official 174:8bb9f3a33240 84
mbed_official 52:a51c77007319 85 // Configure ADC
mbed_official 167:d5744491c362 86 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
mbed_official 167:d5744491c362 87 ADC_InitStructure.ADC_ScanConvMode = DISABLE;
mbed_official 52:a51c77007319 88 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
mbed_official 167:d5744491c362 89 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
mbed_official 167:d5744491c362 90 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
mbed_official 167:d5744491c362 91 ADC_InitStructure.ADC_NbrOfChannel = 1;
mbed_official 52:a51c77007319 92 ADC_Init(adc, &ADC_InitStructure);
mbed_official 52:a51c77007319 93
mbed_official 52:a51c77007319 94 // Enable ADC
mbed_official 52:a51c77007319 95 ADC_Cmd(adc, ENABLE);
mbed_official 52:a51c77007319 96
mbed_official 52:a51c77007319 97 // Calibrate ADC
mbed_official 52:a51c77007319 98 ADC_ResetCalibration(adc);
mbed_official 174:8bb9f3a33240 99 while (ADC_GetResetCalibrationStatus(adc));
mbed_official 52:a51c77007319 100 ADC_StartCalibration(adc);
mbed_official 174:8bb9f3a33240 101 while (ADC_GetCalibrationStatus(adc));
mbed_official 52:a51c77007319 102 }
mbed_official 52:a51c77007319 103 }
mbed_official 52:a51c77007319 104
mbed_official 52:a51c77007319 105 static inline uint16_t adc_read(analogin_t *obj) {
mbed_official 174:8bb9f3a33240 106 // Get ADC registers structure address
mbed_official 174:8bb9f3a33240 107 ADC_TypeDef *adc = (ADC_TypeDef *)(obj->adc);
mbed_official 174:8bb9f3a33240 108 int channel = 0;
mbed_official 52:a51c77007319 109
mbed_official 174:8bb9f3a33240 110 // Configure ADC channel
mbed_official 174:8bb9f3a33240 111 switch (obj->pin) {
mbed_official 174:8bb9f3a33240 112 case PA_0:
mbed_official 174:8bb9f3a33240 113 channel = 0;
mbed_official 174:8bb9f3a33240 114 break;
mbed_official 174:8bb9f3a33240 115 case PA_1:
mbed_official 174:8bb9f3a33240 116 channel = 1;
mbed_official 174:8bb9f3a33240 117 break;
mbed_official 174:8bb9f3a33240 118 case PA_2:
mbed_official 174:8bb9f3a33240 119 channel = 2;
mbed_official 174:8bb9f3a33240 120 break;
mbed_official 174:8bb9f3a33240 121 case PA_3:
mbed_official 174:8bb9f3a33240 122 channel = 3;
mbed_official 174:8bb9f3a33240 123 break;
mbed_official 174:8bb9f3a33240 124 case PA_4:
mbed_official 174:8bb9f3a33240 125 channel = 4;
mbed_official 174:8bb9f3a33240 126 break;
mbed_official 174:8bb9f3a33240 127 case PA_5:
mbed_official 174:8bb9f3a33240 128 channel = 5;
mbed_official 174:8bb9f3a33240 129 break;
mbed_official 174:8bb9f3a33240 130 case PA_6:
mbed_official 174:8bb9f3a33240 131 channel = 6;
mbed_official 174:8bb9f3a33240 132 break;
mbed_official 174:8bb9f3a33240 133 case PA_7:
mbed_official 174:8bb9f3a33240 134 channel = 7;
mbed_official 174:8bb9f3a33240 135 break;
mbed_official 174:8bb9f3a33240 136 case PB_0:
mbed_official 174:8bb9f3a33240 137 channel = 8;
mbed_official 174:8bb9f3a33240 138 break;
mbed_official 174:8bb9f3a33240 139 case PB_1:
mbed_official 174:8bb9f3a33240 140 channel = 9;
mbed_official 174:8bb9f3a33240 141 break;
mbed_official 174:8bb9f3a33240 142 case PC_0:
mbed_official 174:8bb9f3a33240 143 channel = 10;
mbed_official 174:8bb9f3a33240 144 break;
mbed_official 174:8bb9f3a33240 145 case PC_1:
mbed_official 174:8bb9f3a33240 146 channel = 11;
mbed_official 174:8bb9f3a33240 147 break;
mbed_official 174:8bb9f3a33240 148 case PC_2:
mbed_official 174:8bb9f3a33240 149 channel = 12;
mbed_official 174:8bb9f3a33240 150 break;
mbed_official 174:8bb9f3a33240 151 case PC_3:
mbed_official 174:8bb9f3a33240 152 channel = 13;
mbed_official 174:8bb9f3a33240 153 break;
mbed_official 174:8bb9f3a33240 154 case PC_4:
mbed_official 174:8bb9f3a33240 155 channel = 14;
mbed_official 174:8bb9f3a33240 156 break;
mbed_official 174:8bb9f3a33240 157 case PC_5:
mbed_official 174:8bb9f3a33240 158 channel = 15;
mbed_official 174:8bb9f3a33240 159 break;
mbed_official 174:8bb9f3a33240 160 default:
mbed_official 174:8bb9f3a33240 161 return 0;
mbed_official 174:8bb9f3a33240 162 }
mbed_official 174:8bb9f3a33240 163
mbed_official 174:8bb9f3a33240 164 ADC_RegularChannelConfig(adc, channel, 1, ADC_SampleTime_7Cycles5);
mbed_official 174:8bb9f3a33240 165
mbed_official 174:8bb9f3a33240 166 ADC_SoftwareStartConvCmd(adc, ENABLE); // Start conversion
mbed_official 174:8bb9f3a33240 167
mbed_official 174:8bb9f3a33240 168 while (ADC_GetFlagStatus(adc, ADC_FLAG_EOC) == RESET); // Wait end of conversion
mbed_official 174:8bb9f3a33240 169
mbed_official 174:8bb9f3a33240 170 return (ADC_GetConversionValue(adc)); // Get conversion value
mbed_official 52:a51c77007319 171 }
mbed_official 52:a51c77007319 172
mbed_official 52:a51c77007319 173 uint16_t analogin_read_u16(analogin_t *obj) {
mbed_official 298:7557d401dbc3 174 uint16_t value = adc_read(obj);
mbed_official 298:7557d401dbc3 175 // 12-bit to 16-bit conversion
mbed_official 298:7557d401dbc3 176 value = ((value << 4) & (uint16_t)0xFFF0) | ((value >> 8) & (uint16_t)0x000F);
mbed_official 298:7557d401dbc3 177 return value;
mbed_official 52:a51c77007319 178 }
mbed_official 52:a51c77007319 179
mbed_official 52:a51c77007319 180 float analogin_read(analogin_t *obj) {
mbed_official 174:8bb9f3a33240 181 uint16_t value = adc_read(obj);
mbed_official 174:8bb9f3a33240 182 return (float)value * (1.0f / (float)0xFFF); // 12 bits range
mbed_official 52:a51c77007319 183 }
mbed_official 52:a51c77007319 184
mbed_official 52:a51c77007319 185 #endif