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 Sep 28 10:45:10 2015 +0100
Revision:
630:825f75ca301e
Parent:
441:d2c15dda23c1
Synchronized with git revision 54fbe4144faf309c37205a5d39fa665daa919f10

Full URL: https://github.com/mbedmicro/mbed/commit/54fbe4144faf309c37205a5d39fa665daa919f10/

NUCLEO_F031K6 : Add new target

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 340:28d1f895c6fe 1 /**
mbed_official 340:28d1f895c6fe 2 ******************************************************************************
mbed_official 340:28d1f895c6fe 3 * @file stm32f0xx_hal_adc.c
mbed_official 340:28d1f895c6fe 4 * @author MCD Application Team
mbed_official 630:825f75ca301e 5 * @version V1.3.0
mbed_official 630:825f75ca301e 6 * @date 26-June-2015
mbed_official 340:28d1f895c6fe 7 * @brief This file provides firmware functions to manage the following
mbed_official 340:28d1f895c6fe 8 * functionalities of the Analog to Digital Convertor (ADC)
mbed_official 340:28d1f895c6fe 9 * peripheral:
mbed_official 340:28d1f895c6fe 10 * + Initialization and de-initialization functions
mbed_official 340:28d1f895c6fe 11 * ++ Initialization and Configuration of ADC
mbed_official 340:28d1f895c6fe 12 * + Operation functions
mbed_official 630:825f75ca301e 13 * ++ Start, stop, get result of conversions of regular
mbed_official 630:825f75ca301e 14 * group, using 3 possible modes: polling, interruption or DMA.
mbed_official 340:28d1f895c6fe 15 * + Control functions
mbed_official 630:825f75ca301e 16 * ++ Channels configuration on regular group
mbed_official 340:28d1f895c6fe 17 * ++ Analog Watchdog configuration
mbed_official 340:28d1f895c6fe 18 * + State functions
mbed_official 340:28d1f895c6fe 19 * ++ ADC state machine management
mbed_official 340:28d1f895c6fe 20 * ++ Interrupts and flags management
mbed_official 630:825f75ca301e 21 * Other functions (extended functions) are available in file
mbed_official 630:825f75ca301e 22 * "stm32f0xx_hal_adc_ex.c".
mbed_official 630:825f75ca301e 23 *
mbed_official 340:28d1f895c6fe 24 @verbatim
mbed_official 340:28d1f895c6fe 25 ==============================================================================
mbed_official 630:825f75ca301e 26 ##### ADC peripheral features #####
mbed_official 340:28d1f895c6fe 27 ==============================================================================
mbed_official 630:825f75ca301e 28 [..]
mbed_official 630:825f75ca301e 29 (+) 12-bit, 10-bit, 8-bit or 6-bit configurable resolution
mbed_official 340:28d1f895c6fe 30
mbed_official 630:825f75ca301e 31 (+) Interrupt generation at the end of regular conversion and in case of
mbed_official 340:28d1f895c6fe 32 analog watchdog or overrun events.
mbed_official 340:28d1f895c6fe 33
mbed_official 630:825f75ca301e 34 (+) Single and continuous conversion modes.
mbed_official 340:28d1f895c6fe 35
mbed_official 630:825f75ca301e 36 (+) Scan mode for conversion of several channels sequentially.
mbed_official 340:28d1f895c6fe 37
mbed_official 630:825f75ca301e 38 (+) Data alignment with in-built data coherency.
mbed_official 340:28d1f895c6fe 39
mbed_official 630:825f75ca301e 40 (+) Programmable sampling time (common for all channels)
mbed_official 340:28d1f895c6fe 41
mbed_official 630:825f75ca301e 42 (+) ADC conversion of regular group.
mbed_official 340:28d1f895c6fe 43
mbed_official 630:825f75ca301e 44 (+) External trigger (timer or EXTI) with configurable polarity
mbed_official 340:28d1f895c6fe 45
mbed_official 630:825f75ca301e 46 (+) DMA request generation for transfer of conversions data of regular group.
mbed_official 340:28d1f895c6fe 47
mbed_official 630:825f75ca301e 48 (+) ADC calibration
mbed_official 340:28d1f895c6fe 49
mbed_official 630:825f75ca301e 50 (+) ADC supply requirements: 2.4 V to 3.6 V at full speed and down to 1.8 V at
mbed_official 340:28d1f895c6fe 51 slower speed.
mbed_official 340:28d1f895c6fe 52
mbed_official 630:825f75ca301e 53 (+) ADC input range: from Vref- (connected to Vssa) to Vref+ (connected to
mbed_official 340:28d1f895c6fe 54 Vdda or to an external voltage reference).
mbed_official 340:28d1f895c6fe 55
mbed_official 340:28d1f895c6fe 56
mbed_official 340:28d1f895c6fe 57 ##### How to use this driver #####
mbed_official 340:28d1f895c6fe 58 ==============================================================================
mbed_official 340:28d1f895c6fe 59 [..]
mbed_official 340:28d1f895c6fe 60
mbed_official 630:825f75ca301e 61 *** Configuration of top level parameters related to ADC ***
mbed_official 630:825f75ca301e 62 ============================================================
mbed_official 630:825f75ca301e 63 [..]
mbed_official 630:825f75ca301e 64
mbed_official 630:825f75ca301e 65 (#) Enable the ADC interface
mbed_official 630:825f75ca301e 66 (++) As prerequisite, ADC clock must be configured at RCC top level.
mbed_official 630:825f75ca301e 67 Caution: On STM32F0, ADC clock frequency max is 14MHz (refer
mbed_official 630:825f75ca301e 68 to device datasheet).
mbed_official 630:825f75ca301e 69 Therefore, ADC clock prescaler must be configured in
mbed_official 630:825f75ca301e 70 function of ADC clock source frequency to remain below
mbed_official 630:825f75ca301e 71 this maximum frequency.
mbed_official 630:825f75ca301e 72
mbed_official 630:825f75ca301e 73 (++) Two clock settings are mandatory:
mbed_official 630:825f75ca301e 74 (+++) ADC clock (core clock, also possibly conversion clock).
mbed_official 340:28d1f895c6fe 75
mbed_official 630:825f75ca301e 76 (+++) ADC clock (conversions clock).
mbed_official 630:825f75ca301e 77 Two possible clock sources: synchronous clock derived from APB clock
mbed_official 630:825f75ca301e 78 or asynchronous clock derived from ADC dedicated HSI RC oscillator
mbed_official 630:825f75ca301e 79 14MHz.
mbed_official 630:825f75ca301e 80 If asynchronous clock is selected, parameter "HSI14State" must be set either:
mbed_official 630:825f75ca301e 81 - to "...HSI14State = RCC_HSI14_ADC_CONTROL" to let the ADC control
mbed_official 630:825f75ca301e 82 the HSI14 oscillator enable/disable (if not used to supply the main
mbed_official 630:825f75ca301e 83 system clock): feature used if ADC mode LowPowerAutoPowerOff is
mbed_official 630:825f75ca301e 84 enabled.
mbed_official 630:825f75ca301e 85 - to "...HSI14State = RCC_HSI14_ON" to maintain the HSI14 oscillator
mbed_official 630:825f75ca301e 86 always enabled: can be used to supply the main system clock.
mbed_official 630:825f75ca301e 87
mbed_official 630:825f75ca301e 88 (+++) Example:
mbed_official 630:825f75ca301e 89 Into HAL_ADC_MspInit() (recommended code location) or with
mbed_official 630:825f75ca301e 90 other device clock parameters configuration:
mbed_official 630:825f75ca301e 91 (+++) __HAL_RCC_ADC1_CLK_ENABLE(); (mandatory)
mbed_official 630:825f75ca301e 92
mbed_official 630:825f75ca301e 93 HI14 enable or let under control of ADC: (optional: if asynchronous clock selected)
mbed_official 630:825f75ca301e 94 (+++) RCC_OscInitTypeDef RCC_OscInitStructure;
mbed_official 630:825f75ca301e 95 (+++) RCC_OscInitStructure.OscillatorType = RCC_OSCILLATORTYPE_HSI14;
mbed_official 630:825f75ca301e 96 (+++) RCC_OscInitStructure.HSI14CalibrationValue = RCC_HSI14CALIBRATION_DEFAULT;
mbed_official 630:825f75ca301e 97 (+++) RCC_OscInitStructure.HSI14State = RCC_HSI14_ADC_CONTROL;
mbed_official 630:825f75ca301e 98 (+++) RCC_OscInitStructure.PLL... (optional if used for system clock)
mbed_official 630:825f75ca301e 99 (+++) HAL_RCC_OscConfig(&RCC_OscInitStructure);
mbed_official 630:825f75ca301e 100
mbed_official 630:825f75ca301e 101 (++) ADC clock source and clock prescaler are configured at ADC level with
mbed_official 630:825f75ca301e 102 parameter "ClockPrescaler" using function HAL_ADC_Init().
mbed_official 340:28d1f895c6fe 103
mbed_official 340:28d1f895c6fe 104 (#) ADC pins configuration
mbed_official 630:825f75ca301e 105 (++) Enable the clock for the ADC GPIOs
mbed_official 630:825f75ca301e 106 using macro __HAL_RCC_GPIOx_CLK_ENABLE()
mbed_official 630:825f75ca301e 107 (++) Configure these ADC pins in analog mode
mbed_official 630:825f75ca301e 108 using function HAL_GPIO_Init()
mbed_official 340:28d1f895c6fe 109
mbed_official 630:825f75ca301e 110 (#) Optionally, in case of usage of ADC with interruptions:
mbed_official 630:825f75ca301e 111 (++) Configure the NVIC for ADC
mbed_official 630:825f75ca301e 112 using function HAL_NVIC_EnableIRQ(ADCx_IRQn)
mbed_official 630:825f75ca301e 113 (++) Insert the ADC interruption handler function HAL_ADC_IRQHandler()
mbed_official 630:825f75ca301e 114 into the function of corresponding ADC interruption vector
mbed_official 630:825f75ca301e 115 ADCx_IRQHandler().
mbed_official 630:825f75ca301e 116
mbed_official 630:825f75ca301e 117 (#) Optionally, in case of usage of DMA:
mbed_official 630:825f75ca301e 118 (++) Configure the DMA (DMA channel, mode normal or circular, ...)
mbed_official 630:825f75ca301e 119 using function HAL_DMA_Init().
mbed_official 630:825f75ca301e 120 (++) Configure the NVIC for DMA
mbed_official 630:825f75ca301e 121 using function HAL_NVIC_EnableIRQ(DMAx_Channelx_IRQn)
mbed_official 630:825f75ca301e 122 (++) Insert the ADC interruption handler function HAL_ADC_IRQHandler()
mbed_official 630:825f75ca301e 123 into the function of corresponding DMA interruption vector
mbed_official 630:825f75ca301e 124 DMAx_Channelx_IRQHandler().
mbed_official 340:28d1f895c6fe 125
mbed_official 630:825f75ca301e 126 *** Configuration of ADC, group regular, channels parameters ***
mbed_official 630:825f75ca301e 127 ================================================================
mbed_official 630:825f75ca301e 128 [..]
mbed_official 630:825f75ca301e 129
mbed_official 630:825f75ca301e 130 (#) Configure the ADC parameters (resolution, data alignment, ...)
mbed_official 630:825f75ca301e 131 and regular group parameters (conversion trigger, sequencer, ...)
mbed_official 630:825f75ca301e 132 using function HAL_ADC_Init().
mbed_official 630:825f75ca301e 133
mbed_official 630:825f75ca301e 134 (#) Configure the channels for regular group parameters (channel number,
mbed_official 630:825f75ca301e 135 channel rank into sequencer, ..., into regular group)
mbed_official 630:825f75ca301e 136 using function HAL_ADC_ConfigChannel().
mbed_official 630:825f75ca301e 137
mbed_official 630:825f75ca301e 138 (#) Optionally, configure the analog watchdog parameters (channels
mbed_official 630:825f75ca301e 139 monitored, thresholds, ...)
mbed_official 630:825f75ca301e 140 using function HAL_ADC_AnalogWDGConfig().
mbed_official 630:825f75ca301e 141
mbed_official 630:825f75ca301e 142 *** Execution of ADC conversions ***
mbed_official 630:825f75ca301e 143 ====================================
mbed_official 340:28d1f895c6fe 144 [..]
mbed_official 630:825f75ca301e 145
mbed_official 630:825f75ca301e 146 (#) Optionally, perform an automatic ADC calibration to improve the
mbed_official 630:825f75ca301e 147 conversion accuracy
mbed_official 630:825f75ca301e 148 using function HAL_ADCEx_Calibration_Start().
mbed_official 630:825f75ca301e 149
mbed_official 630:825f75ca301e 150 (#) ADC driver can be used among three modes: polling, interruption,
mbed_official 630:825f75ca301e 151 transfer by DMA.
mbed_official 630:825f75ca301e 152
mbed_official 630:825f75ca301e 153 (++) ADC conversion by polling:
mbed_official 630:825f75ca301e 154 (+++) Activate the ADC peripheral and start conversions
mbed_official 630:825f75ca301e 155 using function HAL_ADC_Start()
mbed_official 630:825f75ca301e 156 (+++) Wait for ADC conversion completion
mbed_official 630:825f75ca301e 157 using function HAL_ADC_PollForConversion()
mbed_official 630:825f75ca301e 158 (+++) Retrieve conversion results
mbed_official 630:825f75ca301e 159 using function HAL_ADC_GetValue()
mbed_official 630:825f75ca301e 160 (+++) Stop conversion and disable the ADC peripheral
mbed_official 630:825f75ca301e 161 using function HAL_ADC_Stop()
mbed_official 630:825f75ca301e 162
mbed_official 630:825f75ca301e 163 (++) ADC conversion by interruption:
mbed_official 630:825f75ca301e 164 (+++) Activate the ADC peripheral and start conversions
mbed_official 630:825f75ca301e 165 using function HAL_ADC_Start_IT()
mbed_official 630:825f75ca301e 166 (+++) Wait for ADC conversion completion by call of function
mbed_official 630:825f75ca301e 167 HAL_ADC_ConvCpltCallback()
mbed_official 630:825f75ca301e 168 (this function must be implemented in user program)
mbed_official 630:825f75ca301e 169 (+++) Retrieve conversion results
mbed_official 630:825f75ca301e 170 using function HAL_ADC_GetValue()
mbed_official 630:825f75ca301e 171 (+++) Stop conversion and disable the ADC peripheral
mbed_official 630:825f75ca301e 172 using function HAL_ADC_Stop_IT()
mbed_official 630:825f75ca301e 173
mbed_official 630:825f75ca301e 174 (++) ADC conversion with transfer by DMA:
mbed_official 630:825f75ca301e 175 (+++) Activate the ADC peripheral and start conversions
mbed_official 630:825f75ca301e 176 using function HAL_ADC_Start_DMA()
mbed_official 630:825f75ca301e 177 (+++) Wait for ADC conversion completion by call of function
mbed_official 630:825f75ca301e 178 HAL_ADC_ConvCpltCallback() or HAL_ADC_ConvHalfCpltCallback()
mbed_official 630:825f75ca301e 179 (these functions must be implemented in user program)
mbed_official 630:825f75ca301e 180 (+++) Conversion results are automatically transferred by DMA into
mbed_official 630:825f75ca301e 181 destination variable address.
mbed_official 630:825f75ca301e 182 (+++) Stop conversion and disable the ADC peripheral
mbed_official 630:825f75ca301e 183 using function HAL_ADC_Stop_DMA()
mbed_official 630:825f75ca301e 184
mbed_official 630:825f75ca301e 185 [..]
mbed_official 630:825f75ca301e 186
mbed_official 630:825f75ca301e 187 (@) Callback functions must be implemented in user program:
mbed_official 630:825f75ca301e 188 (+@) HAL_ADC_ErrorCallback()
mbed_official 630:825f75ca301e 189 (+@) HAL_ADC_LevelOutOfWindowCallback() (callback of analog watchdog)
mbed_official 630:825f75ca301e 190 (+@) HAL_ADC_ConvCpltCallback()
mbed_official 630:825f75ca301e 191 (+@) HAL_ADC_ConvHalfCpltCallback
mbed_official 630:825f75ca301e 192
mbed_official 630:825f75ca301e 193 *** Deinitialization of ADC ***
mbed_official 630:825f75ca301e 194 ============================================================
mbed_official 630:825f75ca301e 195 [..]
mbed_official 630:825f75ca301e 196
mbed_official 630:825f75ca301e 197 (#) Disable the ADC interface
mbed_official 630:825f75ca301e 198 (++) ADC clock can be hard reset and disabled at RCC top level.
mbed_official 630:825f75ca301e 199 (++) Hard reset of ADC peripherals
mbed_official 630:825f75ca301e 200 using macro __ADCx_FORCE_RESET(), __ADCx_RELEASE_RESET().
mbed_official 630:825f75ca301e 201 (++) ADC clock disable
mbed_official 630:825f75ca301e 202 using the equivalent macro/functions as configuration step.
mbed_official 630:825f75ca301e 203 (+++) Example:
mbed_official 630:825f75ca301e 204 Into HAL_ADC_MspDeInit() (recommended code location) or with
mbed_official 630:825f75ca301e 205 other device clock parameters configuration:
mbed_official 630:825f75ca301e 206 (+++) RCC_OscInitStructure.OscillatorType = RCC_OSCILLATORTYPE_HSI14;
mbed_official 630:825f75ca301e 207 (+++) RCC_OscInitStructure.HSI14State = RCC_HSI14_OFF; (if not used for system clock)
mbed_official 630:825f75ca301e 208 (+++) HAL_RCC_OscConfig(&RCC_OscInitStructure);
mbed_official 630:825f75ca301e 209
mbed_official 630:825f75ca301e 210 (#) ADC pins configuration
mbed_official 630:825f75ca301e 211 (++) Disable the clock for the ADC GPIOs
mbed_official 630:825f75ca301e 212 using macro __HAL_RCC_GPIOx_CLK_DISABLE()
mbed_official 630:825f75ca301e 213
mbed_official 630:825f75ca301e 214 (#) Optionally, in case of usage of ADC with interruptions:
mbed_official 630:825f75ca301e 215 (++) Disable the NVIC for ADC
mbed_official 630:825f75ca301e 216 using function HAL_NVIC_EnableIRQ(ADCx_IRQn)
mbed_official 630:825f75ca301e 217
mbed_official 630:825f75ca301e 218 (#) Optionally, in case of usage of DMA:
mbed_official 630:825f75ca301e 219 (++) Deinitialize the DMA
mbed_official 630:825f75ca301e 220 using function HAL_DMA_Init().
mbed_official 630:825f75ca301e 221 (++) Disable the NVIC for DMA
mbed_official 630:825f75ca301e 222 using function HAL_NVIC_EnableIRQ(DMAx_Channelx_IRQn)
mbed_official 630:825f75ca301e 223
mbed_official 630:825f75ca301e 224 [..]
mbed_official 340:28d1f895c6fe 225
mbed_official 340:28d1f895c6fe 226 @endverbatim
mbed_official 340:28d1f895c6fe 227 ******************************************************************************
mbed_official 340:28d1f895c6fe 228 * @attention
mbed_official 340:28d1f895c6fe 229 *
mbed_official 630:825f75ca301e 230 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
mbed_official 340:28d1f895c6fe 231 *
mbed_official 340:28d1f895c6fe 232 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 340:28d1f895c6fe 233 * are permitted provided that the following conditions are met:
mbed_official 340:28d1f895c6fe 234 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 340:28d1f895c6fe 235 * this list of conditions and the following disclaimer.
mbed_official 340:28d1f895c6fe 236 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 340:28d1f895c6fe 237 * this list of conditions and the following disclaimer in the documentation
mbed_official 340:28d1f895c6fe 238 * and/or other materials provided with the distribution.
mbed_official 340:28d1f895c6fe 239 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 340:28d1f895c6fe 240 * may be used to endorse or promote products derived from this software
mbed_official 340:28d1f895c6fe 241 * without specific prior written permission.
mbed_official 340:28d1f895c6fe 242 *
mbed_official 340:28d1f895c6fe 243 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 340:28d1f895c6fe 244 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 340:28d1f895c6fe 245 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 340:28d1f895c6fe 246 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 340:28d1f895c6fe 247 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 340:28d1f895c6fe 248 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 340:28d1f895c6fe 249 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 340:28d1f895c6fe 250 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 340:28d1f895c6fe 251 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 340:28d1f895c6fe 252 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 340:28d1f895c6fe 253 *
mbed_official 340:28d1f895c6fe 254 ******************************************************************************
mbed_official 340:28d1f895c6fe 255 */
mbed_official 340:28d1f895c6fe 256
mbed_official 340:28d1f895c6fe 257 /* Includes ------------------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 258 #include "stm32f0xx_hal.h"
mbed_official 340:28d1f895c6fe 259
mbed_official 340:28d1f895c6fe 260 /** @addtogroup STM32F0xx_HAL_Driver
mbed_official 340:28d1f895c6fe 261 * @{
mbed_official 340:28d1f895c6fe 262 */
mbed_official 340:28d1f895c6fe 263
mbed_official 630:825f75ca301e 264 /** @defgroup ADC ADC
mbed_official 340:28d1f895c6fe 265 * @brief ADC HAL module driver
mbed_official 340:28d1f895c6fe 266 * @{
mbed_official 340:28d1f895c6fe 267 */
mbed_official 340:28d1f895c6fe 268
mbed_official 340:28d1f895c6fe 269 #ifdef HAL_ADC_MODULE_ENABLED
mbed_official 340:28d1f895c6fe 270
mbed_official 340:28d1f895c6fe 271 /* Private typedef -----------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 272 /* Private define ------------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 273 /** @defgroup ADC_Private_Constants ADC Private Constants
mbed_official 340:28d1f895c6fe 274 * @{
mbed_official 340:28d1f895c6fe 275 */
mbed_official 340:28d1f895c6fe 276
mbed_official 340:28d1f895c6fe 277 /* Fixed timeout values for ADC calibration, enable settling time, disable */
mbed_official 340:28d1f895c6fe 278 /* settling time. */
mbed_official 340:28d1f895c6fe 279 /* Values defined to be higher than worst cases: low clock frequency, */
mbed_official 340:28d1f895c6fe 280 /* maximum prescaler. */
mbed_official 340:28d1f895c6fe 281 /* Ex of profile low frequency : Clock source at 0.1 MHz, ADC clock */
mbed_official 340:28d1f895c6fe 282 /* prescaler 4, sampling time 7.5 ADC clock cycles, resolution 12 bits. */
mbed_official 340:28d1f895c6fe 283 /* Unit: ms */
mbed_official 340:28d1f895c6fe 284 #define ADC_ENABLE_TIMEOUT ((uint32_t) 2)
mbed_official 340:28d1f895c6fe 285 #define ADC_DISABLE_TIMEOUT ((uint32_t) 2)
mbed_official 340:28d1f895c6fe 286 #define ADC_STOP_CONVERSION_TIMEOUT ((uint32_t) 2)
mbed_official 340:28d1f895c6fe 287
mbed_official 630:825f75ca301e 288 /* Delay for ADC stabilization time. */
mbed_official 630:825f75ca301e 289 /* Maximum delay is 1us (refer to device datasheet, parameter tSTAB). */
mbed_official 630:825f75ca301e 290 /* Unit: us */
mbed_official 630:825f75ca301e 291 #define ADC_STAB_DELAY_US ((uint32_t) 1)
mbed_official 630:825f75ca301e 292
mbed_official 340:28d1f895c6fe 293 /* Delay for temperature sensor stabilization time. */
mbed_official 340:28d1f895c6fe 294 /* Maximum delay is 10us (refer to device datasheet, parameter tSTART). */
mbed_official 630:825f75ca301e 295 /* Unit: us */
mbed_official 630:825f75ca301e 296 #define ADC_TEMPSENSOR_DELAY_US ((uint32_t) 10)
mbed_official 340:28d1f895c6fe 297
mbed_official 340:28d1f895c6fe 298 /**
mbed_official 340:28d1f895c6fe 299 * @}
mbed_official 340:28d1f895c6fe 300 */
mbed_official 340:28d1f895c6fe 301
mbed_official 340:28d1f895c6fe 302 /* Private macro -------------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 303 /* Private variables ---------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 304 /* Private function prototypes -----------------------------------------------*/
mbed_official 340:28d1f895c6fe 305 /** @defgroup ADC_Private_Functions ADC Private Functions
mbed_official 340:28d1f895c6fe 306 * @{
mbed_official 340:28d1f895c6fe 307 */
mbed_official 340:28d1f895c6fe 308 static HAL_StatusTypeDef ADC_Enable(ADC_HandleTypeDef* hadc);
mbed_official 340:28d1f895c6fe 309 static HAL_StatusTypeDef ADC_Disable(ADC_HandleTypeDef* hadc);
mbed_official 340:28d1f895c6fe 310 static HAL_StatusTypeDef ADC_ConversionStop(ADC_HandleTypeDef* hadc);
mbed_official 340:28d1f895c6fe 311 static void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma);
mbed_official 340:28d1f895c6fe 312 static void ADC_DMAHalfConvCplt(DMA_HandleTypeDef *hdma);
mbed_official 340:28d1f895c6fe 313 static void ADC_DMAError(DMA_HandleTypeDef *hdma);
mbed_official 340:28d1f895c6fe 314 /**
mbed_official 340:28d1f895c6fe 315 * @}
mbed_official 340:28d1f895c6fe 316 */
mbed_official 340:28d1f895c6fe 317
mbed_official 340:28d1f895c6fe 318 /* Exported functions ---------------------------------------------------------*/
mbed_official 340:28d1f895c6fe 319
mbed_official 340:28d1f895c6fe 320 /** @defgroup ADC_Exported_Functions ADC Exported Functions
mbed_official 340:28d1f895c6fe 321 * @{
mbed_official 340:28d1f895c6fe 322 */
mbed_official 340:28d1f895c6fe 323
mbed_official 340:28d1f895c6fe 324 /** @defgroup ADC_Exported_Functions_Group1 Initialization/de-initialization functions
mbed_official 340:28d1f895c6fe 325 * @brief Initialization and Configuration functions
mbed_official 340:28d1f895c6fe 326 *
mbed_official 340:28d1f895c6fe 327 @verbatim
mbed_official 340:28d1f895c6fe 328 ===============================================================================
mbed_official 340:28d1f895c6fe 329 ##### Initialization and de-initialization functions #####
mbed_official 340:28d1f895c6fe 330 ===============================================================================
mbed_official 340:28d1f895c6fe 331 [..] This section provides functions allowing to:
mbed_official 340:28d1f895c6fe 332 (+) Initialize and configure the ADC.
mbed_official 340:28d1f895c6fe 333 (+) De-initialize the ADC
mbed_official 340:28d1f895c6fe 334 @endverbatim
mbed_official 340:28d1f895c6fe 335 * @{
mbed_official 340:28d1f895c6fe 336 */
mbed_official 340:28d1f895c6fe 337
mbed_official 340:28d1f895c6fe 338 /**
mbed_official 340:28d1f895c6fe 339 * @brief Initializes the ADC peripheral and regular group according to
mbed_official 340:28d1f895c6fe 340 * parameters specified in structure "ADC_InitTypeDef".
mbed_official 340:28d1f895c6fe 341 * @note As prerequisite, ADC clock must be configured at RCC top level
mbed_official 340:28d1f895c6fe 342 * depending on both possible clock sources: APB clock of HSI clock.
mbed_official 340:28d1f895c6fe 343 * See commented example code below that can be copied and uncommented
mbed_official 340:28d1f895c6fe 344 * into HAL_ADC_MspInit().
mbed_official 340:28d1f895c6fe 345 * @note Possibility to update parameters on the fly:
mbed_official 340:28d1f895c6fe 346 * This function initializes the ADC MSP (HAL_ADC_MspInit()) only when
mbed_official 340:28d1f895c6fe 347 * coming from ADC state reset. Following calls to this function can
mbed_official 340:28d1f895c6fe 348 * be used to reconfigure some parameters of ADC_InitTypeDef
mbed_official 340:28d1f895c6fe 349 * structure on the fly, without modifying MSP configuration. If ADC
mbed_official 340:28d1f895c6fe 350 * MSP has to be modified again, HAL_ADC_DeInit() must be called
mbed_official 340:28d1f895c6fe 351 * before HAL_ADC_Init().
mbed_official 340:28d1f895c6fe 352 * The setting of these parameters is conditioned to ADC state.
mbed_official 340:28d1f895c6fe 353 * For parameters constraints, see comments of structure
mbed_official 340:28d1f895c6fe 354 * "ADC_InitTypeDef".
mbed_official 340:28d1f895c6fe 355 * @note This function configures the ADC within 2 scopes: scope of entire
mbed_official 340:28d1f895c6fe 356 * ADC and scope of regular group. For parameters details, see comments
mbed_official 340:28d1f895c6fe 357 * of structure "ADC_InitTypeDef".
mbed_official 340:28d1f895c6fe 358 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 359 * @retval HAL status
mbed_official 340:28d1f895c6fe 360 */
mbed_official 340:28d1f895c6fe 361 HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 362 {
mbed_official 630:825f75ca301e 363 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
mbed_official 340:28d1f895c6fe 364 uint32_t tmpCFGR1 = 0;
mbed_official 340:28d1f895c6fe 365
mbed_official 340:28d1f895c6fe 366 /* Check ADC handle */
mbed_official 441:d2c15dda23c1 367 if(hadc == NULL)
mbed_official 340:28d1f895c6fe 368 {
mbed_official 340:28d1f895c6fe 369 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 370 }
mbed_official 340:28d1f895c6fe 371
mbed_official 340:28d1f895c6fe 372 /* Check the parameters */
mbed_official 340:28d1f895c6fe 373 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 374 assert_param(IS_ADC_CLOCKPRESCALER(hadc->Init.ClockPrescaler));
mbed_official 340:28d1f895c6fe 375 assert_param(IS_ADC_RESOLUTION(hadc->Init.Resolution));
mbed_official 340:28d1f895c6fe 376 assert_param(IS_ADC_DATA_ALIGN(hadc->Init.DataAlign));
mbed_official 340:28d1f895c6fe 377 assert_param(IS_ADC_SCAN_MODE(hadc->Init.ScanConvMode));
mbed_official 340:28d1f895c6fe 378 assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode));
mbed_official 340:28d1f895c6fe 379 assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DiscontinuousConvMode));
mbed_official 340:28d1f895c6fe 380 assert_param(IS_ADC_EXTTRIG_EDGE(hadc->Init.ExternalTrigConvEdge));
mbed_official 340:28d1f895c6fe 381 assert_param(IS_ADC_EXTTRIG(hadc->Init.ExternalTrigConv));
mbed_official 340:28d1f895c6fe 382 assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DMAContinuousRequests));
mbed_official 340:28d1f895c6fe 383 assert_param(IS_ADC_EOC_SELECTION(hadc->Init.EOCSelection));
mbed_official 340:28d1f895c6fe 384 assert_param(IS_ADC_OVERRUN(hadc->Init.Overrun));
mbed_official 340:28d1f895c6fe 385 assert_param(IS_FUNCTIONAL_STATE(hadc->Init.LowPowerAutoWait));
mbed_official 340:28d1f895c6fe 386 assert_param(IS_FUNCTIONAL_STATE(hadc->Init.LowPowerAutoPowerOff));
mbed_official 340:28d1f895c6fe 387
mbed_official 340:28d1f895c6fe 388 /* As prerequisite, into HAL_ADC_MspInit(), ADC clock must be configured */
mbed_official 340:28d1f895c6fe 389 /* at RCC top level depending on both possible clock sources: */
mbed_official 340:28d1f895c6fe 390 /* APB clock or HSI clock. */
mbed_official 340:28d1f895c6fe 391 /* Refer to header of this file for more details on clock enabling procedure*/
mbed_official 340:28d1f895c6fe 392
mbed_official 340:28d1f895c6fe 393 /* Actions performed only if ADC is coming from state reset: */
mbed_official 340:28d1f895c6fe 394 /* - Initialization of ADC MSP */
mbed_official 340:28d1f895c6fe 395 /* - ADC voltage regulator enable */
mbed_official 340:28d1f895c6fe 396 if (hadc->State == HAL_ADC_STATE_RESET)
mbed_official 340:28d1f895c6fe 397 {
mbed_official 630:825f75ca301e 398 /* Initialize ADC error code */
mbed_official 630:825f75ca301e 399 ADC_CLEAR_ERRORCODE(hadc);
mbed_official 630:825f75ca301e 400
mbed_official 630:825f75ca301e 401 /* Allocate lock resource and initialize it */
mbed_official 630:825f75ca301e 402 hadc->Lock = HAL_UNLOCKED;
mbed_official 630:825f75ca301e 403
mbed_official 340:28d1f895c6fe 404 /* Init the low level hardware */
mbed_official 340:28d1f895c6fe 405 HAL_ADC_MspInit(hadc);
mbed_official 340:28d1f895c6fe 406 }
mbed_official 340:28d1f895c6fe 407
mbed_official 340:28d1f895c6fe 408 /* Configuration of ADC parameters if previous preliminary actions are */
mbed_official 340:28d1f895c6fe 409 /* correctly completed. */
mbed_official 340:28d1f895c6fe 410 /* and if there is no conversion on going on regular group (ADC can be */
mbed_official 340:28d1f895c6fe 411 /* enabled anyway, in case of call of this function to update a parameter */
mbed_official 340:28d1f895c6fe 412 /* on the fly). */
mbed_official 630:825f75ca301e 413 if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL) &&
mbed_official 630:825f75ca301e 414 (tmp_hal_status == HAL_OK) &&
mbed_official 630:825f75ca301e 415 (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) == RESET) )
mbed_official 340:28d1f895c6fe 416 {
mbed_official 630:825f75ca301e 417 /* Set ADC state */
mbed_official 630:825f75ca301e 418 ADC_STATE_CLR_SET(hadc->State,
mbed_official 630:825f75ca301e 419 HAL_ADC_STATE_REG_BUSY,
mbed_official 630:825f75ca301e 420 HAL_ADC_STATE_BUSY_INTERNAL);
mbed_official 340:28d1f895c6fe 421
mbed_official 340:28d1f895c6fe 422 /* Parameters update conditioned to ADC state: */
mbed_official 340:28d1f895c6fe 423 /* Parameters that can be updated only when ADC is disabled: */
mbed_official 340:28d1f895c6fe 424 /* - ADC clock mode */
mbed_official 340:28d1f895c6fe 425 /* - ADC clock prescaler */
mbed_official 630:825f75ca301e 426 /* - ADC resolution */
mbed_official 630:825f75ca301e 427 if (ADC_IS_ENABLE(hadc) == RESET)
mbed_official 340:28d1f895c6fe 428 {
mbed_official 340:28d1f895c6fe 429 /* Some parameters of this register are not reset, since they are set */
mbed_official 340:28d1f895c6fe 430 /* by other functions and must be kept in case of usage of this */
mbed_official 340:28d1f895c6fe 431 /* function on the fly (update of a parameter of ADC_InitTypeDef */
mbed_official 340:28d1f895c6fe 432 /* without needing to reconfigure all other ADC groups/channels */
mbed_official 340:28d1f895c6fe 433 /* parameters): */
mbed_official 340:28d1f895c6fe 434 /* - internal measurement paths: Vbat, temperature sensor, Vref */
mbed_official 340:28d1f895c6fe 435 /* (set into HAL_ADC_ConfigChannel() ) */
mbed_official 340:28d1f895c6fe 436
mbed_official 630:825f75ca301e 437 /* Configuration of ADC resolution */
mbed_official 630:825f75ca301e 438 MODIFY_REG(hadc->Instance->CFGR1,
mbed_official 630:825f75ca301e 439 ADC_CFGR1_RES ,
mbed_official 630:825f75ca301e 440 hadc->Init.Resolution );
mbed_official 340:28d1f895c6fe 441
mbed_official 340:28d1f895c6fe 442 /* Configuration of ADC clock mode: clock source AHB or HSI with */
mbed_official 340:28d1f895c6fe 443 /* selectable prescaler */
mbed_official 630:825f75ca301e 444 MODIFY_REG(hadc->Instance->CFGR2 ,
mbed_official 630:825f75ca301e 445 ADC_CFGR2_CKMODE ,
mbed_official 630:825f75ca301e 446 hadc->Init.ClockPrescaler );
mbed_official 340:28d1f895c6fe 447 }
mbed_official 340:28d1f895c6fe 448
mbed_official 340:28d1f895c6fe 449 /* Configuration of ADC: */
mbed_official 340:28d1f895c6fe 450 /* - discontinuous mode */
mbed_official 340:28d1f895c6fe 451 /* - LowPowerAutoWait mode */
mbed_official 340:28d1f895c6fe 452 /* - LowPowerAutoPowerOff mode */
mbed_official 340:28d1f895c6fe 453 /* - continuous conversion mode */
mbed_official 340:28d1f895c6fe 454 /* - overrun */
mbed_official 340:28d1f895c6fe 455 /* - external trigger to start conversion */
mbed_official 340:28d1f895c6fe 456 /* - external trigger polarity */
mbed_official 340:28d1f895c6fe 457 /* - data alignment */
mbed_official 340:28d1f895c6fe 458 /* - resolution */
mbed_official 340:28d1f895c6fe 459 /* - scan direction */
mbed_official 340:28d1f895c6fe 460 /* - DMA continuous request */
mbed_official 340:28d1f895c6fe 461 hadc->Instance->CFGR1 &= ~( ADC_CFGR1_DISCEN |
mbed_official 340:28d1f895c6fe 462 ADC_CFGR1_AUTOFF |
mbed_official 340:28d1f895c6fe 463 ADC_CFGR1_AUTDLY |
mbed_official 340:28d1f895c6fe 464 ADC_CFGR1_CONT |
mbed_official 340:28d1f895c6fe 465 ADC_CFGR1_OVRMOD |
mbed_official 340:28d1f895c6fe 466 ADC_CFGR1_EXTSEL |
mbed_official 340:28d1f895c6fe 467 ADC_CFGR1_EXTEN |
mbed_official 340:28d1f895c6fe 468 ADC_CFGR1_ALIGN |
mbed_official 340:28d1f895c6fe 469 ADC_CFGR1_SCANDIR |
mbed_official 340:28d1f895c6fe 470 ADC_CFGR1_DMACFG );
mbed_official 340:28d1f895c6fe 471
mbed_official 630:825f75ca301e 472 tmpCFGR1 |= (ADC_CFGR1_AUTOWAIT(hadc->Init.LowPowerAutoWait) |
mbed_official 630:825f75ca301e 473 ADC_CFGR1_AUTOOFF(hadc->Init.LowPowerAutoPowerOff) |
mbed_official 630:825f75ca301e 474 ADC_CFGR1_CONTINUOUS(hadc->Init.ContinuousConvMode) |
mbed_official 630:825f75ca301e 475 ADC_CFGR1_OVERRUN(hadc->Init.Overrun) |
mbed_official 630:825f75ca301e 476 hadc->Init.DataAlign |
mbed_official 630:825f75ca301e 477 ADC_SCANDIR(hadc->Init.ScanConvMode) |
mbed_official 630:825f75ca301e 478 ADC_CFGR1_DMACONTREQ(hadc->Init.DMAContinuousRequests) );
mbed_official 340:28d1f895c6fe 479
mbed_official 340:28d1f895c6fe 480 /* Enable discontinuous mode only if continuous mode is disabled */
mbed_official 340:28d1f895c6fe 481 if ((hadc->Init.DiscontinuousConvMode == ENABLE) &&
mbed_official 340:28d1f895c6fe 482 (hadc->Init.ContinuousConvMode == DISABLE) )
mbed_official 340:28d1f895c6fe 483 {
mbed_official 340:28d1f895c6fe 484 /* Enable discontinuous mode of regular group */
mbed_official 340:28d1f895c6fe 485 tmpCFGR1 |= ADC_CFGR1_DISCEN;
mbed_official 340:28d1f895c6fe 486 }
mbed_official 340:28d1f895c6fe 487
mbed_official 340:28d1f895c6fe 488 /* Enable external trigger if trigger selection is different of software */
mbed_official 340:28d1f895c6fe 489 /* start. */
mbed_official 630:825f75ca301e 490 /* Note: This configuration keeps the hardware feature of parameter */
mbed_official 340:28d1f895c6fe 491 /* ExternalTrigConvEdge "trigger edge none" equivalent to */
mbed_official 340:28d1f895c6fe 492 /* software start. */
mbed_official 340:28d1f895c6fe 493 if (hadc->Init.ExternalTrigConv != ADC_SOFTWARE_START)
mbed_official 340:28d1f895c6fe 494 {
mbed_official 340:28d1f895c6fe 495 tmpCFGR1 |= ( hadc->Init.ExternalTrigConv |
mbed_official 340:28d1f895c6fe 496 hadc->Init.ExternalTrigConvEdge );
mbed_official 340:28d1f895c6fe 497 }
mbed_official 340:28d1f895c6fe 498
mbed_official 340:28d1f895c6fe 499 /* Update ADC configuration register with previous settings */
mbed_official 340:28d1f895c6fe 500 hadc->Instance->CFGR1 |= tmpCFGR1;
mbed_official 340:28d1f895c6fe 501
mbed_official 630:825f75ca301e 502 /* Channel sampling time configuration */
mbed_official 630:825f75ca301e 503 /* Management of parameters "SamplingTimeCommon" and "SamplingTime" */
mbed_official 630:825f75ca301e 504 /* (obsolete): sampling time set in this function if parameter */
mbed_official 630:825f75ca301e 505 /* "SamplingTimeCommon" has been set to a valid sampling time. */
mbed_official 630:825f75ca301e 506 /* Otherwise, sampling time is set into ADC channel initialization */
mbed_official 630:825f75ca301e 507 /* structure with parameter "SamplingTime" (obsolete). */
mbed_official 630:825f75ca301e 508 if (IS_ADC_SAMPLE_TIME(hadc->Init.SamplingTimeCommon))
mbed_official 630:825f75ca301e 509 {
mbed_official 630:825f75ca301e 510 /* Channel sampling time configuration */
mbed_official 630:825f75ca301e 511 /* Clear the old sample time */
mbed_official 630:825f75ca301e 512 hadc->Instance->SMPR &= ~(ADC_SMPR_SMP);
mbed_official 630:825f75ca301e 513
mbed_official 630:825f75ca301e 514 /* Set the new sample time */
mbed_official 630:825f75ca301e 515 hadc->Instance->SMPR |= ADC_SMPR_SET(hadc->Init.SamplingTimeCommon);
mbed_official 630:825f75ca301e 516 }
mbed_official 630:825f75ca301e 517
mbed_official 340:28d1f895c6fe 518 /* Check back that ADC registers have effectively been configured to */
mbed_official 340:28d1f895c6fe 519 /* ensure of no potential problem of ADC core IP clocking. */
mbed_official 340:28d1f895c6fe 520 /* Check through register CFGR1 (excluding analog watchdog configuration: */
mbed_official 630:825f75ca301e 521 /* set into separate dedicated function, and bits of ADC resolution set */
mbed_official 630:825f75ca301e 522 /* out of temporary variable 'tmpCFGR1'). */
mbed_official 630:825f75ca301e 523 if ((hadc->Instance->CFGR1 & ~(ADC_CFGR1_AWDCH | ADC_CFGR1_AWDEN | ADC_CFGR1_AWDSGL | ADC_CFGR1_RES))
mbed_official 340:28d1f895c6fe 524 == tmpCFGR1)
mbed_official 340:28d1f895c6fe 525 {
mbed_official 340:28d1f895c6fe 526 /* Set ADC error code to none */
mbed_official 630:825f75ca301e 527 ADC_CLEAR_ERRORCODE(hadc);
mbed_official 340:28d1f895c6fe 528
mbed_official 630:825f75ca301e 529 /* Set the ADC state */
mbed_official 630:825f75ca301e 530 ADC_STATE_CLR_SET(hadc->State,
mbed_official 630:825f75ca301e 531 HAL_ADC_STATE_BUSY_INTERNAL,
mbed_official 630:825f75ca301e 532 HAL_ADC_STATE_READY);
mbed_official 340:28d1f895c6fe 533 }
mbed_official 340:28d1f895c6fe 534 else
mbed_official 340:28d1f895c6fe 535 {
mbed_official 340:28d1f895c6fe 536 /* Update ADC state machine to error */
mbed_official 630:825f75ca301e 537 ADC_STATE_CLR_SET(hadc->State,
mbed_official 630:825f75ca301e 538 HAL_ADC_STATE_BUSY_INTERNAL,
mbed_official 630:825f75ca301e 539 HAL_ADC_STATE_ERROR_INTERNAL);
mbed_official 340:28d1f895c6fe 540
mbed_official 340:28d1f895c6fe 541 /* Set ADC error code to ADC IP internal error */
mbed_official 630:825f75ca301e 542 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
mbed_official 340:28d1f895c6fe 543
mbed_official 630:825f75ca301e 544 tmp_hal_status = HAL_ERROR;
mbed_official 340:28d1f895c6fe 545 }
mbed_official 340:28d1f895c6fe 546
mbed_official 340:28d1f895c6fe 547 }
mbed_official 340:28d1f895c6fe 548 else
mbed_official 340:28d1f895c6fe 549 {
mbed_official 340:28d1f895c6fe 550 /* Update ADC state machine to error */
mbed_official 630:825f75ca301e 551 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
mbed_official 340:28d1f895c6fe 552
mbed_official 630:825f75ca301e 553 tmp_hal_status = HAL_ERROR;
mbed_official 340:28d1f895c6fe 554 }
mbed_official 340:28d1f895c6fe 555
mbed_official 340:28d1f895c6fe 556 /* Return function status */
mbed_official 630:825f75ca301e 557 return tmp_hal_status;
mbed_official 340:28d1f895c6fe 558 }
mbed_official 340:28d1f895c6fe 559
mbed_official 340:28d1f895c6fe 560
mbed_official 340:28d1f895c6fe 561 /**
mbed_official 340:28d1f895c6fe 562 * @brief Deinitialize the ADC peripheral registers to their default reset
mbed_official 340:28d1f895c6fe 563 * values, with deinitialization of the ADC MSP.
mbed_official 340:28d1f895c6fe 564 * @note For devices with several ADCs: reset of ADC common registers is done
mbed_official 340:28d1f895c6fe 565 * only if all ADCs sharing the same common group are disabled.
mbed_official 340:28d1f895c6fe 566 * If this is not the case, reset of these common parameters reset is
mbed_official 340:28d1f895c6fe 567 * bypassed without error reporting: it can be the intended behaviour in
mbed_official 340:28d1f895c6fe 568 * case of reset of a single ADC while the other ADCs sharing the same
mbed_official 340:28d1f895c6fe 569 * common group is still running.
mbed_official 340:28d1f895c6fe 570 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 571 * @retval HAL status
mbed_official 340:28d1f895c6fe 572 */
mbed_official 340:28d1f895c6fe 573 HAL_StatusTypeDef HAL_ADC_DeInit(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 574 {
mbed_official 630:825f75ca301e 575 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
mbed_official 340:28d1f895c6fe 576
mbed_official 340:28d1f895c6fe 577 /* Check ADC handle */
mbed_official 441:d2c15dda23c1 578 if(hadc == NULL)
mbed_official 340:28d1f895c6fe 579 {
mbed_official 340:28d1f895c6fe 580 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 581 }
mbed_official 340:28d1f895c6fe 582
mbed_official 340:28d1f895c6fe 583 /* Check the parameters */
mbed_official 340:28d1f895c6fe 584 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 585
mbed_official 630:825f75ca301e 586 /* Set ADC state */
mbed_official 630:825f75ca301e 587 SET_BIT(hadc->State, HAL_ADC_STATE_BUSY_INTERNAL);
mbed_official 340:28d1f895c6fe 588
mbed_official 340:28d1f895c6fe 589 /* Stop potential conversion on going, on regular group */
mbed_official 630:825f75ca301e 590 tmp_hal_status = ADC_ConversionStop(hadc);
mbed_official 340:28d1f895c6fe 591
mbed_official 340:28d1f895c6fe 592 /* Disable ADC peripheral if conversions are effectively stopped */
mbed_official 630:825f75ca301e 593 if (tmp_hal_status == HAL_OK)
mbed_official 340:28d1f895c6fe 594 {
mbed_official 340:28d1f895c6fe 595 /* Disable the ADC peripheral */
mbed_official 630:825f75ca301e 596 tmp_hal_status = ADC_Disable(hadc);
mbed_official 340:28d1f895c6fe 597
mbed_official 340:28d1f895c6fe 598 /* Check if ADC is effectively disabled */
mbed_official 630:825f75ca301e 599 if (tmp_hal_status != HAL_ERROR)
mbed_official 340:28d1f895c6fe 600 {
mbed_official 340:28d1f895c6fe 601 /* Change ADC state */
mbed_official 340:28d1f895c6fe 602 hadc->State = HAL_ADC_STATE_READY;
mbed_official 340:28d1f895c6fe 603 }
mbed_official 340:28d1f895c6fe 604 }
mbed_official 340:28d1f895c6fe 605
mbed_official 340:28d1f895c6fe 606
mbed_official 340:28d1f895c6fe 607 /* Configuration of ADC parameters if previous preliminary actions are */
mbed_official 340:28d1f895c6fe 608 /* correctly completed. */
mbed_official 630:825f75ca301e 609 if (tmp_hal_status != HAL_ERROR)
mbed_official 340:28d1f895c6fe 610 {
mbed_official 340:28d1f895c6fe 611
mbed_official 340:28d1f895c6fe 612 /* ========== Reset ADC registers ========== */
mbed_official 340:28d1f895c6fe 613 /* Reset register IER */
mbed_official 340:28d1f895c6fe 614 __HAL_ADC_DISABLE_IT(hadc, (ADC_IT_AWD | ADC_IT_OVR |
mbed_official 340:28d1f895c6fe 615 ADC_IT_EOS | ADC_IT_EOC |
mbed_official 340:28d1f895c6fe 616 ADC_IT_EOSMP | ADC_IT_RDY ) );
mbed_official 340:28d1f895c6fe 617
mbed_official 340:28d1f895c6fe 618 /* Reset register ISR */
mbed_official 340:28d1f895c6fe 619 __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_AWD | ADC_FLAG_OVR |
mbed_official 340:28d1f895c6fe 620 ADC_FLAG_EOS | ADC_FLAG_EOC |
mbed_official 340:28d1f895c6fe 621 ADC_FLAG_EOSMP | ADC_FLAG_RDY ) );
mbed_official 340:28d1f895c6fe 622
mbed_official 340:28d1f895c6fe 623 /* Reset register CR */
mbed_official 340:28d1f895c6fe 624 /* Bits ADC_CR_ADCAL, ADC_CR_ADSTP, ADC_CR_ADSTART are in access mode */
mbed_official 340:28d1f895c6fe 625 /* "read-set": no direct reset applicable. */
mbed_official 340:28d1f895c6fe 626
mbed_official 340:28d1f895c6fe 627 /* Reset register CFGR1 */
mbed_official 340:28d1f895c6fe 628 hadc->Instance->CFGR1 &= ~(ADC_CFGR1_AWDCH | ADC_CFGR1_AWDEN | ADC_CFGR1_AWDSGL | ADC_CFGR1_DISCEN |
mbed_official 340:28d1f895c6fe 629 ADC_CFGR1_AUTOFF | ADC_CFGR1_WAIT | ADC_CFGR1_CONT | ADC_CFGR1_OVRMOD |
mbed_official 340:28d1f895c6fe 630 ADC_CFGR1_EXTEN | ADC_CFGR1_EXTSEL | ADC_CFGR1_ALIGN | ADC_CFGR1_RES |
mbed_official 340:28d1f895c6fe 631 ADC_CFGR1_SCANDIR | ADC_CFGR1_DMACFG | ADC_CFGR1_DMAEN );
mbed_official 340:28d1f895c6fe 632
mbed_official 340:28d1f895c6fe 633 /* Reset register CFGR2 */
mbed_official 630:825f75ca301e 634 /* Note: Update of ADC clock mode is conditioned to ADC state disabled: */
mbed_official 340:28d1f895c6fe 635 /* already done above. */
mbed_official 340:28d1f895c6fe 636 hadc->Instance->CFGR2 &= ~ADC_CFGR2_CKMODE;
mbed_official 340:28d1f895c6fe 637
mbed_official 340:28d1f895c6fe 638 /* Reset register SMPR */
mbed_official 340:28d1f895c6fe 639 hadc->Instance->SMPR &= ~ADC_SMPR_SMP;
mbed_official 340:28d1f895c6fe 640
mbed_official 340:28d1f895c6fe 641 /* Reset register TR1 */
mbed_official 340:28d1f895c6fe 642 hadc->Instance->TR &= ~(ADC_TR_HT | ADC_TR_LT);
mbed_official 340:28d1f895c6fe 643
mbed_official 340:28d1f895c6fe 644 /* Reset register CHSELR */
mbed_official 340:28d1f895c6fe 645 hadc->Instance->CHSELR &= ~(ADC_CHSELR_CHSEL18 | ADC_CHSELR_CHSEL17 | ADC_CHSELR_CHSEL16 |
mbed_official 340:28d1f895c6fe 646 ADC_CHSELR_CHSEL15 | ADC_CHSELR_CHSEL14 | ADC_CHSELR_CHSEL13 | ADC_CHSELR_CHSEL12 |
mbed_official 340:28d1f895c6fe 647 ADC_CHSELR_CHSEL11 | ADC_CHSELR_CHSEL10 | ADC_CHSELR_CHSEL9 | ADC_CHSELR_CHSEL8 |
mbed_official 340:28d1f895c6fe 648 ADC_CHSELR_CHSEL7 | ADC_CHSELR_CHSEL6 | ADC_CHSELR_CHSEL5 | ADC_CHSELR_CHSEL4 |
mbed_official 340:28d1f895c6fe 649 ADC_CHSELR_CHSEL3 | ADC_CHSELR_CHSEL2 | ADC_CHSELR_CHSEL1 | ADC_CHSELR_CHSEL0 );
mbed_official 340:28d1f895c6fe 650
mbed_official 340:28d1f895c6fe 651 /* Reset register DR */
mbed_official 340:28d1f895c6fe 652 /* bits in access mode read only, no direct reset applicable*/
mbed_official 340:28d1f895c6fe 653
mbed_official 340:28d1f895c6fe 654 /* Reset register CCR */
mbed_official 630:825f75ca301e 655 ADC->CCR &= ~(ADC_CCR_ALL);
mbed_official 340:28d1f895c6fe 656
mbed_official 340:28d1f895c6fe 657 /* ========== Hard reset ADC peripheral ========== */
mbed_official 340:28d1f895c6fe 658 /* Performs a global reset of the entire ADC peripheral: ADC state is */
mbed_official 340:28d1f895c6fe 659 /* forced to a similar state after device power-on. */
mbed_official 340:28d1f895c6fe 660 /* If needed, copy-paste and uncomment the following reset code into */
mbed_official 340:28d1f895c6fe 661 /* function "void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)": */
mbed_official 340:28d1f895c6fe 662 /* */
mbed_official 630:825f75ca301e 663 /* __HAL_RCC_ADC1_FORCE_RESET() */
mbed_official 630:825f75ca301e 664 /* __HAL_RCC_ADC1_RELEASE_RESET() */
mbed_official 340:28d1f895c6fe 665
mbed_official 340:28d1f895c6fe 666 /* DeInit the low level hardware */
mbed_official 340:28d1f895c6fe 667 HAL_ADC_MspDeInit(hadc);
mbed_official 340:28d1f895c6fe 668
mbed_official 340:28d1f895c6fe 669 /* Set ADC error code to none */
mbed_official 630:825f75ca301e 670 ADC_CLEAR_ERRORCODE(hadc);
mbed_official 340:28d1f895c6fe 671
mbed_official 630:825f75ca301e 672 /* Set ADC state */
mbed_official 340:28d1f895c6fe 673 hadc->State = HAL_ADC_STATE_RESET;
mbed_official 340:28d1f895c6fe 674 }
mbed_official 340:28d1f895c6fe 675
mbed_official 340:28d1f895c6fe 676 /* Process unlocked */
mbed_official 340:28d1f895c6fe 677 __HAL_UNLOCK(hadc);
mbed_official 340:28d1f895c6fe 678
mbed_official 340:28d1f895c6fe 679 /* Return function status */
mbed_official 630:825f75ca301e 680 return tmp_hal_status;
mbed_official 340:28d1f895c6fe 681 }
mbed_official 340:28d1f895c6fe 682
mbed_official 340:28d1f895c6fe 683
mbed_official 340:28d1f895c6fe 684 /**
mbed_official 340:28d1f895c6fe 685 * @brief Initializes the ADC MSP.
mbed_official 340:28d1f895c6fe 686 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 687 * @retval None
mbed_official 340:28d1f895c6fe 688 */
mbed_official 340:28d1f895c6fe 689 __weak void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 690 {
mbed_official 340:28d1f895c6fe 691 /* NOTE : This function should not be modified. When the callback is needed,
mbed_official 340:28d1f895c6fe 692 function HAL_ADC_MspInit must be implemented in the user file.
mbed_official 340:28d1f895c6fe 693 */
mbed_official 340:28d1f895c6fe 694 }
mbed_official 340:28d1f895c6fe 695
mbed_official 340:28d1f895c6fe 696 /**
mbed_official 340:28d1f895c6fe 697 * @brief DeInitializes the ADC MSP.
mbed_official 340:28d1f895c6fe 698 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 699 * @retval None
mbed_official 340:28d1f895c6fe 700 */
mbed_official 340:28d1f895c6fe 701 __weak void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 702 {
mbed_official 340:28d1f895c6fe 703 /* NOTE : This function should not be modified. When the callback is needed,
mbed_official 340:28d1f895c6fe 704 function HAL_ADC_MspDeInit must be implemented in the user file.
mbed_official 340:28d1f895c6fe 705 */
mbed_official 340:28d1f895c6fe 706 }
mbed_official 340:28d1f895c6fe 707
mbed_official 340:28d1f895c6fe 708 /**
mbed_official 340:28d1f895c6fe 709 * @}
mbed_official 340:28d1f895c6fe 710 */
mbed_official 340:28d1f895c6fe 711
mbed_official 340:28d1f895c6fe 712 /** @defgroup ADC_Exported_Functions_Group2 IO operation functions
mbed_official 340:28d1f895c6fe 713 * @brief IO operation functions
mbed_official 340:28d1f895c6fe 714 *
mbed_official 340:28d1f895c6fe 715 @verbatim
mbed_official 340:28d1f895c6fe 716 ===============================================================================
mbed_official 340:28d1f895c6fe 717 ##### IO operation functions #####
mbed_official 340:28d1f895c6fe 718 ===============================================================================
mbed_official 340:28d1f895c6fe 719 [..] This section provides functions allowing to:
mbed_official 340:28d1f895c6fe 720 (+) Start conversion of regular group.
mbed_official 340:28d1f895c6fe 721 (+) Stop conversion of regular group.
mbed_official 340:28d1f895c6fe 722 (+) Poll for conversion complete on regular group.
mbed_official 340:28d1f895c6fe 723 (+) Poll for conversion event.
mbed_official 340:28d1f895c6fe 724 (+) Get result of regular channel conversion.
mbed_official 340:28d1f895c6fe 725 (+) Start conversion of regular group and enable interruptions.
mbed_official 340:28d1f895c6fe 726 (+) Stop conversion of regular group and disable interruptions.
mbed_official 340:28d1f895c6fe 727 (+) Handle ADC interrupt request
mbed_official 340:28d1f895c6fe 728 (+) Start conversion of regular group and enable DMA transfer.
mbed_official 340:28d1f895c6fe 729 (+) Stop conversion of regular group and disable ADC DMA transfer.
mbed_official 340:28d1f895c6fe 730 @endverbatim
mbed_official 340:28d1f895c6fe 731 * @{
mbed_official 340:28d1f895c6fe 732 */
mbed_official 340:28d1f895c6fe 733
mbed_official 340:28d1f895c6fe 734 /**
mbed_official 340:28d1f895c6fe 735 * @brief Enables ADC, starts conversion of regular group.
mbed_official 340:28d1f895c6fe 736 * Interruptions enabled in this function: None.
mbed_official 340:28d1f895c6fe 737 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 738 * @retval HAL status
mbed_official 340:28d1f895c6fe 739 */
mbed_official 340:28d1f895c6fe 740 HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 741 {
mbed_official 630:825f75ca301e 742 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
mbed_official 340:28d1f895c6fe 743
mbed_official 340:28d1f895c6fe 744 /* Check the parameters */
mbed_official 340:28d1f895c6fe 745 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 441:d2c15dda23c1 746
mbed_official 441:d2c15dda23c1 747 /* Perform ADC enable and conversion start if no conversion is on going */
mbed_official 630:825f75ca301e 748 if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) == RESET)
mbed_official 340:28d1f895c6fe 749 {
mbed_official 441:d2c15dda23c1 750 /* Process locked */
mbed_official 441:d2c15dda23c1 751 __HAL_LOCK(hadc);
mbed_official 441:d2c15dda23c1 752
mbed_official 441:d2c15dda23c1 753 /* Enable the ADC peripheral */
mbed_official 441:d2c15dda23c1 754 /* If low power mode AutoPowerOff is enabled, power-on/off phases are */
mbed_official 441:d2c15dda23c1 755 /* performed automatically by hardware. */
mbed_official 441:d2c15dda23c1 756 if (hadc->Init.LowPowerAutoPowerOff != ENABLE)
mbed_official 441:d2c15dda23c1 757 {
mbed_official 630:825f75ca301e 758 tmp_hal_status = ADC_Enable(hadc);
mbed_official 441:d2c15dda23c1 759 }
mbed_official 340:28d1f895c6fe 760
mbed_official 441:d2c15dda23c1 761 /* Start conversion if ADC is effectively enabled */
mbed_official 630:825f75ca301e 762 if (tmp_hal_status == HAL_OK)
mbed_official 441:d2c15dda23c1 763 {
mbed_official 630:825f75ca301e 764 /* Set ADC state */
mbed_official 630:825f75ca301e 765 /* - Clear state bitfield related to regular group conversion results */
mbed_official 630:825f75ca301e 766 /* - Set state bitfield related to regular operation */
mbed_official 630:825f75ca301e 767 ADC_STATE_CLR_SET(hadc->State,
mbed_official 630:825f75ca301e 768 HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR | HAL_ADC_STATE_REG_EOSMP,
mbed_official 630:825f75ca301e 769 HAL_ADC_STATE_REG_BUSY);
mbed_official 630:825f75ca301e 770
mbed_official 630:825f75ca301e 771 /* Reset ADC all error code fields */
mbed_official 630:825f75ca301e 772 ADC_CLEAR_ERRORCODE(hadc);
mbed_official 630:825f75ca301e 773
mbed_official 630:825f75ca301e 774 /* Process unlocked */
mbed_official 630:825f75ca301e 775 /* Unlock before starting ADC conversions: in case of potential */
mbed_official 630:825f75ca301e 776 /* interruption, to let the process to ADC IRQ Handler. */
mbed_official 630:825f75ca301e 777 __HAL_UNLOCK(hadc);
mbed_official 441:d2c15dda23c1 778
mbed_official 441:d2c15dda23c1 779 /* Clear regular group conversion flag and overrun flag */
mbed_official 441:d2c15dda23c1 780 /* (To ensure of no unknown state from potential previous ADC */
mbed_official 441:d2c15dda23c1 781 /* operations) */
mbed_official 441:d2c15dda23c1 782 __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS | ADC_FLAG_OVR));
mbed_official 441:d2c15dda23c1 783
mbed_official 441:d2c15dda23c1 784 /* Enable conversion of regular group. */
mbed_official 441:d2c15dda23c1 785 /* If software start has been selected, conversion starts immediately. */
mbed_official 441:d2c15dda23c1 786 /* If external trigger has been selected, conversion will start at next */
mbed_official 441:d2c15dda23c1 787 /* trigger event. */
mbed_official 441:d2c15dda23c1 788 hadc->Instance->CR |= ADC_CR_ADSTART;
mbed_official 441:d2c15dda23c1 789 }
mbed_official 340:28d1f895c6fe 790 }
mbed_official 441:d2c15dda23c1 791 else
mbed_official 441:d2c15dda23c1 792 {
mbed_official 630:825f75ca301e 793 tmp_hal_status = HAL_BUSY;
mbed_official 441:d2c15dda23c1 794 }
mbed_official 340:28d1f895c6fe 795
mbed_official 340:28d1f895c6fe 796 /* Return function status */
mbed_official 630:825f75ca301e 797 return tmp_hal_status;
mbed_official 340:28d1f895c6fe 798 }
mbed_official 340:28d1f895c6fe 799
mbed_official 340:28d1f895c6fe 800 /**
mbed_official 340:28d1f895c6fe 801 * @brief Stop ADC conversion of regular group, disable ADC peripheral.
mbed_official 340:28d1f895c6fe 802 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 803 * @retval HAL status.
mbed_official 340:28d1f895c6fe 804 */
mbed_official 340:28d1f895c6fe 805 HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 806 {
mbed_official 630:825f75ca301e 807 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
mbed_official 340:28d1f895c6fe 808
mbed_official 340:28d1f895c6fe 809 /* Check the parameters */
mbed_official 340:28d1f895c6fe 810 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 811
mbed_official 340:28d1f895c6fe 812 /* Process locked */
mbed_official 340:28d1f895c6fe 813 __HAL_LOCK(hadc);
mbed_official 340:28d1f895c6fe 814
mbed_official 340:28d1f895c6fe 815 /* 1. Stop potential conversion on going, on regular group */
mbed_official 630:825f75ca301e 816 tmp_hal_status = ADC_ConversionStop(hadc);
mbed_official 340:28d1f895c6fe 817
mbed_official 340:28d1f895c6fe 818 /* Disable ADC peripheral if conversions are effectively stopped */
mbed_official 630:825f75ca301e 819 if (tmp_hal_status == HAL_OK)
mbed_official 340:28d1f895c6fe 820 {
mbed_official 340:28d1f895c6fe 821 /* 2. Disable the ADC peripheral */
mbed_official 630:825f75ca301e 822 tmp_hal_status = ADC_Disable(hadc);
mbed_official 340:28d1f895c6fe 823
mbed_official 340:28d1f895c6fe 824 /* Check if ADC is effectively disabled */
mbed_official 630:825f75ca301e 825 if (tmp_hal_status == HAL_OK)
mbed_official 340:28d1f895c6fe 826 {
mbed_official 630:825f75ca301e 827 /* Set ADC state */
mbed_official 630:825f75ca301e 828 ADC_STATE_CLR_SET(hadc->State,
mbed_official 630:825f75ca301e 829 HAL_ADC_STATE_REG_BUSY,
mbed_official 630:825f75ca301e 830 HAL_ADC_STATE_READY);
mbed_official 340:28d1f895c6fe 831 }
mbed_official 340:28d1f895c6fe 832 }
mbed_official 340:28d1f895c6fe 833
mbed_official 340:28d1f895c6fe 834 /* Process unlocked */
mbed_official 340:28d1f895c6fe 835 __HAL_UNLOCK(hadc);
mbed_official 340:28d1f895c6fe 836
mbed_official 340:28d1f895c6fe 837 /* Return function status */
mbed_official 630:825f75ca301e 838 return tmp_hal_status;
mbed_official 340:28d1f895c6fe 839 }
mbed_official 340:28d1f895c6fe 840
mbed_official 340:28d1f895c6fe 841 /**
mbed_official 340:28d1f895c6fe 842 * @brief Wait for regular group conversion to be completed.
mbed_official 630:825f75ca301e 843 * @note ADC conversion flags EOS (end of sequence) and EOC (end of
mbed_official 630:825f75ca301e 844 * conversion) are cleared by this function, with an exception:
mbed_official 630:825f75ca301e 845 * if low power feature "LowPowerAutoWait" is enabled, flags are
mbed_official 630:825f75ca301e 846 * not cleared to not interfere with this feature until data register
mbed_official 630:825f75ca301e 847 * is read using function HAL_ADC_GetValue().
mbed_official 630:825f75ca301e 848 * @note This function cannot be used in a particular setup: ADC configured
mbed_official 630:825f75ca301e 849 * in DMA mode and polling for end of each conversion (ADC init
mbed_official 630:825f75ca301e 850 * parameter "EOCSelection" set to ADC_EOC_SINGLE_CONV).
mbed_official 630:825f75ca301e 851 * In this case, DMA resets the flag EOC and polling cannot be
mbed_official 630:825f75ca301e 852 * performed on each conversion. Nevertheless, polling can still
mbed_official 630:825f75ca301e 853 * be performed on the complete sequence (ADC init
mbed_official 630:825f75ca301e 854 * parameter "EOCSelection" set to ADC_EOC_SEQ_CONV).
mbed_official 340:28d1f895c6fe 855 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 856 * @param Timeout: Timeout value in millisecond.
mbed_official 340:28d1f895c6fe 857 * @retval HAL status
mbed_official 340:28d1f895c6fe 858 */
mbed_official 340:28d1f895c6fe 859 HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout)
mbed_official 340:28d1f895c6fe 860 {
mbed_official 340:28d1f895c6fe 861 uint32_t tickstart;
mbed_official 340:28d1f895c6fe 862 uint32_t tmp_Flag_EOC;
mbed_official 340:28d1f895c6fe 863
mbed_official 340:28d1f895c6fe 864 /* Check the parameters */
mbed_official 340:28d1f895c6fe 865 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 866
mbed_official 340:28d1f895c6fe 867 /* If end of conversion selected to end of sequence */
mbed_official 630:825f75ca301e 868 if (hadc->Init.EOCSelection == ADC_EOC_SEQ_CONV)
mbed_official 340:28d1f895c6fe 869 {
mbed_official 340:28d1f895c6fe 870 tmp_Flag_EOC = ADC_FLAG_EOS;
mbed_official 340:28d1f895c6fe 871 }
mbed_official 340:28d1f895c6fe 872 /* If end of conversion selected to end of each conversion */
mbed_official 630:825f75ca301e 873 else /* ADC_EOC_SINGLE_CONV */
mbed_official 340:28d1f895c6fe 874 {
mbed_official 630:825f75ca301e 875 /* Verification that ADC configuration is compliant with polling for */
mbed_official 630:825f75ca301e 876 /* each conversion: */
mbed_official 630:825f75ca301e 877 /* Particular case is ADC configured in DMA mode and ADC sequencer with */
mbed_official 630:825f75ca301e 878 /* several ranks and polling for end of each conversion. */
mbed_official 630:825f75ca301e 879 /* For code simplicity sake, this particular case is generalized to */
mbed_official 630:825f75ca301e 880 /* ADC configured in DMA mode and and polling for end of each conversion. */
mbed_official 630:825f75ca301e 881 if (HAL_IS_BIT_SET(hadc->Instance->CFGR1, ADC_CFGR1_DMAEN))
mbed_official 630:825f75ca301e 882 {
mbed_official 630:825f75ca301e 883 /* Update ADC state machine to error */
mbed_official 630:825f75ca301e 884 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
mbed_official 630:825f75ca301e 885
mbed_official 630:825f75ca301e 886 /* Process unlocked */
mbed_official 630:825f75ca301e 887 __HAL_UNLOCK(hadc);
mbed_official 630:825f75ca301e 888
mbed_official 630:825f75ca301e 889 return HAL_ERROR;
mbed_official 630:825f75ca301e 890 }
mbed_official 630:825f75ca301e 891 else
mbed_official 630:825f75ca301e 892 {
mbed_official 630:825f75ca301e 893 tmp_Flag_EOC = (ADC_FLAG_EOC | ADC_FLAG_EOS);
mbed_official 630:825f75ca301e 894 }
mbed_official 340:28d1f895c6fe 895 }
mbed_official 630:825f75ca301e 896
mbed_official 630:825f75ca301e 897 /* Get tick count */
mbed_official 630:825f75ca301e 898 tickstart = HAL_GetTick();
mbed_official 630:825f75ca301e 899
mbed_official 340:28d1f895c6fe 900 /* Wait until End of Conversion flag is raised */
mbed_official 340:28d1f895c6fe 901 while(HAL_IS_BIT_CLR(hadc->Instance->ISR, tmp_Flag_EOC))
mbed_official 340:28d1f895c6fe 902 {
mbed_official 340:28d1f895c6fe 903 /* Check if timeout is disabled (set to infinite wait) */
mbed_official 340:28d1f895c6fe 904 if(Timeout != HAL_MAX_DELAY)
mbed_official 340:28d1f895c6fe 905 {
mbed_official 340:28d1f895c6fe 906 if((Timeout == 0) || ((HAL_GetTick()-tickstart) > Timeout))
mbed_official 340:28d1f895c6fe 907 {
mbed_official 340:28d1f895c6fe 908 /* Update ADC state machine to timeout */
mbed_official 630:825f75ca301e 909 SET_BIT(hadc->State, HAL_ADC_STATE_TIMEOUT);
mbed_official 340:28d1f895c6fe 910
mbed_official 340:28d1f895c6fe 911 /* Process unlocked */
mbed_official 340:28d1f895c6fe 912 __HAL_UNLOCK(hadc);
mbed_official 340:28d1f895c6fe 913
mbed_official 630:825f75ca301e 914 return HAL_TIMEOUT;
mbed_official 630:825f75ca301e 915 }
mbed_official 630:825f75ca301e 916 }
mbed_official 630:825f75ca301e 917 }
mbed_official 630:825f75ca301e 918
mbed_official 630:825f75ca301e 919 /* Update ADC state machine */
mbed_official 630:825f75ca301e 920 SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
mbed_official 630:825f75ca301e 921
mbed_official 630:825f75ca301e 922 /* Determine whether any further conversion upcoming on group regular */
mbed_official 630:825f75ca301e 923 /* by external trigger, continuous mode or scan sequence on going. */
mbed_official 630:825f75ca301e 924 if(ADC_IS_SOFTWARE_START_REGULAR(hadc) &&
mbed_official 630:825f75ca301e 925 (hadc->Init.ContinuousConvMode == DISABLE) )
mbed_official 630:825f75ca301e 926 {
mbed_official 630:825f75ca301e 927 /* If End of Sequence is reached, disable interrupts */
mbed_official 630:825f75ca301e 928 if( __HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOS) )
mbed_official 630:825f75ca301e 929 {
mbed_official 630:825f75ca301e 930 /* Allowed to modify bits ADC_IT_EOC/ADC_IT_EOS only if bit */
mbed_official 630:825f75ca301e 931 /* ADSTART==0 (no conversion on going) */
mbed_official 630:825f75ca301e 932 if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) == RESET)
mbed_official 630:825f75ca301e 933 {
mbed_official 630:825f75ca301e 934 /* Disable ADC end of single conversion interrupt on group regular */
mbed_official 630:825f75ca301e 935 /* Note: Overrun interrupt was enabled with EOC interrupt in */
mbed_official 630:825f75ca301e 936 /* HAL_Start_IT(), but is not disabled here because can be used */
mbed_official 630:825f75ca301e 937 /* by overrun IRQ process below. */
mbed_official 630:825f75ca301e 938 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC | ADC_IT_EOS);
mbed_official 630:825f75ca301e 939
mbed_official 630:825f75ca301e 940 /* Set ADC state */
mbed_official 630:825f75ca301e 941 ADC_STATE_CLR_SET(hadc->State,
mbed_official 630:825f75ca301e 942 HAL_ADC_STATE_REG_BUSY,
mbed_official 630:825f75ca301e 943 HAL_ADC_STATE_READY);
mbed_official 630:825f75ca301e 944 }
mbed_official 630:825f75ca301e 945 else
mbed_official 630:825f75ca301e 946 {
mbed_official 630:825f75ca301e 947 /* Change ADC state to error state */
mbed_official 630:825f75ca301e 948 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
mbed_official 630:825f75ca301e 949
mbed_official 630:825f75ca301e 950 /* Set ADC error code to ADC IP internal error */
mbed_official 630:825f75ca301e 951 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
mbed_official 340:28d1f895c6fe 952 }
mbed_official 340:28d1f895c6fe 953 }
mbed_official 340:28d1f895c6fe 954 }
mbed_official 340:28d1f895c6fe 955
mbed_official 340:28d1f895c6fe 956 /* Clear end of conversion flag of regular group if low power feature */
mbed_official 340:28d1f895c6fe 957 /* "LowPowerAutoWait " is disabled, to not interfere with this feature */
mbed_official 340:28d1f895c6fe 958 /* until data register is read using function HAL_ADC_GetValue(). */
mbed_official 340:28d1f895c6fe 959 if (hadc->Init.LowPowerAutoWait == DISABLE)
mbed_official 340:28d1f895c6fe 960 {
mbed_official 340:28d1f895c6fe 961 /* Clear regular group conversion flag */
mbed_official 340:28d1f895c6fe 962 __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS));
mbed_official 340:28d1f895c6fe 963 }
mbed_official 340:28d1f895c6fe 964
mbed_official 340:28d1f895c6fe 965 /* Return ADC state */
mbed_official 340:28d1f895c6fe 966 return HAL_OK;
mbed_official 340:28d1f895c6fe 967 }
mbed_official 340:28d1f895c6fe 968
mbed_official 340:28d1f895c6fe 969 /**
mbed_official 340:28d1f895c6fe 970 * @brief Poll for conversion event.
mbed_official 340:28d1f895c6fe 971 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 972 * @param EventType: the ADC event type.
mbed_official 340:28d1f895c6fe 973 * This parameter can be one of the following values:
mbed_official 630:825f75ca301e 974 * @arg ADC_AWD_EVENT: ADC Analog watchdog event
mbed_official 630:825f75ca301e 975 * @arg ADC_OVR_EVENT: ADC Overrun event
mbed_official 340:28d1f895c6fe 976 * @param Timeout: Timeout value in millisecond.
mbed_official 340:28d1f895c6fe 977 * @retval HAL status
mbed_official 340:28d1f895c6fe 978 */
mbed_official 340:28d1f895c6fe 979 HAL_StatusTypeDef HAL_ADC_PollForEvent(ADC_HandleTypeDef* hadc, uint32_t EventType, uint32_t Timeout)
mbed_official 340:28d1f895c6fe 980 {
mbed_official 340:28d1f895c6fe 981 uint32_t tickstart=0;
mbed_official 340:28d1f895c6fe 982
mbed_official 340:28d1f895c6fe 983 /* Check the parameters */
mbed_official 340:28d1f895c6fe 984 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 985 assert_param(IS_ADC_EVENT_TYPE(EventType));
mbed_official 340:28d1f895c6fe 986
mbed_official 630:825f75ca301e 987 /* Get tick count */
mbed_official 340:28d1f895c6fe 988 tickstart = HAL_GetTick();
mbed_official 340:28d1f895c6fe 989
mbed_official 340:28d1f895c6fe 990 /* Check selected event flag */
mbed_official 340:28d1f895c6fe 991 while(__HAL_ADC_GET_FLAG(hadc, EventType) == RESET)
mbed_official 340:28d1f895c6fe 992 {
mbed_official 340:28d1f895c6fe 993 /* Check if timeout is disabled (set to infinite wait) */
mbed_official 340:28d1f895c6fe 994 if(Timeout != HAL_MAX_DELAY)
mbed_official 340:28d1f895c6fe 995 {
mbed_official 340:28d1f895c6fe 996 if((Timeout == 0) || ((HAL_GetTick()-tickstart) > Timeout))
mbed_official 340:28d1f895c6fe 997 {
mbed_official 340:28d1f895c6fe 998 /* Update ADC state machine to timeout */
mbed_official 630:825f75ca301e 999 SET_BIT(hadc->State, HAL_ADC_STATE_TIMEOUT);
mbed_official 340:28d1f895c6fe 1000
mbed_official 340:28d1f895c6fe 1001 /* Process unlocked */
mbed_official 340:28d1f895c6fe 1002 __HAL_UNLOCK(hadc);
mbed_official 340:28d1f895c6fe 1003
mbed_official 340:28d1f895c6fe 1004 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 1005 }
mbed_official 340:28d1f895c6fe 1006 }
mbed_official 340:28d1f895c6fe 1007 }
mbed_official 340:28d1f895c6fe 1008
mbed_official 340:28d1f895c6fe 1009 switch(EventType)
mbed_official 340:28d1f895c6fe 1010 {
mbed_official 340:28d1f895c6fe 1011 /* Analog watchdog (level out of window) event */
mbed_official 630:825f75ca301e 1012 case ADC_AWD_EVENT:
mbed_official 630:825f75ca301e 1013 /* Set ADC state */
mbed_official 630:825f75ca301e 1014 SET_BIT(hadc->State, HAL_ADC_STATE_AWD1);
mbed_official 340:28d1f895c6fe 1015
mbed_official 340:28d1f895c6fe 1016 /* Clear ADC analog watchdog flag */
mbed_official 340:28d1f895c6fe 1017 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD);
mbed_official 340:28d1f895c6fe 1018 break;
mbed_official 340:28d1f895c6fe 1019
mbed_official 340:28d1f895c6fe 1020 /* Overrun event */
mbed_official 630:825f75ca301e 1021 default: /* Case ADC_OVR_EVENT */
mbed_official 340:28d1f895c6fe 1022 /* If overrun is set to overwrite previous data, overrun event is not */
mbed_official 340:28d1f895c6fe 1023 /* considered as an error. */
mbed_official 340:28d1f895c6fe 1024 /* (cf ref manual "Managing conversions without using the DMA and without */
mbed_official 340:28d1f895c6fe 1025 /* overrun ") */
mbed_official 630:825f75ca301e 1026 if (hadc->Init.Overrun == ADC_OVR_DATA_PRESERVED)
mbed_official 340:28d1f895c6fe 1027 {
mbed_official 630:825f75ca301e 1028 /* Set ADC state */
mbed_official 630:825f75ca301e 1029 SET_BIT(hadc->State, HAL_ADC_STATE_REG_OVR);
mbed_official 340:28d1f895c6fe 1030
mbed_official 340:28d1f895c6fe 1031 /* Set ADC error code to overrun */
mbed_official 630:825f75ca301e 1032 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_OVR);
mbed_official 340:28d1f895c6fe 1033 }
mbed_official 340:28d1f895c6fe 1034
mbed_official 340:28d1f895c6fe 1035 /* Clear ADC Overrun flag */
mbed_official 340:28d1f895c6fe 1036 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR);
mbed_official 340:28d1f895c6fe 1037 break;
mbed_official 340:28d1f895c6fe 1038 }
mbed_official 340:28d1f895c6fe 1039
mbed_official 340:28d1f895c6fe 1040 /* Return ADC state */
mbed_official 340:28d1f895c6fe 1041 return HAL_OK;
mbed_official 340:28d1f895c6fe 1042 }
mbed_official 340:28d1f895c6fe 1043
mbed_official 340:28d1f895c6fe 1044 /**
mbed_official 340:28d1f895c6fe 1045 * @brief Enables ADC, starts conversion of regular group with interruption.
mbed_official 441:d2c15dda23c1 1046 * Interruptions enabled in this function:
mbed_official 441:d2c15dda23c1 1047 * - EOC (end of conversion of regular group) or EOS (end of
mbed_official 441:d2c15dda23c1 1048 * sequence of regular group) depending on ADC initialization
mbed_official 441:d2c15dda23c1 1049 * parameter "EOCSelection"
mbed_official 441:d2c15dda23c1 1050 * - overrun (if available)
mbed_official 340:28d1f895c6fe 1051 * Each of these interruptions has its dedicated callback function.
mbed_official 340:28d1f895c6fe 1052 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1053 * @retval HAL status
mbed_official 340:28d1f895c6fe 1054 */
mbed_official 340:28d1f895c6fe 1055 HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 1056 {
mbed_official 630:825f75ca301e 1057 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
mbed_official 340:28d1f895c6fe 1058
mbed_official 340:28d1f895c6fe 1059 /* Check the parameters */
mbed_official 340:28d1f895c6fe 1060 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 1061
mbed_official 441:d2c15dda23c1 1062 /* Perform ADC enable and conversion start if no conversion is on going */
mbed_official 630:825f75ca301e 1063 if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) == RESET)
mbed_official 340:28d1f895c6fe 1064 {
mbed_official 441:d2c15dda23c1 1065 /* Process locked */
mbed_official 441:d2c15dda23c1 1066 __HAL_LOCK(hadc);
mbed_official 441:d2c15dda23c1 1067
mbed_official 441:d2c15dda23c1 1068 /* Enable the ADC peripheral */
mbed_official 441:d2c15dda23c1 1069 /* If low power mode AutoPowerOff is enabled, power-on/off phases are */
mbed_official 441:d2c15dda23c1 1070 /* performed automatically by hardware. */
mbed_official 441:d2c15dda23c1 1071 if (hadc->Init.LowPowerAutoPowerOff != ENABLE)
mbed_official 340:28d1f895c6fe 1072 {
mbed_official 630:825f75ca301e 1073 tmp_hal_status = ADC_Enable(hadc);
mbed_official 340:28d1f895c6fe 1074 }
mbed_official 340:28d1f895c6fe 1075
mbed_official 441:d2c15dda23c1 1076 /* Start conversion if ADC is effectively enabled */
mbed_official 630:825f75ca301e 1077 if (tmp_hal_status == HAL_OK)
mbed_official 441:d2c15dda23c1 1078 {
mbed_official 630:825f75ca301e 1079 /* Set ADC state */
mbed_official 630:825f75ca301e 1080 /* - Clear state bitfield related to regular group conversion results */
mbed_official 630:825f75ca301e 1081 /* - Set state bitfield related to regular operation */
mbed_official 630:825f75ca301e 1082 ADC_STATE_CLR_SET(hadc->State,
mbed_official 630:825f75ca301e 1083 HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR | HAL_ADC_STATE_REG_EOSMP,
mbed_official 630:825f75ca301e 1084 HAL_ADC_STATE_REG_BUSY);
mbed_official 441:d2c15dda23c1 1085
mbed_official 630:825f75ca301e 1086 /* Reset ADC all error code fields */
mbed_official 630:825f75ca301e 1087 ADC_CLEAR_ERRORCODE(hadc);
mbed_official 630:825f75ca301e 1088
mbed_official 630:825f75ca301e 1089 /* Process unlocked */
mbed_official 630:825f75ca301e 1090 /* Unlock before starting ADC conversions: in case of potential */
mbed_official 630:825f75ca301e 1091 /* interruption, to let the process to ADC IRQ Handler. */
mbed_official 630:825f75ca301e 1092 __HAL_UNLOCK(hadc);
mbed_official 441:d2c15dda23c1 1093
mbed_official 441:d2c15dda23c1 1094 /* Clear regular group conversion flag and overrun flag */
mbed_official 441:d2c15dda23c1 1095 /* (To ensure of no unknown state from potential previous ADC */
mbed_official 441:d2c15dda23c1 1096 /* operations) */
mbed_official 441:d2c15dda23c1 1097 __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS | ADC_FLAG_OVR));
mbed_official 441:d2c15dda23c1 1098
mbed_official 441:d2c15dda23c1 1099 /* Enable ADC end of conversion interrupt */
mbed_official 441:d2c15dda23c1 1100 /* Enable ADC overrun interrupt */
mbed_official 441:d2c15dda23c1 1101 switch(hadc->Init.EOCSelection)
mbed_official 441:d2c15dda23c1 1102 {
mbed_official 630:825f75ca301e 1103 case ADC_EOC_SEQ_CONV:
mbed_official 441:d2c15dda23c1 1104 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC);
mbed_official 441:d2c15dda23c1 1105 __HAL_ADC_ENABLE_IT(hadc, (ADC_IT_EOS | ADC_IT_OVR));
mbed_official 441:d2c15dda23c1 1106 break;
mbed_official 630:825f75ca301e 1107 /* case ADC_EOC_SINGLE_CONV */
mbed_official 441:d2c15dda23c1 1108 default:
mbed_official 441:d2c15dda23c1 1109 __HAL_ADC_ENABLE_IT(hadc, (ADC_IT_EOC | ADC_IT_EOS | ADC_IT_OVR));
mbed_official 441:d2c15dda23c1 1110 break;
mbed_official 441:d2c15dda23c1 1111 }
mbed_official 441:d2c15dda23c1 1112
mbed_official 441:d2c15dda23c1 1113 /* Enable conversion of regular group. */
mbed_official 441:d2c15dda23c1 1114 /* If software start has been selected, conversion starts immediately. */
mbed_official 441:d2c15dda23c1 1115 /* If external trigger has been selected, conversion will start at next */
mbed_official 441:d2c15dda23c1 1116 /* trigger event. */
mbed_official 441:d2c15dda23c1 1117 hadc->Instance->CR |= ADC_CR_ADSTART;
mbed_official 441:d2c15dda23c1 1118 }
mbed_official 340:28d1f895c6fe 1119 }
mbed_official 441:d2c15dda23c1 1120 else
mbed_official 441:d2c15dda23c1 1121 {
mbed_official 630:825f75ca301e 1122 tmp_hal_status = HAL_BUSY;
mbed_official 441:d2c15dda23c1 1123 }
mbed_official 441:d2c15dda23c1 1124
mbed_official 340:28d1f895c6fe 1125 /* Return function status */
mbed_official 630:825f75ca301e 1126 return tmp_hal_status;
mbed_official 340:28d1f895c6fe 1127 }
mbed_official 340:28d1f895c6fe 1128
mbed_official 340:28d1f895c6fe 1129
mbed_official 340:28d1f895c6fe 1130 /**
mbed_official 340:28d1f895c6fe 1131 * @brief Stop ADC conversion of regular group, disable interruption of
mbed_official 340:28d1f895c6fe 1132 * end-of-conversion, disable ADC peripheral.
mbed_official 340:28d1f895c6fe 1133 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1134 * @retval HAL status.
mbed_official 340:28d1f895c6fe 1135 */
mbed_official 340:28d1f895c6fe 1136 HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 1137 {
mbed_official 630:825f75ca301e 1138 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
mbed_official 340:28d1f895c6fe 1139
mbed_official 340:28d1f895c6fe 1140 /* Check the parameters */
mbed_official 340:28d1f895c6fe 1141 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 1142
mbed_official 340:28d1f895c6fe 1143 /* Process locked */
mbed_official 340:28d1f895c6fe 1144 __HAL_LOCK(hadc);
mbed_official 340:28d1f895c6fe 1145
mbed_official 340:28d1f895c6fe 1146 /* 1. Stop potential conversion on going, on regular group */
mbed_official 630:825f75ca301e 1147 tmp_hal_status = ADC_ConversionStop(hadc);
mbed_official 630:825f75ca301e 1148
mbed_official 340:28d1f895c6fe 1149 /* Disable ADC peripheral if conversions are effectively stopped */
mbed_official 630:825f75ca301e 1150 if (tmp_hal_status == HAL_OK)
mbed_official 340:28d1f895c6fe 1151 {
mbed_official 340:28d1f895c6fe 1152 /* Disable ADC end of conversion interrupt for regular group */
mbed_official 340:28d1f895c6fe 1153 /* Disable ADC overrun interrupt */
mbed_official 340:28d1f895c6fe 1154 __HAL_ADC_DISABLE_IT(hadc, (ADC_IT_EOC | ADC_IT_EOS | ADC_IT_OVR));
mbed_official 340:28d1f895c6fe 1155
mbed_official 340:28d1f895c6fe 1156 /* 2. Disable the ADC peripheral */
mbed_official 630:825f75ca301e 1157 tmp_hal_status = ADC_Disable(hadc);
mbed_official 340:28d1f895c6fe 1158
mbed_official 340:28d1f895c6fe 1159 /* Check if ADC is effectively disabled */
mbed_official 630:825f75ca301e 1160 if (tmp_hal_status == HAL_OK)
mbed_official 340:28d1f895c6fe 1161 {
mbed_official 630:825f75ca301e 1162 /* Set ADC state */
mbed_official 630:825f75ca301e 1163 ADC_STATE_CLR_SET(hadc->State,
mbed_official 630:825f75ca301e 1164 HAL_ADC_STATE_REG_BUSY,
mbed_official 630:825f75ca301e 1165 HAL_ADC_STATE_READY);
mbed_official 340:28d1f895c6fe 1166 }
mbed_official 340:28d1f895c6fe 1167 }
mbed_official 340:28d1f895c6fe 1168
mbed_official 340:28d1f895c6fe 1169 /* Process unlocked */
mbed_official 340:28d1f895c6fe 1170 __HAL_UNLOCK(hadc);
mbed_official 340:28d1f895c6fe 1171
mbed_official 340:28d1f895c6fe 1172 /* Return function status */
mbed_official 630:825f75ca301e 1173 return tmp_hal_status;
mbed_official 340:28d1f895c6fe 1174 }
mbed_official 340:28d1f895c6fe 1175
mbed_official 340:28d1f895c6fe 1176 /**
mbed_official 340:28d1f895c6fe 1177 * @brief Enables ADC, starts conversion of regular group and transfers result
mbed_official 340:28d1f895c6fe 1178 * through DMA.
mbed_official 340:28d1f895c6fe 1179 * Interruptions enabled in this function:
mbed_official 441:d2c15dda23c1 1180 * - DMA transfer complete
mbed_official 441:d2c15dda23c1 1181 * - DMA half transfer
mbed_official 441:d2c15dda23c1 1182 * - overrun
mbed_official 340:28d1f895c6fe 1183 * Each of these interruptions has its dedicated callback function.
mbed_official 340:28d1f895c6fe 1184 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1185 * @param pData: The destination Buffer address.
mbed_official 340:28d1f895c6fe 1186 * @param Length: The length of data to be transferred from ADC peripheral to memory.
mbed_official 340:28d1f895c6fe 1187 * @retval None
mbed_official 340:28d1f895c6fe 1188 */
mbed_official 340:28d1f895c6fe 1189 HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length)
mbed_official 340:28d1f895c6fe 1190 {
mbed_official 630:825f75ca301e 1191 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
mbed_official 340:28d1f895c6fe 1192
mbed_official 340:28d1f895c6fe 1193 /* Check the parameters */
mbed_official 340:28d1f895c6fe 1194 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 441:d2c15dda23c1 1195
mbed_official 441:d2c15dda23c1 1196 /* Perform ADC enable and conversion start if no conversion is on going */
mbed_official 630:825f75ca301e 1197 if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) == RESET)
mbed_official 340:28d1f895c6fe 1198 {
mbed_official 441:d2c15dda23c1 1199 /* Process locked */
mbed_official 441:d2c15dda23c1 1200 __HAL_LOCK(hadc);
mbed_official 441:d2c15dda23c1 1201
mbed_official 441:d2c15dda23c1 1202 /* Enable the ADC peripheral */
mbed_official 441:d2c15dda23c1 1203 /* If low power mode AutoPowerOff is enabled, power-on/off phases are */
mbed_official 441:d2c15dda23c1 1204 /* performed automatically by hardware. */
mbed_official 441:d2c15dda23c1 1205 if (hadc->Init.LowPowerAutoPowerOff != ENABLE)
mbed_official 441:d2c15dda23c1 1206 {
mbed_official 630:825f75ca301e 1207 tmp_hal_status = ADC_Enable(hadc);
mbed_official 441:d2c15dda23c1 1208 }
mbed_official 340:28d1f895c6fe 1209
mbed_official 441:d2c15dda23c1 1210 /* Start conversion if ADC is effectively enabled */
mbed_official 630:825f75ca301e 1211 if (tmp_hal_status == HAL_OK)
mbed_official 441:d2c15dda23c1 1212 {
mbed_official 630:825f75ca301e 1213 /* Set ADC state */
mbed_official 630:825f75ca301e 1214 /* - Clear state bitfield related to regular group conversion results */
mbed_official 630:825f75ca301e 1215 /* - Set state bitfield related to regular operation */
mbed_official 630:825f75ca301e 1216 ADC_STATE_CLR_SET(hadc->State,
mbed_official 630:825f75ca301e 1217 HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR | HAL_ADC_STATE_REG_EOSMP,
mbed_official 630:825f75ca301e 1218 HAL_ADC_STATE_REG_BUSY);
mbed_official 441:d2c15dda23c1 1219
mbed_official 630:825f75ca301e 1220 /* Reset ADC all error code fields */
mbed_official 630:825f75ca301e 1221 ADC_CLEAR_ERRORCODE(hadc);
mbed_official 441:d2c15dda23c1 1222
mbed_official 630:825f75ca301e 1223 /* Process unlocked */
mbed_official 630:825f75ca301e 1224 /* Unlock before starting ADC conversions: in case of potential */
mbed_official 630:825f75ca301e 1225 /* interruption, to let the process to ADC IRQ Handler. */
mbed_official 630:825f75ca301e 1226 __HAL_UNLOCK(hadc);
mbed_official 630:825f75ca301e 1227
mbed_official 441:d2c15dda23c1 1228 /* Set the DMA transfer complete callback */
mbed_official 441:d2c15dda23c1 1229 hadc->DMA_Handle->XferCpltCallback = ADC_DMAConvCplt;
mbed_official 441:d2c15dda23c1 1230
mbed_official 441:d2c15dda23c1 1231 /* Set the DMA half transfer complete callback */
mbed_official 441:d2c15dda23c1 1232 hadc->DMA_Handle->XferHalfCpltCallback = ADC_DMAHalfConvCplt;
mbed_official 441:d2c15dda23c1 1233
mbed_official 441:d2c15dda23c1 1234 /* Set the DMA error callback */
mbed_official 441:d2c15dda23c1 1235 hadc->DMA_Handle->XferErrorCallback = ADC_DMAError;
mbed_official 340:28d1f895c6fe 1236
mbed_official 441:d2c15dda23c1 1237
mbed_official 441:d2c15dda23c1 1238 /* Manage ADC and DMA start: ADC overrun interruption, DMA start, ADC */
mbed_official 441:d2c15dda23c1 1239 /* start (in case of SW start): */
mbed_official 441:d2c15dda23c1 1240
mbed_official 441:d2c15dda23c1 1241 /* Clear regular group conversion flag and overrun flag */
mbed_official 441:d2c15dda23c1 1242 /* (To ensure of no unknown state from potential previous ADC */
mbed_official 441:d2c15dda23c1 1243 /* operations) */
mbed_official 441:d2c15dda23c1 1244 __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS | ADC_FLAG_OVR));
mbed_official 441:d2c15dda23c1 1245
mbed_official 441:d2c15dda23c1 1246 /* Enable ADC overrun interrupt */
mbed_official 441:d2c15dda23c1 1247 __HAL_ADC_ENABLE_IT(hadc, ADC_IT_OVR);
mbed_official 441:d2c15dda23c1 1248
mbed_official 441:d2c15dda23c1 1249 /* Enable ADC DMA mode */
mbed_official 441:d2c15dda23c1 1250 hadc->Instance->CFGR1 |= ADC_CFGR1_DMAEN;
mbed_official 441:d2c15dda23c1 1251
mbed_official 441:d2c15dda23c1 1252 /* Start the DMA channel */
mbed_official 441:d2c15dda23c1 1253 HAL_DMA_Start_IT(hadc->DMA_Handle, (uint32_t)&hadc->Instance->DR, (uint32_t)pData, Length);
mbed_official 441:d2c15dda23c1 1254
mbed_official 441:d2c15dda23c1 1255 /* Enable conversion of regular group. */
mbed_official 441:d2c15dda23c1 1256 /* If software start has been selected, conversion starts immediately. */
mbed_official 441:d2c15dda23c1 1257 /* If external trigger has been selected, conversion will start at next */
mbed_official 441:d2c15dda23c1 1258 /* trigger event. */
mbed_official 441:d2c15dda23c1 1259 hadc->Instance->CR |= ADC_CR_ADSTART;
mbed_official 441:d2c15dda23c1 1260 }
mbed_official 441:d2c15dda23c1 1261 }
mbed_official 441:d2c15dda23c1 1262 else
mbed_official 441:d2c15dda23c1 1263 {
mbed_official 630:825f75ca301e 1264 tmp_hal_status = HAL_BUSY;
mbed_official 441:d2c15dda23c1 1265 }
mbed_official 340:28d1f895c6fe 1266
mbed_official 340:28d1f895c6fe 1267 /* Return function status */
mbed_official 630:825f75ca301e 1268 return tmp_hal_status;
mbed_official 340:28d1f895c6fe 1269 }
mbed_official 340:28d1f895c6fe 1270
mbed_official 340:28d1f895c6fe 1271 /**
mbed_official 340:28d1f895c6fe 1272 * @brief Stop ADC conversion of regular group, disable ADC DMA transfer, disable
mbed_official 340:28d1f895c6fe 1273 * ADC peripheral.
mbed_official 340:28d1f895c6fe 1274 * Each of these interruptions has its dedicated callback function.
mbed_official 340:28d1f895c6fe 1275 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1276 * @retval HAL status.
mbed_official 340:28d1f895c6fe 1277 */
mbed_official 340:28d1f895c6fe 1278 HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 1279 {
mbed_official 630:825f75ca301e 1280 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
mbed_official 340:28d1f895c6fe 1281
mbed_official 340:28d1f895c6fe 1282 /* Check the parameters */
mbed_official 340:28d1f895c6fe 1283 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 1284
mbed_official 340:28d1f895c6fe 1285 /* Process locked */
mbed_official 340:28d1f895c6fe 1286 __HAL_LOCK(hadc);
mbed_official 340:28d1f895c6fe 1287
mbed_official 340:28d1f895c6fe 1288 /* 1. Stop potential conversion on going, on regular group */
mbed_official 630:825f75ca301e 1289 tmp_hal_status = ADC_ConversionStop(hadc);
mbed_official 340:28d1f895c6fe 1290
mbed_official 340:28d1f895c6fe 1291 /* Disable ADC peripheral if conversions are effectively stopped */
mbed_official 630:825f75ca301e 1292 if (tmp_hal_status == HAL_OK)
mbed_official 340:28d1f895c6fe 1293 {
mbed_official 340:28d1f895c6fe 1294 /* Disable ADC DMA (ADC DMA configuration ADC_CFGR_DMACFG is kept) */
mbed_official 340:28d1f895c6fe 1295 hadc->Instance->CFGR1 &= ~ADC_CFGR1_DMAEN;
mbed_official 340:28d1f895c6fe 1296
mbed_official 340:28d1f895c6fe 1297 /* Disable the DMA channel (in case of DMA in circular mode or stop while */
mbed_official 340:28d1f895c6fe 1298 /* while DMA transfer is on going) */
mbed_official 630:825f75ca301e 1299 tmp_hal_status = HAL_DMA_Abort(hadc->DMA_Handle);
mbed_official 340:28d1f895c6fe 1300
mbed_official 340:28d1f895c6fe 1301 /* Check if DMA channel effectively disabled */
mbed_official 630:825f75ca301e 1302 if (tmp_hal_status != HAL_OK)
mbed_official 340:28d1f895c6fe 1303 {
mbed_official 340:28d1f895c6fe 1304 /* Update ADC state machine to error */
mbed_official 630:825f75ca301e 1305 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_DMA);
mbed_official 340:28d1f895c6fe 1306 }
mbed_official 340:28d1f895c6fe 1307
mbed_official 340:28d1f895c6fe 1308 /* Disable ADC overrun interrupt */
mbed_official 340:28d1f895c6fe 1309 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_OVR);
mbed_official 340:28d1f895c6fe 1310
mbed_official 340:28d1f895c6fe 1311 /* 2. Disable the ADC peripheral */
mbed_official 630:825f75ca301e 1312 /* Update "tmp_hal_status" only if DMA channel disabling passed, to keep */
mbed_official 630:825f75ca301e 1313 /* in memory a potential failing status. */
mbed_official 630:825f75ca301e 1314 if (tmp_hal_status == HAL_OK)
mbed_official 340:28d1f895c6fe 1315 {
mbed_official 630:825f75ca301e 1316 tmp_hal_status = ADC_Disable(hadc);
mbed_official 340:28d1f895c6fe 1317 }
mbed_official 340:28d1f895c6fe 1318 else
mbed_official 340:28d1f895c6fe 1319 {
mbed_official 340:28d1f895c6fe 1320 ADC_Disable(hadc);
mbed_official 340:28d1f895c6fe 1321 }
mbed_official 340:28d1f895c6fe 1322
mbed_official 340:28d1f895c6fe 1323 /* Check if ADC is effectively disabled */
mbed_official 630:825f75ca301e 1324 if (tmp_hal_status == HAL_OK)
mbed_official 340:28d1f895c6fe 1325 {
mbed_official 630:825f75ca301e 1326 /* Set ADC state */
mbed_official 630:825f75ca301e 1327 ADC_STATE_CLR_SET(hadc->State,
mbed_official 630:825f75ca301e 1328 HAL_ADC_STATE_REG_BUSY,
mbed_official 630:825f75ca301e 1329 HAL_ADC_STATE_READY);
mbed_official 340:28d1f895c6fe 1330 }
mbed_official 340:28d1f895c6fe 1331
mbed_official 340:28d1f895c6fe 1332 }
mbed_official 340:28d1f895c6fe 1333
mbed_official 340:28d1f895c6fe 1334 /* Process unlocked */
mbed_official 340:28d1f895c6fe 1335 __HAL_UNLOCK(hadc);
mbed_official 340:28d1f895c6fe 1336
mbed_official 340:28d1f895c6fe 1337 /* Return function status */
mbed_official 630:825f75ca301e 1338 return tmp_hal_status;
mbed_official 340:28d1f895c6fe 1339 }
mbed_official 340:28d1f895c6fe 1340
mbed_official 340:28d1f895c6fe 1341 /**
mbed_official 340:28d1f895c6fe 1342 * @brief Get ADC regular group conversion result.
mbed_official 441:d2c15dda23c1 1343 * @note Reading DR register automatically clears EOC (end of conversion of
mbed_official 441:d2c15dda23c1 1344 * regular group) flag.
mbed_official 441:d2c15dda23c1 1345 * Additionally, this functions clears EOS (end of sequence of
mbed_official 441:d2c15dda23c1 1346 * regular group) flag, in case of the end of the sequence is reached.
mbed_official 340:28d1f895c6fe 1347 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1348 * @retval Converted value
mbed_official 340:28d1f895c6fe 1349 */
mbed_official 340:28d1f895c6fe 1350 uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 1351 {
mbed_official 340:28d1f895c6fe 1352 /* Check the parameters */
mbed_official 340:28d1f895c6fe 1353 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 1354
mbed_official 630:825f75ca301e 1355 /* Note: EOC flag is not cleared here by software because automatically */
mbed_official 441:d2c15dda23c1 1356 /* cleared by hardware when reading register DR. */
mbed_official 340:28d1f895c6fe 1357
mbed_official 441:d2c15dda23c1 1358 /* Clear regular group end of sequence flag */
mbed_official 441:d2c15dda23c1 1359 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOS);
mbed_official 340:28d1f895c6fe 1360
mbed_official 340:28d1f895c6fe 1361 /* Return ADC converted value */
mbed_official 340:28d1f895c6fe 1362 return hadc->Instance->DR;
mbed_official 340:28d1f895c6fe 1363 }
mbed_official 340:28d1f895c6fe 1364
mbed_official 340:28d1f895c6fe 1365 /**
mbed_official 340:28d1f895c6fe 1366 * @brief Handles ADC interrupt request.
mbed_official 340:28d1f895c6fe 1367 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1368 * @retval None
mbed_official 340:28d1f895c6fe 1369 */
mbed_official 340:28d1f895c6fe 1370 void HAL_ADC_IRQHandler(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 1371 {
mbed_official 340:28d1f895c6fe 1372 /* Check the parameters */
mbed_official 340:28d1f895c6fe 1373 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 1374 assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode));
mbed_official 340:28d1f895c6fe 1375 assert_param(IS_ADC_EOC_SELECTION(hadc->Init.EOCSelection));
mbed_official 340:28d1f895c6fe 1376
mbed_official 340:28d1f895c6fe 1377 /* ========== Check End of Conversion flag for regular group ========== */
mbed_official 340:28d1f895c6fe 1378 if( (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOC) && __HAL_ADC_GET_IT_SOURCE(hadc, ADC_IT_EOC)) ||
mbed_official 340:28d1f895c6fe 1379 (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOS) && __HAL_ADC_GET_IT_SOURCE(hadc, ADC_IT_EOS)) )
mbed_official 340:28d1f895c6fe 1380 {
mbed_official 340:28d1f895c6fe 1381 /* Update state machine on conversion status if not in error state */
mbed_official 630:825f75ca301e 1382 if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL))
mbed_official 340:28d1f895c6fe 1383 {
mbed_official 630:825f75ca301e 1384 /* Set ADC state */
mbed_official 630:825f75ca301e 1385 SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
mbed_official 340:28d1f895c6fe 1386 }
mbed_official 340:28d1f895c6fe 1387
mbed_official 630:825f75ca301e 1388 /* Determine whether any further conversion upcoming on group regular */
mbed_official 630:825f75ca301e 1389 /* by external trigger, continuous mode or scan sequence on going. */
mbed_official 630:825f75ca301e 1390 if(ADC_IS_SOFTWARE_START_REGULAR(hadc) &&
mbed_official 630:825f75ca301e 1391 (hadc->Init.ContinuousConvMode == DISABLE) )
mbed_official 340:28d1f895c6fe 1392 {
mbed_official 340:28d1f895c6fe 1393 /* If End of Sequence is reached, disable interrupts */
mbed_official 340:28d1f895c6fe 1394 if( __HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOS) )
mbed_official 340:28d1f895c6fe 1395 {
mbed_official 340:28d1f895c6fe 1396 /* Allowed to modify bits ADC_IT_EOC/ADC_IT_EOS only if bit */
mbed_official 340:28d1f895c6fe 1397 /* ADSTART==0 (no conversion on going) */
mbed_official 630:825f75ca301e 1398 if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) == RESET)
mbed_official 340:28d1f895c6fe 1399 {
mbed_official 630:825f75ca301e 1400 /* Disable ADC end of single conversion interrupt on group regular */
mbed_official 630:825f75ca301e 1401 /* Note: Overrun interrupt was enabled with EOC interrupt in */
mbed_official 340:28d1f895c6fe 1402 /* HAL_Start_IT(), but is not disabled here because can be used */
mbed_official 340:28d1f895c6fe 1403 /* by overrun IRQ process below. */
mbed_official 340:28d1f895c6fe 1404 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC | ADC_IT_EOS);
mbed_official 630:825f75ca301e 1405
mbed_official 630:825f75ca301e 1406 /* Set ADC state */
mbed_official 630:825f75ca301e 1407 ADC_STATE_CLR_SET(hadc->State,
mbed_official 630:825f75ca301e 1408 HAL_ADC_STATE_REG_BUSY,
mbed_official 630:825f75ca301e 1409 HAL_ADC_STATE_READY);
mbed_official 340:28d1f895c6fe 1410 }
mbed_official 340:28d1f895c6fe 1411 else
mbed_official 340:28d1f895c6fe 1412 {
mbed_official 340:28d1f895c6fe 1413 /* Change ADC state to error state */
mbed_official 630:825f75ca301e 1414 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
mbed_official 340:28d1f895c6fe 1415
mbed_official 340:28d1f895c6fe 1416 /* Set ADC error code to ADC IP internal error */
mbed_official 630:825f75ca301e 1417 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
mbed_official 340:28d1f895c6fe 1418 }
mbed_official 340:28d1f895c6fe 1419 }
mbed_official 340:28d1f895c6fe 1420 }
mbed_official 340:28d1f895c6fe 1421
mbed_official 340:28d1f895c6fe 1422 /* Conversion complete callback */
mbed_official 630:825f75ca301e 1423 /* Note: into callback, to determine if conversion has been triggered */
mbed_official 340:28d1f895c6fe 1424 /* from EOC or EOS, possibility to use: */
mbed_official 340:28d1f895c6fe 1425 /* " if( __HAL_ADC_GET_FLAG(&hadc, ADC_FLAG_EOS)) " */
mbed_official 340:28d1f895c6fe 1426 HAL_ADC_ConvCpltCallback(hadc);
mbed_official 340:28d1f895c6fe 1427
mbed_official 340:28d1f895c6fe 1428
mbed_official 340:28d1f895c6fe 1429 /* Clear regular group conversion flag */
mbed_official 630:825f75ca301e 1430 /* Note: in case of overrun set to ADC_OVR_DATA_PRESERVED, end of */
mbed_official 630:825f75ca301e 1431 /* conversion flags clear induces the release of the preserved data.*/
mbed_official 340:28d1f895c6fe 1432 /* Therefore, if the preserved data value is needed, it must be */
mbed_official 340:28d1f895c6fe 1433 /* read preliminarily into HAL_ADC_ConvCpltCallback(). */
mbed_official 340:28d1f895c6fe 1434 __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS) );
mbed_official 340:28d1f895c6fe 1435 }
mbed_official 340:28d1f895c6fe 1436
mbed_official 340:28d1f895c6fe 1437 /* ========== Check Analog watchdog flags ========== */
mbed_official 340:28d1f895c6fe 1438 if(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_AWD) && __HAL_ADC_GET_IT_SOURCE(hadc, ADC_IT_AWD))
mbed_official 340:28d1f895c6fe 1439 {
mbed_official 630:825f75ca301e 1440 /* Set ADC state */
mbed_official 630:825f75ca301e 1441 SET_BIT(hadc->State, HAL_ADC_STATE_AWD1);
mbed_official 340:28d1f895c6fe 1442
mbed_official 441:d2c15dda23c1 1443 /* Level out of window callback */
mbed_official 441:d2c15dda23c1 1444 HAL_ADC_LevelOutOfWindowCallback(hadc);
mbed_official 441:d2c15dda23c1 1445
mbed_official 340:28d1f895c6fe 1446 /* Clear ADC Analog watchdog flag */
mbed_official 340:28d1f895c6fe 1447 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD);
mbed_official 441:d2c15dda23c1 1448
mbed_official 340:28d1f895c6fe 1449 }
mbed_official 340:28d1f895c6fe 1450
mbed_official 340:28d1f895c6fe 1451
mbed_official 340:28d1f895c6fe 1452 /* ========== Check Overrun flag ========== */
mbed_official 340:28d1f895c6fe 1453 if(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_OVR) && __HAL_ADC_GET_IT_SOURCE(hadc, ADC_IT_OVR))
mbed_official 340:28d1f895c6fe 1454 {
mbed_official 340:28d1f895c6fe 1455 /* If overrun is set to overwrite previous data (default setting), */
mbed_official 340:28d1f895c6fe 1456 /* overrun event is not considered as an error. */
mbed_official 340:28d1f895c6fe 1457 /* (cf ref manual "Managing conversions without using the DMA and without */
mbed_official 340:28d1f895c6fe 1458 /* overrun ") */
mbed_official 340:28d1f895c6fe 1459 /* Exception for usage with DMA overrun event always considered as an */
mbed_official 340:28d1f895c6fe 1460 /* error. */
mbed_official 630:825f75ca301e 1461 if ((hadc->Init.Overrun == ADC_OVR_DATA_PRESERVED) ||
mbed_official 340:28d1f895c6fe 1462 HAL_IS_BIT_SET(hadc->Instance->CFGR1, ADC_CFGR1_DMAEN) )
mbed_official 340:28d1f895c6fe 1463 {
mbed_official 630:825f75ca301e 1464 /* Set ADC error code to overrun */
mbed_official 630:825f75ca301e 1465 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_OVR);
mbed_official 340:28d1f895c6fe 1466
mbed_official 630:825f75ca301e 1467 /* Clear ADC overrun flag */
mbed_official 630:825f75ca301e 1468 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR);
mbed_official 340:28d1f895c6fe 1469
mbed_official 340:28d1f895c6fe 1470 /* Error callback */
mbed_official 340:28d1f895c6fe 1471 HAL_ADC_ErrorCallback(hadc);
mbed_official 340:28d1f895c6fe 1472 }
mbed_official 340:28d1f895c6fe 1473
mbed_official 340:28d1f895c6fe 1474 /* Clear the Overrun flag */
mbed_official 340:28d1f895c6fe 1475 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR);
mbed_official 340:28d1f895c6fe 1476 }
mbed_official 340:28d1f895c6fe 1477
mbed_official 340:28d1f895c6fe 1478 }
mbed_official 340:28d1f895c6fe 1479
mbed_official 340:28d1f895c6fe 1480
mbed_official 340:28d1f895c6fe 1481 /**
mbed_official 340:28d1f895c6fe 1482 * @brief Conversion complete callback in non blocking mode
mbed_official 340:28d1f895c6fe 1483 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1484 * @retval None
mbed_official 340:28d1f895c6fe 1485 */
mbed_official 340:28d1f895c6fe 1486 __weak void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 1487 {
mbed_official 340:28d1f895c6fe 1488 /* NOTE : This function should not be modified. When the callback is needed,
mbed_official 340:28d1f895c6fe 1489 function HAL_ADC_ConvCpltCallback must be implemented in the user file.
mbed_official 340:28d1f895c6fe 1490 */
mbed_official 340:28d1f895c6fe 1491 }
mbed_official 340:28d1f895c6fe 1492
mbed_official 340:28d1f895c6fe 1493 /**
mbed_official 340:28d1f895c6fe 1494 * @brief Conversion DMA half-transfer callback in non blocking mode
mbed_official 340:28d1f895c6fe 1495 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1496 * @retval None
mbed_official 340:28d1f895c6fe 1497 */
mbed_official 340:28d1f895c6fe 1498 __weak void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 1499 {
mbed_official 340:28d1f895c6fe 1500 /* NOTE : This function should not be modified. When the callback is needed,
mbed_official 340:28d1f895c6fe 1501 function HAL_ADC_ConvHalfCpltCallback must be implemented in the user file.
mbed_official 340:28d1f895c6fe 1502 */
mbed_official 340:28d1f895c6fe 1503 }
mbed_official 340:28d1f895c6fe 1504
mbed_official 340:28d1f895c6fe 1505 /**
mbed_official 340:28d1f895c6fe 1506 * @brief Analog watchdog callback in non blocking mode.
mbed_official 340:28d1f895c6fe 1507 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1508 * @retval None
mbed_official 340:28d1f895c6fe 1509 */
mbed_official 340:28d1f895c6fe 1510 __weak void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 1511 {
mbed_official 340:28d1f895c6fe 1512 /* NOTE : This function should not be modified. When the callback is needed,
mbed_official 340:28d1f895c6fe 1513 function HAL_ADC_LevelOoutOfWindowCallback must be implemented in the user file.
mbed_official 340:28d1f895c6fe 1514 */
mbed_official 340:28d1f895c6fe 1515 }
mbed_official 340:28d1f895c6fe 1516
mbed_official 340:28d1f895c6fe 1517 /**
mbed_official 340:28d1f895c6fe 1518 * @brief ADC error callback in non blocking mode
mbed_official 340:28d1f895c6fe 1519 * (ADC conversion with interruption or transfer by DMA)
mbed_official 340:28d1f895c6fe 1520 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1521 * @retval None
mbed_official 340:28d1f895c6fe 1522 */
mbed_official 340:28d1f895c6fe 1523 __weak void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc)
mbed_official 340:28d1f895c6fe 1524 {
mbed_official 340:28d1f895c6fe 1525 /* NOTE : This function should not be modified. When the callback is needed,
mbed_official 340:28d1f895c6fe 1526 function HAL_ADC_ErrorCallback must be implemented in the user file.
mbed_official 340:28d1f895c6fe 1527 */
mbed_official 340:28d1f895c6fe 1528 }
mbed_official 340:28d1f895c6fe 1529
mbed_official 340:28d1f895c6fe 1530
mbed_official 340:28d1f895c6fe 1531 /**
mbed_official 340:28d1f895c6fe 1532 * @}
mbed_official 340:28d1f895c6fe 1533 */
mbed_official 340:28d1f895c6fe 1534
mbed_official 340:28d1f895c6fe 1535 /** @defgroup ADC_Exported_Functions_Group3 Peripheral Control functions
mbed_official 340:28d1f895c6fe 1536 * @brief Peripheral Control functions
mbed_official 340:28d1f895c6fe 1537 *
mbed_official 340:28d1f895c6fe 1538 @verbatim
mbed_official 340:28d1f895c6fe 1539 ===============================================================================
mbed_official 340:28d1f895c6fe 1540 ##### Peripheral Control functions #####
mbed_official 340:28d1f895c6fe 1541 ===============================================================================
mbed_official 340:28d1f895c6fe 1542 [..] This section provides functions allowing to:
mbed_official 340:28d1f895c6fe 1543 (+) Configure channels on regular group
mbed_official 340:28d1f895c6fe 1544 (+) Configure the analog watchdog
mbed_official 340:28d1f895c6fe 1545
mbed_official 340:28d1f895c6fe 1546 @endverbatim
mbed_official 340:28d1f895c6fe 1547 * @{
mbed_official 340:28d1f895c6fe 1548 */
mbed_official 340:28d1f895c6fe 1549
mbed_official 340:28d1f895c6fe 1550 /**
mbed_official 340:28d1f895c6fe 1551 * @brief Configures the the selected channel to be linked to the regular
mbed_official 340:28d1f895c6fe 1552 * group.
mbed_official 340:28d1f895c6fe 1553 * @note In case of usage of internal measurement channels:
mbed_official 340:28d1f895c6fe 1554 * VrefInt/Vbat/TempSensor.
mbed_official 340:28d1f895c6fe 1555 * Sampling time constraints must be respected (sampling time can be
mbed_official 340:28d1f895c6fe 1556 * adjusted in function of ADC clock frequency and sampling time
mbed_official 340:28d1f895c6fe 1557 * setting).
mbed_official 340:28d1f895c6fe 1558 * Refer to device datasheet for timings values, parameters TS_vrefint,
mbed_official 340:28d1f895c6fe 1559 * TS_vbat, TS_temp (values rough order: 5us to 17us).
mbed_official 340:28d1f895c6fe 1560 * These internal paths can be be disabled using function
mbed_official 340:28d1f895c6fe 1561 * HAL_ADC_DeInit().
mbed_official 340:28d1f895c6fe 1562 * @note Possibility to update parameters on the fly:
mbed_official 340:28d1f895c6fe 1563 * This function initializes channel into regular group, following
mbed_official 340:28d1f895c6fe 1564 * calls to this function can be used to reconfigure some parameters
mbed_official 340:28d1f895c6fe 1565 * of structure "ADC_ChannelConfTypeDef" on the fly, without reseting
mbed_official 340:28d1f895c6fe 1566 * the ADC.
mbed_official 340:28d1f895c6fe 1567 * The setting of these parameters is conditioned to ADC state.
mbed_official 340:28d1f895c6fe 1568 * For parameters constraints, see comments of structure
mbed_official 340:28d1f895c6fe 1569 * "ADC_ChannelConfTypeDef".
mbed_official 340:28d1f895c6fe 1570 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1571 * @param sConfig: Structure of ADC channel for regular group.
mbed_official 340:28d1f895c6fe 1572 * @retval HAL status
mbed_official 340:28d1f895c6fe 1573 */
mbed_official 340:28d1f895c6fe 1574 HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef* hadc, ADC_ChannelConfTypeDef* sConfig)
mbed_official 340:28d1f895c6fe 1575 {
mbed_official 630:825f75ca301e 1576 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
mbed_official 340:28d1f895c6fe 1577 __IO uint32_t wait_loop_index = 0;
mbed_official 340:28d1f895c6fe 1578
mbed_official 340:28d1f895c6fe 1579 /* Check the parameters */
mbed_official 340:28d1f895c6fe 1580 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 1581 assert_param(IS_ADC_CHANNEL(sConfig->Channel));
mbed_official 340:28d1f895c6fe 1582 assert_param(IS_ADC_RANK(sConfig->Rank));
mbed_official 630:825f75ca301e 1583
mbed_official 630:825f75ca301e 1584 if (! IS_ADC_SAMPLE_TIME(hadc->Init.SamplingTimeCommon))
mbed_official 630:825f75ca301e 1585 {
mbed_official 630:825f75ca301e 1586 assert_param(IS_ADC_SAMPLE_TIME(sConfig->SamplingTime));
mbed_official 630:825f75ca301e 1587 }
mbed_official 630:825f75ca301e 1588
mbed_official 340:28d1f895c6fe 1589 /* Process locked */
mbed_official 340:28d1f895c6fe 1590 __HAL_LOCK(hadc);
mbed_official 340:28d1f895c6fe 1591
mbed_official 340:28d1f895c6fe 1592 /* Parameters update conditioned to ADC state: */
mbed_official 340:28d1f895c6fe 1593 /* Parameters that can be updated when ADC is disabled or enabled without */
mbed_official 340:28d1f895c6fe 1594 /* conversion on going on regular group: */
mbed_official 340:28d1f895c6fe 1595 /* - Channel number */
mbed_official 340:28d1f895c6fe 1596 /* - Channel sampling time */
mbed_official 630:825f75ca301e 1597 /* - Management of internal measurement channels: VrefInt/TempSensor/Vbat */
mbed_official 630:825f75ca301e 1598 if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) == RESET)
mbed_official 340:28d1f895c6fe 1599 {
mbed_official 340:28d1f895c6fe 1600 /* Configure channel: depending on rank setting, add it or remove it from */
mbed_official 340:28d1f895c6fe 1601 /* ADC conversion sequencer. */
mbed_official 340:28d1f895c6fe 1602 if (sConfig->Rank != ADC_RANK_NONE)
mbed_official 340:28d1f895c6fe 1603 {
mbed_official 340:28d1f895c6fe 1604 /* Regular sequence configuration */
mbed_official 340:28d1f895c6fe 1605 /* Set the channel selection register from the selected channel */
mbed_official 630:825f75ca301e 1606 hadc->Instance->CHSELR |= ADC_CHSELR_CHANNEL(sConfig->Channel);
mbed_official 340:28d1f895c6fe 1607
mbed_official 340:28d1f895c6fe 1608 /* Channel sampling time configuration */
mbed_official 630:825f75ca301e 1609 /* Management of parameters "SamplingTimeCommon" and "SamplingTime" */
mbed_official 630:825f75ca301e 1610 /* (obsolete): sampling time set in this function with */
mbed_official 630:825f75ca301e 1611 /* parameter "SamplingTime" (obsolete) only if not already set into */
mbed_official 630:825f75ca301e 1612 /* ADC initialization structure with parameter "SamplingTimeCommon". */
mbed_official 630:825f75ca301e 1613 if (! IS_ADC_SAMPLE_TIME(hadc->Init.SamplingTimeCommon))
mbed_official 340:28d1f895c6fe 1614 {
mbed_official 630:825f75ca301e 1615 /* Modify sampling time if needed (not needed in case of reoccurrence */
mbed_official 630:825f75ca301e 1616 /* for several channels programmed consecutively into the sequencer) */
mbed_official 630:825f75ca301e 1617 if (sConfig->SamplingTime != ADC_GET_SAMPLINGTIME(hadc))
mbed_official 630:825f75ca301e 1618 {
mbed_official 630:825f75ca301e 1619 /* Channel sampling time configuration */
mbed_official 630:825f75ca301e 1620 /* Clear the old sample time */
mbed_official 630:825f75ca301e 1621 hadc->Instance->SMPR &= ~(ADC_SMPR_SMP);
mbed_official 630:825f75ca301e 1622
mbed_official 630:825f75ca301e 1623 /* Set the new sample time */
mbed_official 630:825f75ca301e 1624 hadc->Instance->SMPR |= ADC_SMPR_SET(sConfig->SamplingTime);
mbed_official 630:825f75ca301e 1625 }
mbed_official 340:28d1f895c6fe 1626 }
mbed_official 630:825f75ca301e 1627
mbed_official 630:825f75ca301e 1628 /* Management of internal measurement channels: VrefInt/TempSensor/Vbat */
mbed_official 340:28d1f895c6fe 1629 /* internal measurement paths enable: If internal channel selected, */
mbed_official 340:28d1f895c6fe 1630 /* enable dedicated internal buffers and path. */
mbed_official 630:825f75ca301e 1631 /* Note: these internal measurement paths can be disabled using */
mbed_official 630:825f75ca301e 1632 /* HAL_ADC_DeInit() or removing the channel from sequencer with */
mbed_official 630:825f75ca301e 1633 /* channel configuration parameter "Rank". */
mbed_official 630:825f75ca301e 1634 if(ADC_IS_CHANNEL_INTERNAL(sConfig->Channel))
mbed_official 340:28d1f895c6fe 1635 {
mbed_official 630:825f75ca301e 1636 /* If Channel_16 is selected, enable Temp. sensor measurement path. */
mbed_official 630:825f75ca301e 1637 /* If Channel_17 is selected, enable VREFINT measurement path. */
mbed_official 630:825f75ca301e 1638 /* If Channel_18 is selected, enable VBAT measurement path. */
mbed_official 630:825f75ca301e 1639 ADC->CCR |= ADC_CHANNEL_INTERNAL_PATH(sConfig->Channel);
mbed_official 340:28d1f895c6fe 1640
mbed_official 630:825f75ca301e 1641 /* If Temp. sensor is selected, wait for stabilization delay */
mbed_official 630:825f75ca301e 1642 if (sConfig->Channel == ADC_CHANNEL_TEMPSENSOR)
mbed_official 340:28d1f895c6fe 1643 {
mbed_official 630:825f75ca301e 1644 /* Delay for temperature sensor stabilization time */
mbed_official 630:825f75ca301e 1645 /* Compute number of CPU cycles to wait for */
mbed_official 630:825f75ca301e 1646 wait_loop_index = (ADC_TEMPSENSOR_DELAY_US * (SystemCoreClock / 1000000));
mbed_official 630:825f75ca301e 1647 while(wait_loop_index != 0)
mbed_official 630:825f75ca301e 1648 {
mbed_official 630:825f75ca301e 1649 wait_loop_index--;
mbed_official 630:825f75ca301e 1650 }
mbed_official 340:28d1f895c6fe 1651 }
mbed_official 340:28d1f895c6fe 1652 }
mbed_official 340:28d1f895c6fe 1653 }
mbed_official 340:28d1f895c6fe 1654 else
mbed_official 340:28d1f895c6fe 1655 {
mbed_official 340:28d1f895c6fe 1656 /* Regular sequence configuration */
mbed_official 340:28d1f895c6fe 1657 /* Reset the channel selection register from the selected channel */
mbed_official 630:825f75ca301e 1658 hadc->Instance->CHSELR &= ~ADC_CHSELR_CHANNEL(sConfig->Channel);
mbed_official 340:28d1f895c6fe 1659
mbed_official 630:825f75ca301e 1660 /* Management of internal measurement channels: VrefInt/TempSensor/Vbat */
mbed_official 340:28d1f895c6fe 1661 /* internal measurement paths disable: If internal channel selected, */
mbed_official 340:28d1f895c6fe 1662 /* disable dedicated internal buffers and path. */
mbed_official 630:825f75ca301e 1663 if(ADC_IS_CHANNEL_INTERNAL(sConfig->Channel))
mbed_official 340:28d1f895c6fe 1664 {
mbed_official 630:825f75ca301e 1665 /* If Channel_16 is selected, disable Temp. sensor measurement path. */
mbed_official 630:825f75ca301e 1666 /* If Channel_17 is selected, disable VREFINT measurement path. */
mbed_official 630:825f75ca301e 1667 /* If Channel_18 is selected, disable VBAT measurement path. */
mbed_official 630:825f75ca301e 1668 ADC->CCR &= ~ADC_CHANNEL_INTERNAL_PATH(sConfig->Channel);
mbed_official 340:28d1f895c6fe 1669 }
mbed_official 340:28d1f895c6fe 1670 }
mbed_official 630:825f75ca301e 1671
mbed_official 340:28d1f895c6fe 1672 }
mbed_official 340:28d1f895c6fe 1673
mbed_official 340:28d1f895c6fe 1674 /* If a conversion is on going on regular group, no update on regular */
mbed_official 340:28d1f895c6fe 1675 /* channel could be done on neither of the channel configuration structure */
mbed_official 340:28d1f895c6fe 1676 /* parameters. */
mbed_official 340:28d1f895c6fe 1677 else
mbed_official 340:28d1f895c6fe 1678 {
mbed_official 340:28d1f895c6fe 1679 /* Update ADC state machine to error */
mbed_official 630:825f75ca301e 1680 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
mbed_official 340:28d1f895c6fe 1681
mbed_official 630:825f75ca301e 1682 tmp_hal_status = HAL_ERROR;
mbed_official 340:28d1f895c6fe 1683 }
mbed_official 340:28d1f895c6fe 1684
mbed_official 340:28d1f895c6fe 1685 /* Process unlocked */
mbed_official 340:28d1f895c6fe 1686 __HAL_UNLOCK(hadc);
mbed_official 340:28d1f895c6fe 1687
mbed_official 340:28d1f895c6fe 1688 /* Return function status */
mbed_official 630:825f75ca301e 1689 return tmp_hal_status;
mbed_official 340:28d1f895c6fe 1690 }
mbed_official 340:28d1f895c6fe 1691
mbed_official 340:28d1f895c6fe 1692
mbed_official 340:28d1f895c6fe 1693 /**
mbed_official 340:28d1f895c6fe 1694 * @brief Configures the analog watchdog.
mbed_official 340:28d1f895c6fe 1695 * @note Possibility to update parameters on the fly:
mbed_official 340:28d1f895c6fe 1696 * This function initializes the selected analog watchdog, following
mbed_official 340:28d1f895c6fe 1697 * calls to this function can be used to reconfigure some parameters
mbed_official 340:28d1f895c6fe 1698 * of structure "ADC_AnalogWDGConfTypeDef" on the fly, without reseting
mbed_official 340:28d1f895c6fe 1699 * the ADC.
mbed_official 340:28d1f895c6fe 1700 * The setting of these parameters is conditioned to ADC state.
mbed_official 340:28d1f895c6fe 1701 * For parameters constraints, see comments of structure
mbed_official 340:28d1f895c6fe 1702 * "ADC_AnalogWDGConfTypeDef".
mbed_official 340:28d1f895c6fe 1703 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1704 * @param AnalogWDGConfig: Structure of ADC analog watchdog configuration
mbed_official 340:28d1f895c6fe 1705 * @retval HAL status
mbed_official 340:28d1f895c6fe 1706 */
mbed_official 340:28d1f895c6fe 1707 HAL_StatusTypeDef HAL_ADC_AnalogWDGConfig(ADC_HandleTypeDef* hadc, ADC_AnalogWDGConfTypeDef* AnalogWDGConfig)
mbed_official 340:28d1f895c6fe 1708 {
mbed_official 630:825f75ca301e 1709 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
mbed_official 340:28d1f895c6fe 1710
mbed_official 340:28d1f895c6fe 1711 uint32_t tmpAWDHighThresholdShifted;
mbed_official 340:28d1f895c6fe 1712 uint32_t tmpAWDLowThresholdShifted;
mbed_official 340:28d1f895c6fe 1713
mbed_official 340:28d1f895c6fe 1714 /* Check the parameters */
mbed_official 340:28d1f895c6fe 1715 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 630:825f75ca301e 1716 assert_param(IS_ADC_ANALOG_WATCHDOG_MODE(AnalogWDGConfig->WatchdogMode));
mbed_official 340:28d1f895c6fe 1717 assert_param(IS_FUNCTIONAL_STATE(AnalogWDGConfig->ITMode));
mbed_official 340:28d1f895c6fe 1718
mbed_official 340:28d1f895c6fe 1719 /* Verify if threshold is within the selected ADC resolution */
mbed_official 630:825f75ca301e 1720 assert_param(IS_ADC_RANGE(ADC_GET_RESOLUTION(hadc), AnalogWDGConfig->HighThreshold));
mbed_official 630:825f75ca301e 1721 assert_param(IS_ADC_RANGE(ADC_GET_RESOLUTION(hadc), AnalogWDGConfig->LowThreshold));
mbed_official 340:28d1f895c6fe 1722
mbed_official 441:d2c15dda23c1 1723 if(AnalogWDGConfig->WatchdogMode == ADC_ANALOGWATCHDOG_SINGLE_REG)
mbed_official 441:d2c15dda23c1 1724 {
mbed_official 441:d2c15dda23c1 1725 assert_param(IS_ADC_CHANNEL(AnalogWDGConfig->Channel));
mbed_official 441:d2c15dda23c1 1726 }
mbed_official 441:d2c15dda23c1 1727
mbed_official 340:28d1f895c6fe 1728 /* Process locked */
mbed_official 340:28d1f895c6fe 1729 __HAL_LOCK(hadc);
mbed_official 340:28d1f895c6fe 1730
mbed_official 340:28d1f895c6fe 1731 /* Parameters update conditioned to ADC state: */
mbed_official 340:28d1f895c6fe 1732 /* Parameters that can be updated when ADC is disabled or enabled without */
mbed_official 340:28d1f895c6fe 1733 /* conversion on going on regular group: */
mbed_official 340:28d1f895c6fe 1734 /* - Analog watchdog channels */
mbed_official 340:28d1f895c6fe 1735 /* - Analog watchdog thresholds */
mbed_official 630:825f75ca301e 1736 if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) == RESET)
mbed_official 340:28d1f895c6fe 1737 {
mbed_official 340:28d1f895c6fe 1738 /* Configuration of analog watchdog: */
mbed_official 340:28d1f895c6fe 1739 /* - Set the analog watchdog enable mode: one or overall group of */
mbed_official 340:28d1f895c6fe 1740 /* channels. */
mbed_official 340:28d1f895c6fe 1741 /* - Set the Analog watchdog channel (is not used if watchdog */
mbed_official 340:28d1f895c6fe 1742 /* mode "all channels": ADC_CFGR_AWD1SGL=0). */
mbed_official 340:28d1f895c6fe 1743 hadc->Instance->CFGR1 &= ~( ADC_CFGR1_AWDSGL |
mbed_official 340:28d1f895c6fe 1744 ADC_CFGR1_AWDEN |
mbed_official 340:28d1f895c6fe 1745 ADC_CFGR1_AWDCH );
mbed_official 340:28d1f895c6fe 1746
mbed_official 630:825f75ca301e 1747 hadc->Instance->CFGR1 |= ( AnalogWDGConfig->WatchdogMode |
mbed_official 630:825f75ca301e 1748 ADC_CFGR_AWDCH(AnalogWDGConfig->Channel) );
mbed_official 340:28d1f895c6fe 1749
mbed_official 340:28d1f895c6fe 1750 /* Shift the offset in function of the selected ADC resolution: Thresholds*/
mbed_official 340:28d1f895c6fe 1751 /* have to be left-aligned on bit 11, the LSB (right bits) are set to 0 */
mbed_official 630:825f75ca301e 1752 tmpAWDHighThresholdShifted = ADC_AWD1THRESHOLD_SHIFT_RESOLUTION(hadc, AnalogWDGConfig->HighThreshold);
mbed_official 630:825f75ca301e 1753 tmpAWDLowThresholdShifted = ADC_AWD1THRESHOLD_SHIFT_RESOLUTION(hadc, AnalogWDGConfig->LowThreshold);
mbed_official 340:28d1f895c6fe 1754
mbed_official 340:28d1f895c6fe 1755 /* Set the high and low thresholds */
mbed_official 340:28d1f895c6fe 1756 hadc->Instance->TR &= ~(ADC_TR_HT | ADC_TR_LT);
mbed_official 630:825f75ca301e 1757 hadc->Instance->TR |= ( ADC_TRX_HIGHTHRESHOLD (tmpAWDHighThresholdShifted) |
mbed_official 630:825f75ca301e 1758 tmpAWDLowThresholdShifted );
mbed_official 340:28d1f895c6fe 1759
mbed_official 441:d2c15dda23c1 1760 /* Clear the ADC Analog watchdog flag (in case of left enabled by */
mbed_official 340:28d1f895c6fe 1761 /* previous ADC operations) to be ready to use for HAL_ADC_IRQHandler() */
mbed_official 340:28d1f895c6fe 1762 /* or HAL_ADC_PollForEvent(). */
mbed_official 340:28d1f895c6fe 1763 __HAL_ADC_CLEAR_FLAG(hadc, ADC_IT_AWD);
mbed_official 340:28d1f895c6fe 1764
mbed_official 340:28d1f895c6fe 1765 /* Configure ADC Analog watchdog interrupt */
mbed_official 340:28d1f895c6fe 1766 if(AnalogWDGConfig->ITMode == ENABLE)
mbed_official 340:28d1f895c6fe 1767 {
mbed_official 340:28d1f895c6fe 1768 /* Enable the ADC Analog watchdog interrupt */
mbed_official 340:28d1f895c6fe 1769 __HAL_ADC_ENABLE_IT(hadc, ADC_IT_AWD);
mbed_official 340:28d1f895c6fe 1770 }
mbed_official 340:28d1f895c6fe 1771 else
mbed_official 340:28d1f895c6fe 1772 {
mbed_official 340:28d1f895c6fe 1773 /* Disable the ADC Analog watchdog interrupt */
mbed_official 340:28d1f895c6fe 1774 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_AWD);
mbed_official 340:28d1f895c6fe 1775 }
mbed_official 340:28d1f895c6fe 1776
mbed_official 340:28d1f895c6fe 1777 }
mbed_official 340:28d1f895c6fe 1778 /* If a conversion is on going on regular group, no update could be done */
mbed_official 340:28d1f895c6fe 1779 /* on neither of the AWD configuration structure parameters. */
mbed_official 340:28d1f895c6fe 1780 else
mbed_official 340:28d1f895c6fe 1781 {
mbed_official 340:28d1f895c6fe 1782 /* Update ADC state machine to error */
mbed_official 630:825f75ca301e 1783 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
mbed_official 340:28d1f895c6fe 1784
mbed_official 630:825f75ca301e 1785 tmp_hal_status = HAL_ERROR;
mbed_official 340:28d1f895c6fe 1786 }
mbed_official 340:28d1f895c6fe 1787
mbed_official 340:28d1f895c6fe 1788
mbed_official 340:28d1f895c6fe 1789 /* Process unlocked */
mbed_official 340:28d1f895c6fe 1790 __HAL_UNLOCK(hadc);
mbed_official 340:28d1f895c6fe 1791
mbed_official 340:28d1f895c6fe 1792 /* Return function status */
mbed_official 630:825f75ca301e 1793 return tmp_hal_status;
mbed_official 340:28d1f895c6fe 1794 }
mbed_official 340:28d1f895c6fe 1795
mbed_official 340:28d1f895c6fe 1796
mbed_official 340:28d1f895c6fe 1797 /**
mbed_official 340:28d1f895c6fe 1798 * @}
mbed_official 340:28d1f895c6fe 1799 */
mbed_official 340:28d1f895c6fe 1800
mbed_official 340:28d1f895c6fe 1801
mbed_official 340:28d1f895c6fe 1802 /** @defgroup ADC_Exported_Functions_Group4 Peripheral State functions
mbed_official 340:28d1f895c6fe 1803 * @brief Peripheral State functions
mbed_official 340:28d1f895c6fe 1804 *
mbed_official 340:28d1f895c6fe 1805 @verbatim
mbed_official 340:28d1f895c6fe 1806 ===============================================================================
mbed_official 340:28d1f895c6fe 1807 ##### Peripheral State and Errors functions #####
mbed_official 340:28d1f895c6fe 1808 ===============================================================================
mbed_official 340:28d1f895c6fe 1809 [..]
mbed_official 340:28d1f895c6fe 1810 This subsection provides functions to get in run-time the status of the
mbed_official 340:28d1f895c6fe 1811 peripheral.
mbed_official 340:28d1f895c6fe 1812 (+) Check the ADC state
mbed_official 340:28d1f895c6fe 1813 (+) Check the ADC error code
mbed_official 340:28d1f895c6fe 1814
mbed_official 340:28d1f895c6fe 1815 @endverbatim
mbed_official 340:28d1f895c6fe 1816 * @{
mbed_official 340:28d1f895c6fe 1817 */
mbed_official 340:28d1f895c6fe 1818
mbed_official 340:28d1f895c6fe 1819 /**
mbed_official 340:28d1f895c6fe 1820 * @brief return the ADC state
mbed_official 340:28d1f895c6fe 1821 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1822 * @retval HAL state
mbed_official 340:28d1f895c6fe 1823 */
mbed_official 630:825f75ca301e 1824 uint32_t HAL_ADC_GetState(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 1825 {
mbed_official 340:28d1f895c6fe 1826 /* Check the parameters */
mbed_official 340:28d1f895c6fe 1827 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 1828
mbed_official 340:28d1f895c6fe 1829 /* Return ADC state */
mbed_official 340:28d1f895c6fe 1830 return hadc->State;
mbed_official 340:28d1f895c6fe 1831 }
mbed_official 340:28d1f895c6fe 1832
mbed_official 340:28d1f895c6fe 1833 /**
mbed_official 340:28d1f895c6fe 1834 * @brief Return the ADC error code
mbed_official 340:28d1f895c6fe 1835 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1836 * @retval ADC Error Code
mbed_official 340:28d1f895c6fe 1837 */
mbed_official 340:28d1f895c6fe 1838 uint32_t HAL_ADC_GetError(ADC_HandleTypeDef *hadc)
mbed_official 340:28d1f895c6fe 1839 {
mbed_official 340:28d1f895c6fe 1840 return hadc->ErrorCode;
mbed_official 340:28d1f895c6fe 1841 }
mbed_official 340:28d1f895c6fe 1842
mbed_official 340:28d1f895c6fe 1843 /**
mbed_official 340:28d1f895c6fe 1844 * @}
mbed_official 340:28d1f895c6fe 1845 */
mbed_official 340:28d1f895c6fe 1846
mbed_official 340:28d1f895c6fe 1847 /**
mbed_official 340:28d1f895c6fe 1848 * @}
mbed_official 340:28d1f895c6fe 1849 */
mbed_official 340:28d1f895c6fe 1850
mbed_official 340:28d1f895c6fe 1851 /** @defgroup ADC_Private_Functions ADC Private Functions
mbed_official 340:28d1f895c6fe 1852 * @{
mbed_official 340:28d1f895c6fe 1853 */
mbed_official 340:28d1f895c6fe 1854
mbed_official 340:28d1f895c6fe 1855 /**
mbed_official 340:28d1f895c6fe 1856 * @brief Enable the selected ADC.
mbed_official 340:28d1f895c6fe 1857 * @note Prerequisite condition to use this function: ADC must be disabled
mbed_official 340:28d1f895c6fe 1858 * and voltage regulator must be enabled (done into HAL_ADC_Init()).
mbed_official 630:825f75ca301e 1859 * @note If low power mode AutoPowerOff is enabled, power-on/off phases are
mbed_official 630:825f75ca301e 1860 * performed automatically by hardware.
mbed_official 630:825f75ca301e 1861 * In this mode, this function is useless and must not be called because
mbed_official 630:825f75ca301e 1862 * flag ADC_FLAG_RDY is not usable.
mbed_official 630:825f75ca301e 1863 * Therefore, this function must be called under condition of
mbed_official 630:825f75ca301e 1864 * "if (hadc->Init.LowPowerAutoPowerOff != ENABLE)".
mbed_official 340:28d1f895c6fe 1865 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1866 * @retval HAL status.
mbed_official 340:28d1f895c6fe 1867 */
mbed_official 340:28d1f895c6fe 1868 static HAL_StatusTypeDef ADC_Enable(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 1869 {
mbed_official 340:28d1f895c6fe 1870 uint32_t tickstart = 0;
mbed_official 340:28d1f895c6fe 1871 __IO uint32_t wait_loop_index = 0;
mbed_official 340:28d1f895c6fe 1872
mbed_official 340:28d1f895c6fe 1873 /* ADC enable and wait for ADC ready (in case of ADC is disabled or */
mbed_official 340:28d1f895c6fe 1874 /* enabling phase not yet completed: flag ADC ready not yet set). */
mbed_official 340:28d1f895c6fe 1875 /* Timeout implemented to not be stuck if ADC cannot be enabled (possible */
mbed_official 340:28d1f895c6fe 1876 /* causes: ADC clock not running, ...). */
mbed_official 630:825f75ca301e 1877 if (ADC_IS_ENABLE(hadc) == RESET)
mbed_official 340:28d1f895c6fe 1878 {
mbed_official 340:28d1f895c6fe 1879 /* Check if conditions to enable the ADC are fulfilled */
mbed_official 630:825f75ca301e 1880 if (ADC_ENABLING_CONDITIONS(hadc) == RESET)
mbed_official 340:28d1f895c6fe 1881 {
mbed_official 340:28d1f895c6fe 1882 /* Update ADC state machine to error */
mbed_official 630:825f75ca301e 1883 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
mbed_official 630:825f75ca301e 1884
mbed_official 340:28d1f895c6fe 1885 /* Set ADC error code to ADC IP internal error */
mbed_official 630:825f75ca301e 1886 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
mbed_official 340:28d1f895c6fe 1887
mbed_official 340:28d1f895c6fe 1888 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 1889 }
mbed_official 340:28d1f895c6fe 1890
mbed_official 340:28d1f895c6fe 1891 /* Enable the ADC peripheral */
mbed_official 340:28d1f895c6fe 1892 __HAL_ADC_ENABLE(hadc);
mbed_official 340:28d1f895c6fe 1893
mbed_official 630:825f75ca301e 1894 /* Delay for ADC stabilization time */
mbed_official 630:825f75ca301e 1895 /* Compute number of CPU cycles to wait for */
mbed_official 630:825f75ca301e 1896 wait_loop_index = (ADC_STAB_DELAY_US * (SystemCoreClock / 1000000));
mbed_official 630:825f75ca301e 1897 while(wait_loop_index != 0)
mbed_official 340:28d1f895c6fe 1898 {
mbed_official 630:825f75ca301e 1899 wait_loop_index--;
mbed_official 630:825f75ca301e 1900 }
mbed_official 340:28d1f895c6fe 1901
mbed_official 630:825f75ca301e 1902 /* Get tick count */
mbed_official 340:28d1f895c6fe 1903 tickstart = HAL_GetTick();
mbed_official 340:28d1f895c6fe 1904
mbed_official 340:28d1f895c6fe 1905 /* Wait for ADC effectively enabled */
mbed_official 340:28d1f895c6fe 1906 while(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_RDY) == RESET)
mbed_official 340:28d1f895c6fe 1907 {
mbed_official 340:28d1f895c6fe 1908 if((HAL_GetTick() - tickstart) > ADC_ENABLE_TIMEOUT)
mbed_official 340:28d1f895c6fe 1909 {
mbed_official 340:28d1f895c6fe 1910 /* Update ADC state machine to error */
mbed_official 630:825f75ca301e 1911 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
mbed_official 630:825f75ca301e 1912
mbed_official 340:28d1f895c6fe 1913 /* Set ADC error code to ADC IP internal error */
mbed_official 630:825f75ca301e 1914 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
mbed_official 340:28d1f895c6fe 1915
mbed_official 340:28d1f895c6fe 1916 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 1917 }
mbed_official 340:28d1f895c6fe 1918 }
mbed_official 340:28d1f895c6fe 1919
mbed_official 340:28d1f895c6fe 1920 }
mbed_official 340:28d1f895c6fe 1921
mbed_official 340:28d1f895c6fe 1922 /* Return HAL status */
mbed_official 340:28d1f895c6fe 1923 return HAL_OK;
mbed_official 340:28d1f895c6fe 1924 }
mbed_official 340:28d1f895c6fe 1925
mbed_official 340:28d1f895c6fe 1926 /**
mbed_official 340:28d1f895c6fe 1927 * @brief Disable the selected ADC.
mbed_official 340:28d1f895c6fe 1928 * @note Prerequisite condition to use this function: ADC conversions must be
mbed_official 340:28d1f895c6fe 1929 * stopped.
mbed_official 340:28d1f895c6fe 1930 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1931 * @retval HAL status.
mbed_official 340:28d1f895c6fe 1932 */
mbed_official 340:28d1f895c6fe 1933 static HAL_StatusTypeDef ADC_Disable(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 1934 {
mbed_official 340:28d1f895c6fe 1935 uint32_t tickstart = 0;
mbed_official 340:28d1f895c6fe 1936
mbed_official 340:28d1f895c6fe 1937 /* Verification if ADC is not already disabled: */
mbed_official 630:825f75ca301e 1938 /* Note: forbidden to disable ADC (set bit ADC_CR_ADDIS) if ADC is already */
mbed_official 630:825f75ca301e 1939 /* disabled. */
mbed_official 630:825f75ca301e 1940 if (ADC_IS_ENABLE(hadc) != RESET)
mbed_official 340:28d1f895c6fe 1941 {
mbed_official 340:28d1f895c6fe 1942 /* Check if conditions to disable the ADC are fulfilled */
mbed_official 630:825f75ca301e 1943 if (ADC_DISABLING_CONDITIONS(hadc) != RESET)
mbed_official 340:28d1f895c6fe 1944 {
mbed_official 340:28d1f895c6fe 1945 /* Disable the ADC peripheral */
mbed_official 340:28d1f895c6fe 1946 __HAL_ADC_DISABLE(hadc);
mbed_official 340:28d1f895c6fe 1947 }
mbed_official 340:28d1f895c6fe 1948 else
mbed_official 340:28d1f895c6fe 1949 {
mbed_official 340:28d1f895c6fe 1950 /* Update ADC state machine to error */
mbed_official 630:825f75ca301e 1951 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
mbed_official 630:825f75ca301e 1952
mbed_official 340:28d1f895c6fe 1953 /* Set ADC error code to ADC IP internal error */
mbed_official 630:825f75ca301e 1954 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
mbed_official 340:28d1f895c6fe 1955
mbed_official 340:28d1f895c6fe 1956 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 1957 }
mbed_official 340:28d1f895c6fe 1958
mbed_official 340:28d1f895c6fe 1959 /* Wait for ADC effectively disabled */
mbed_official 630:825f75ca301e 1960 /* Get tick count */
mbed_official 340:28d1f895c6fe 1961 tickstart = HAL_GetTick();
mbed_official 340:28d1f895c6fe 1962
mbed_official 340:28d1f895c6fe 1963 while(HAL_IS_BIT_SET(hadc->Instance->CR, ADC_CR_ADEN))
mbed_official 340:28d1f895c6fe 1964 {
mbed_official 630:825f75ca301e 1965 if((HAL_GetTick() - tickstart) > ADC_DISABLE_TIMEOUT)
mbed_official 340:28d1f895c6fe 1966 {
mbed_official 340:28d1f895c6fe 1967 /* Update ADC state machine to error */
mbed_official 630:825f75ca301e 1968 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
mbed_official 630:825f75ca301e 1969
mbed_official 340:28d1f895c6fe 1970 /* Set ADC error code to ADC IP internal error */
mbed_official 630:825f75ca301e 1971 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
mbed_official 340:28d1f895c6fe 1972
mbed_official 340:28d1f895c6fe 1973 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 1974 }
mbed_official 340:28d1f895c6fe 1975 }
mbed_official 340:28d1f895c6fe 1976 }
mbed_official 340:28d1f895c6fe 1977
mbed_official 340:28d1f895c6fe 1978 /* Return HAL status */
mbed_official 340:28d1f895c6fe 1979 return HAL_OK;
mbed_official 340:28d1f895c6fe 1980 }
mbed_official 340:28d1f895c6fe 1981
mbed_official 340:28d1f895c6fe 1982
mbed_official 340:28d1f895c6fe 1983 /**
mbed_official 340:28d1f895c6fe 1984 * @brief Stop ADC conversion.
mbed_official 340:28d1f895c6fe 1985 * @note Prerequisite condition to use this function: ADC conversions must be
mbed_official 340:28d1f895c6fe 1986 * stopped to disable the ADC.
mbed_official 340:28d1f895c6fe 1987 * @param hadc: ADC handle
mbed_official 340:28d1f895c6fe 1988 * @retval HAL status.
mbed_official 340:28d1f895c6fe 1989 */
mbed_official 340:28d1f895c6fe 1990 static HAL_StatusTypeDef ADC_ConversionStop(ADC_HandleTypeDef* hadc)
mbed_official 340:28d1f895c6fe 1991 {
mbed_official 340:28d1f895c6fe 1992 uint32_t tickstart = 0;
mbed_official 340:28d1f895c6fe 1993
mbed_official 340:28d1f895c6fe 1994 /* Check the parameters */
mbed_official 340:28d1f895c6fe 1995 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 340:28d1f895c6fe 1996
mbed_official 340:28d1f895c6fe 1997 /* Verification if ADC is not already stopped on regular group to bypass */
mbed_official 340:28d1f895c6fe 1998 /* this function if not needed. */
mbed_official 630:825f75ca301e 1999 if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc))
mbed_official 340:28d1f895c6fe 2000 {
mbed_official 340:28d1f895c6fe 2001
mbed_official 340:28d1f895c6fe 2002 /* Stop potential conversion on going on regular group */
mbed_official 340:28d1f895c6fe 2003 /* Software is allowed to set ADSTP only when ADSTART=1 and ADDIS=0 */
mbed_official 340:28d1f895c6fe 2004 if (HAL_IS_BIT_SET(hadc->Instance->CR, ADC_CR_ADSTART) &&
mbed_official 340:28d1f895c6fe 2005 HAL_IS_BIT_CLR(hadc->Instance->CR, ADC_CR_ADDIS) )
mbed_official 340:28d1f895c6fe 2006 {
mbed_official 340:28d1f895c6fe 2007 /* Stop conversions on regular group */
mbed_official 340:28d1f895c6fe 2008 hadc->Instance->CR |= ADC_CR_ADSTP;
mbed_official 340:28d1f895c6fe 2009 }
mbed_official 340:28d1f895c6fe 2010
mbed_official 340:28d1f895c6fe 2011 /* Wait for conversion effectively stopped */
mbed_official 630:825f75ca301e 2012 /* Get tick count */
mbed_official 340:28d1f895c6fe 2013 tickstart = HAL_GetTick();
mbed_official 340:28d1f895c6fe 2014
mbed_official 340:28d1f895c6fe 2015 while((hadc->Instance->CR & ADC_CR_ADSTART) != RESET)
mbed_official 340:28d1f895c6fe 2016 {
mbed_official 340:28d1f895c6fe 2017 if((HAL_GetTick() - tickstart) > ADC_STOP_CONVERSION_TIMEOUT)
mbed_official 340:28d1f895c6fe 2018 {
mbed_official 340:28d1f895c6fe 2019 /* Update ADC state machine to error */
mbed_official 630:825f75ca301e 2020 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
mbed_official 630:825f75ca301e 2021
mbed_official 340:28d1f895c6fe 2022 /* Set ADC error code to ADC IP internal error */
mbed_official 630:825f75ca301e 2023 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
mbed_official 340:28d1f895c6fe 2024
mbed_official 340:28d1f895c6fe 2025 return HAL_ERROR;
mbed_official 340:28d1f895c6fe 2026 }
mbed_official 340:28d1f895c6fe 2027 }
mbed_official 340:28d1f895c6fe 2028
mbed_official 340:28d1f895c6fe 2029 }
mbed_official 340:28d1f895c6fe 2030
mbed_official 340:28d1f895c6fe 2031 /* Return HAL status */
mbed_official 340:28d1f895c6fe 2032 return HAL_OK;
mbed_official 340:28d1f895c6fe 2033 }
mbed_official 340:28d1f895c6fe 2034
mbed_official 630:825f75ca301e 2035
mbed_official 630:825f75ca301e 2036 /**
mbed_official 630:825f75ca301e 2037 * @brief DMA transfer complete callback.
mbed_official 630:825f75ca301e 2038 * @param hdma: pointer to DMA handle.
mbed_official 630:825f75ca301e 2039 * @retval None
mbed_official 630:825f75ca301e 2040 */
mbed_official 630:825f75ca301e 2041 static void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma)
mbed_official 630:825f75ca301e 2042 {
mbed_official 630:825f75ca301e 2043 /* Retrieve ADC handle corresponding to current DMA handle */
mbed_official 630:825f75ca301e 2044 ADC_HandleTypeDef* hadc = ( ADC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 630:825f75ca301e 2045
mbed_official 630:825f75ca301e 2046 /* Update state machine on conversion status if not in error state */
mbed_official 630:825f75ca301e 2047 if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL | HAL_ADC_STATE_ERROR_DMA))
mbed_official 630:825f75ca301e 2048 {
mbed_official 630:825f75ca301e 2049 /* Set ADC state */
mbed_official 630:825f75ca301e 2050 SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
mbed_official 630:825f75ca301e 2051
mbed_official 630:825f75ca301e 2052 /* Determine whether any further conversion upcoming on group regular */
mbed_official 630:825f75ca301e 2053 /* by external trigger, continuous mode or scan sequence on going. */
mbed_official 630:825f75ca301e 2054 if(ADC_IS_SOFTWARE_START_REGULAR(hadc) &&
mbed_official 630:825f75ca301e 2055 (hadc->Init.ContinuousConvMode == DISABLE) )
mbed_official 630:825f75ca301e 2056 {
mbed_official 630:825f75ca301e 2057 /* If End of Sequence is reached, disable interrupts */
mbed_official 630:825f75ca301e 2058 if( __HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOS) )
mbed_official 630:825f75ca301e 2059 {
mbed_official 630:825f75ca301e 2060 /* Allowed to modify bits ADC_IT_EOC/ADC_IT_EOS only if bit */
mbed_official 630:825f75ca301e 2061 /* ADSTART==0 (no conversion on going) */
mbed_official 630:825f75ca301e 2062 if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) == RESET)
mbed_official 630:825f75ca301e 2063 {
mbed_official 630:825f75ca301e 2064 /* Disable ADC end of single conversion interrupt on group regular */
mbed_official 630:825f75ca301e 2065 /* Note: Overrun interrupt was enabled with EOC interrupt in */
mbed_official 630:825f75ca301e 2066 /* HAL_Start_IT(), but is not disabled here because can be used */
mbed_official 630:825f75ca301e 2067 /* by overrun IRQ process below. */
mbed_official 630:825f75ca301e 2068 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC | ADC_IT_EOS);
mbed_official 630:825f75ca301e 2069
mbed_official 630:825f75ca301e 2070 /* Set ADC state */
mbed_official 630:825f75ca301e 2071 ADC_STATE_CLR_SET(hadc->State,
mbed_official 630:825f75ca301e 2072 HAL_ADC_STATE_REG_BUSY,
mbed_official 630:825f75ca301e 2073 HAL_ADC_STATE_READY);
mbed_official 630:825f75ca301e 2074 }
mbed_official 630:825f75ca301e 2075 else
mbed_official 630:825f75ca301e 2076 {
mbed_official 630:825f75ca301e 2077 /* Change ADC state to error state */
mbed_official 630:825f75ca301e 2078 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
mbed_official 630:825f75ca301e 2079
mbed_official 630:825f75ca301e 2080 /* Set ADC error code to ADC IP internal error */
mbed_official 630:825f75ca301e 2081 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
mbed_official 630:825f75ca301e 2082 }
mbed_official 630:825f75ca301e 2083 }
mbed_official 630:825f75ca301e 2084 }
mbed_official 630:825f75ca301e 2085
mbed_official 630:825f75ca301e 2086 /* Conversion complete callback */
mbed_official 630:825f75ca301e 2087 HAL_ADC_ConvCpltCallback(hadc);
mbed_official 630:825f75ca301e 2088 }
mbed_official 630:825f75ca301e 2089 else
mbed_official 630:825f75ca301e 2090 {
mbed_official 630:825f75ca301e 2091 /* Call DMA error callback */
mbed_official 630:825f75ca301e 2092 hadc->DMA_Handle->XferErrorCallback(hdma);
mbed_official 630:825f75ca301e 2093 }
mbed_official 630:825f75ca301e 2094
mbed_official 630:825f75ca301e 2095 }
mbed_official 630:825f75ca301e 2096
mbed_official 630:825f75ca301e 2097 /**
mbed_official 630:825f75ca301e 2098 * @brief DMA half transfer complete callback.
mbed_official 630:825f75ca301e 2099 * @param hdma: pointer to DMA handle.
mbed_official 630:825f75ca301e 2100 * @retval None
mbed_official 630:825f75ca301e 2101 */
mbed_official 630:825f75ca301e 2102 static void ADC_DMAHalfConvCplt(DMA_HandleTypeDef *hdma)
mbed_official 630:825f75ca301e 2103 {
mbed_official 630:825f75ca301e 2104 /* Retrieve ADC handle corresponding to current DMA handle */
mbed_official 630:825f75ca301e 2105 ADC_HandleTypeDef* hadc = ( ADC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 630:825f75ca301e 2106
mbed_official 630:825f75ca301e 2107 /* Half conversion callback */
mbed_official 630:825f75ca301e 2108 HAL_ADC_ConvHalfCpltCallback(hadc);
mbed_official 630:825f75ca301e 2109 }
mbed_official 630:825f75ca301e 2110
mbed_official 630:825f75ca301e 2111 /**
mbed_official 630:825f75ca301e 2112 * @brief DMA error callback
mbed_official 630:825f75ca301e 2113 * @param hdma: pointer to DMA handle.
mbed_official 630:825f75ca301e 2114 * @retval None
mbed_official 630:825f75ca301e 2115 */
mbed_official 630:825f75ca301e 2116 static void ADC_DMAError(DMA_HandleTypeDef *hdma)
mbed_official 630:825f75ca301e 2117 {
mbed_official 630:825f75ca301e 2118 /* Retrieve ADC handle corresponding to current DMA handle */
mbed_official 630:825f75ca301e 2119 ADC_HandleTypeDef* hadc = ( ADC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
mbed_official 630:825f75ca301e 2120
mbed_official 630:825f75ca301e 2121 /* Set ADC state */
mbed_official 630:825f75ca301e 2122 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_DMA);
mbed_official 630:825f75ca301e 2123
mbed_official 630:825f75ca301e 2124 /* Set ADC error code to DMA error */
mbed_official 630:825f75ca301e 2125 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_DMA);
mbed_official 630:825f75ca301e 2126
mbed_official 630:825f75ca301e 2127 /* Error callback */
mbed_official 630:825f75ca301e 2128 HAL_ADC_ErrorCallback(hadc);
mbed_official 630:825f75ca301e 2129 }
mbed_official 630:825f75ca301e 2130
mbed_official 340:28d1f895c6fe 2131 /**
mbed_official 340:28d1f895c6fe 2132 * @}
mbed_official 340:28d1f895c6fe 2133 */
mbed_official 340:28d1f895c6fe 2134
mbed_official 340:28d1f895c6fe 2135 #endif /* HAL_ADC_MODULE_ENABLED */
mbed_official 340:28d1f895c6fe 2136 /**
mbed_official 340:28d1f895c6fe 2137 * @}
mbed_official 340:28d1f895c6fe 2138 */
mbed_official 340:28d1f895c6fe 2139
mbed_official 340:28d1f895c6fe 2140 /**
mbed_official 340:28d1f895c6fe 2141 * @}
mbed_official 340:28d1f895c6fe 2142 */
mbed_official 340:28d1f895c6fe 2143
mbed_official 340:28d1f895c6fe 2144 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/