mbed library sources

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Tue Jan 06 16:15:36 2015 +0000
Revision:
441:d2c15dda23c1
Parent:
392:2b59412bb664
Synchronized with git revision 245a60b29caabb42eabdd19658eeac7c3f68313b

Full URL: https://github.com/mbedmicro/mbed/commit/245a60b29caabb42eabdd19658eeac7c3f68313b/

NUCLEO_F072RB/F091RC - adding target to rtos lib and exporter for coide and gcc_arm

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