| 1 | /**
|
|---|
| 2 | ******************************************************************************
|
|---|
| 3 | * @file stm32g0xx_hal_adc.c
|
|---|
| 4 | * @author MCD Application Team
|
|---|
| 5 | * @brief This file provides firmware functions to manage the following
|
|---|
| 6 | * functionalities of the Analog to Digital Converter (ADC)
|
|---|
| 7 | * peripheral:
|
|---|
| 8 | * + Initialization and de-initialization functions
|
|---|
| 9 | * + Peripheral Control functions
|
|---|
| 10 | * + Peripheral State functions
|
|---|
| 11 | * Other functions (extended functions) are available in file
|
|---|
| 12 | * "stm32g0xx_hal_adc_ex.c".
|
|---|
| 13 | *
|
|---|
| 14 | ******************************************************************************
|
|---|
| 15 | * @attention
|
|---|
| 16 | *
|
|---|
| 17 | * Copyright (c) 2018 STMicroelectronics.
|
|---|
| 18 | * All rights reserved.
|
|---|
| 19 | *
|
|---|
| 20 | * This software is licensed under terms that can be found in the LICENSE file
|
|---|
| 21 | * in the root directory of this software component.
|
|---|
| 22 | * If no LICENSE file comes with this software, it is provided AS-IS.
|
|---|
| 23 | *
|
|---|
| 24 | ******************************************************************************
|
|---|
| 25 | @verbatim
|
|---|
| 26 | ==============================================================================
|
|---|
| 27 | ##### ADC peripheral features #####
|
|---|
| 28 | ==============================================================================
|
|---|
| 29 | [..]
|
|---|
| 30 | (+) 12-bit, 10-bit, 8-bit or 6-bit configurable resolution.
|
|---|
| 31 |
|
|---|
| 32 | (+) Interrupt generation at the end of regular conversion and in case of
|
|---|
| 33 | analog watchdog or overrun events.
|
|---|
| 34 |
|
|---|
| 35 | (+) Single and continuous conversion modes.
|
|---|
| 36 |
|
|---|
| 37 | (+) Scan mode for conversion of several channels sequentially.
|
|---|
| 38 |
|
|---|
| 39 | (+) Data alignment with in-built data coherency.
|
|---|
| 40 |
|
|---|
| 41 | (+) Programmable sampling time (common to group of channels)
|
|---|
| 42 |
|
|---|
| 43 | (+) External trigger (timer or EXTI) with configurable polarity
|
|---|
| 44 |
|
|---|
| 45 | (+) DMA request generation for transfer of conversions data of regular group.
|
|---|
| 46 |
|
|---|
| 47 | (+) ADC calibration
|
|---|
| 48 |
|
|---|
| 49 | (+) ADC conversion of regular group.
|
|---|
| 50 |
|
|---|
| 51 | (+) ADC supply requirements: 1.62 V to 3.6 V.
|
|---|
| 52 |
|
|---|
| 53 | (+) ADC input range: from Vref- (connected to Vssa) to Vref+ (connected to
|
|---|
| 54 | Vdda or to an external voltage reference).
|
|---|
| 55 |
|
|---|
| 56 |
|
|---|
| 57 | ##### How to use this driver #####
|
|---|
| 58 | ==============================================================================
|
|---|
| 59 | [..]
|
|---|
| 60 |
|
|---|
| 61 | *** Configuration of top level parameters related to ADC ***
|
|---|
| 62 | ============================================================
|
|---|
| 63 | [..]
|
|---|
| 64 |
|
|---|
| 65 | (#) Enable the ADC interface
|
|---|
| 66 | (++) As prerequisite, ADC clock must be configured at RCC top level.
|
|---|
| 67 | Caution: On STM32G0, ADC clock frequency max is 35MHz (refer
|
|---|
| 68 | to device datasheet).
|
|---|
| 69 | Therefore, ADC clock source from RCC and ADC clock
|
|---|
| 70 | prescaler must be configured to remain below
|
|---|
| 71 | this maximum frequency.
|
|---|
| 72 |
|
|---|
| 73 | (++) Two clock settings are mandatory:
|
|---|
| 74 | (+++) ADC clock (core clock, also possibly conversion clock).
|
|---|
| 75 |
|
|---|
| 76 | (+++) ADC clock (conversions clock).
|
|---|
| 77 | Four possible clock sources: synchronous clock from APB clock (same as ADC core clock)
|
|---|
| 78 | or asynchronous clock from RCC level: SYSCLK, HSI16, PLLPCLK.
|
|---|
| 79 |
|
|---|
| 80 | (+++) Example:
|
|---|
| 81 | Into HAL_ADC_MspInit() (recommended code location) or with
|
|---|
| 82 | other device clock parameters configuration:
|
|---|
| 83 | (+++) __HAL_RCC_ADC_CLK_ENABLE(); (mandatory: core clock)
|
|---|
| 84 |
|
|---|
| 85 | (++) ADC clock source and clock prescaler are configured at ADC level with
|
|---|
| 86 | parameter "ClockPrescaler" using function HAL_ADC_Init().
|
|---|
| 87 |
|
|---|
| 88 | (#) ADC pins configuration
|
|---|
| 89 | (++) Enable the clock for the ADC GPIOs
|
|---|
| 90 | using macro __HAL_RCC_GPIOx_CLK_ENABLE()
|
|---|
| 91 | (++) Configure these ADC pins in analog mode
|
|---|
| 92 | using function HAL_GPIO_Init()
|
|---|
| 93 |
|
|---|
| 94 | (#) Optionally, in case of usage of ADC with interruptions:
|
|---|
| 95 | (++) Configure the NVIC for ADC
|
|---|
| 96 | using function HAL_NVIC_EnableIRQ(ADCx_IRQn)
|
|---|
| 97 | (++) Insert the ADC interruption handler function HAL_ADC_IRQHandler()
|
|---|
| 98 | into the function of corresponding ADC interruption vector
|
|---|
| 99 | ADCx_IRQHandler().
|
|---|
| 100 |
|
|---|
| 101 | (#) Optionally, in case of usage of DMA:
|
|---|
| 102 | (++) Configure the DMA (DMA channel, mode normal or circular, ...)
|
|---|
| 103 | using function HAL_DMA_Init().
|
|---|
| 104 | (++) Configure the NVIC for DMA
|
|---|
| 105 | using function HAL_NVIC_EnableIRQ(DMAx_Channelx_IRQn)
|
|---|
| 106 | (++) Insert the ADC interruption handler function HAL_ADC_IRQHandler()
|
|---|
| 107 | into the function of corresponding DMA interruption vector
|
|---|
| 108 | DMAx_Channelx_IRQHandler().
|
|---|
| 109 |
|
|---|
| 110 | *** Configuration of ADC, group regular, channels parameters ***
|
|---|
| 111 | ================================================================
|
|---|
| 112 | [..]
|
|---|
| 113 |
|
|---|
| 114 | (#) Configure the ADC parameters (resolution, data alignment, ...)
|
|---|
| 115 | and regular group parameters (conversion trigger, sequencer, ...)
|
|---|
| 116 | using function HAL_ADC_Init().
|
|---|
| 117 |
|
|---|
| 118 | (#) Configure the channels for regular group parameters (channel number,
|
|---|
| 119 | channel rank into sequencer, ..., into regular group)
|
|---|
| 120 | using function HAL_ADC_ConfigChannel().
|
|---|
| 121 |
|
|---|
| 122 | (#) Optionally, configure the analog watchdog parameters (channels
|
|---|
| 123 | monitored, thresholds, ...)
|
|---|
| 124 | using function HAL_ADC_AnalogWDGConfig().
|
|---|
| 125 |
|
|---|
| 126 | *** Execution of ADC conversions ***
|
|---|
| 127 | ====================================
|
|---|
| 128 | [..]
|
|---|
| 129 |
|
|---|
| 130 | (#) Optionally, perform an automatic ADC calibration to improve the
|
|---|
| 131 | conversion accuracy
|
|---|
| 132 | using function HAL_ADCEx_Calibration_Start().
|
|---|
| 133 |
|
|---|
| 134 | (#) ADC driver can be used among three modes: polling, interruption,
|
|---|
| 135 | transfer by DMA.
|
|---|
| 136 |
|
|---|
| 137 | (++) ADC conversion by polling:
|
|---|
| 138 | (+++) Activate the ADC peripheral and start conversions
|
|---|
| 139 | using function HAL_ADC_Start()
|
|---|
| 140 | (+++) Wait for ADC conversion completion
|
|---|
| 141 | using function HAL_ADC_PollForConversion()
|
|---|
| 142 | (+++) Retrieve conversion results
|
|---|
| 143 | using function HAL_ADC_GetValue()
|
|---|
| 144 | (+++) Stop conversion and disable the ADC peripheral
|
|---|
| 145 | using function HAL_ADC_Stop()
|
|---|
| 146 |
|
|---|
| 147 | (++) ADC conversion by interruption:
|
|---|
| 148 | (+++) Activate the ADC peripheral and start conversions
|
|---|
| 149 | using function HAL_ADC_Start_IT()
|
|---|
| 150 | (+++) Wait for ADC conversion completion by call of function
|
|---|
| 151 | HAL_ADC_ConvCpltCallback()
|
|---|
| 152 | (this function must be implemented in user program)
|
|---|
| 153 | (+++) Retrieve conversion results
|
|---|
| 154 | using function HAL_ADC_GetValue()
|
|---|
| 155 | (+++) Stop conversion and disable the ADC peripheral
|
|---|
| 156 | using function HAL_ADC_Stop_IT()
|
|---|
| 157 |
|
|---|
| 158 | (++) ADC conversion with transfer by DMA:
|
|---|
| 159 | (+++) Activate the ADC peripheral and start conversions
|
|---|
| 160 | using function HAL_ADC_Start_DMA()
|
|---|
| 161 | (+++) Wait for ADC conversion completion by call of function
|
|---|
| 162 | HAL_ADC_ConvCpltCallback() or HAL_ADC_ConvHalfCpltCallback()
|
|---|
| 163 | (these functions must be implemented in user program)
|
|---|
| 164 | (+++) Conversion results are automatically transferred by DMA into
|
|---|
| 165 | destination variable address.
|
|---|
| 166 | (+++) Stop conversion and disable the ADC peripheral
|
|---|
| 167 | using function HAL_ADC_Stop_DMA()
|
|---|
| 168 |
|
|---|
| 169 | [..]
|
|---|
| 170 |
|
|---|
| 171 | (@) Callback functions must be implemented in user program:
|
|---|
| 172 | (+@) HAL_ADC_ErrorCallback()
|
|---|
| 173 | (+@) HAL_ADC_LevelOutOfWindowCallback() (callback of analog watchdog)
|
|---|
| 174 | (+@) HAL_ADC_ConvCpltCallback()
|
|---|
| 175 | (+@) HAL_ADC_ConvHalfCpltCallback
|
|---|
| 176 |
|
|---|
| 177 | *** Deinitialization of ADC ***
|
|---|
| 178 | ============================================================
|
|---|
| 179 | [..]
|
|---|
| 180 |
|
|---|
| 181 | (#) Disable the ADC interface
|
|---|
| 182 | (++) ADC clock can be hard reset and disabled at RCC top level.
|
|---|
| 183 | (++) Hard reset of ADC peripherals
|
|---|
| 184 | using macro __ADCx_FORCE_RESET(), __ADCx_RELEASE_RESET().
|
|---|
| 185 | (++) ADC clock disable
|
|---|
| 186 | using the equivalent macro/functions as configuration step.
|
|---|
| 187 | (+++) Example:
|
|---|
| 188 | Into HAL_ADC_MspDeInit() (recommended code location) or with
|
|---|
| 189 | other device clock parameters configuration:
|
|---|
| 190 | (+++) RCC_OscInitStructure.OscillatorType = RCC_OSCILLATORTYPE_HSI14;
|
|---|
| 191 | (+++) RCC_OscInitStructure.HSI14State = RCC_HSI14_OFF; (if not used for system clock)
|
|---|
| 192 | (+++) HAL_RCC_OscConfig(&RCC_OscInitStructure);
|
|---|
| 193 |
|
|---|
| 194 | (#) ADC pins configuration
|
|---|
| 195 | (++) Disable the clock for the ADC GPIOs
|
|---|
| 196 | using macro __HAL_RCC_GPIOx_CLK_DISABLE()
|
|---|
| 197 |
|
|---|
| 198 | (#) Optionally, in case of usage of ADC with interruptions:
|
|---|
| 199 | (++) Disable the NVIC for ADC
|
|---|
| 200 | using function HAL_NVIC_EnableIRQ(ADCx_IRQn)
|
|---|
| 201 |
|
|---|
| 202 | (#) Optionally, in case of usage of DMA:
|
|---|
| 203 | (++) Deinitialize the DMA
|
|---|
| 204 | using function HAL_DMA_Init().
|
|---|
| 205 | (++) Disable the NVIC for DMA
|
|---|
| 206 | using function HAL_NVIC_EnableIRQ(DMAx_Channelx_IRQn)
|
|---|
| 207 |
|
|---|
| 208 | [..]
|
|---|
| 209 |
|
|---|
| 210 | *** Callback registration ***
|
|---|
| 211 | =============================================
|
|---|
| 212 | [..]
|
|---|
| 213 |
|
|---|
| 214 | The compilation flag USE_HAL_ADC_REGISTER_CALLBACKS, when set to 1,
|
|---|
| 215 | allows the user to configure dynamically the driver callbacks.
|
|---|
| 216 | Use Functions HAL_ADC_RegisterCallback()
|
|---|
| 217 | to register an interrupt callback.
|
|---|
| 218 | [..]
|
|---|
| 219 |
|
|---|
| 220 | Function HAL_ADC_RegisterCallback() allows to register following callbacks:
|
|---|
| 221 | (+) ConvCpltCallback : ADC conversion complete callback
|
|---|
| 222 | (+) ConvHalfCpltCallback : ADC conversion DMA half-transfer callback
|
|---|
| 223 | (+) LevelOutOfWindowCallback : ADC analog watchdog 1 callback
|
|---|
| 224 | (+) ErrorCallback : ADC error callback
|
|---|
| 225 | (+) LevelOutOfWindow2Callback : ADC analog watchdog 2 callback
|
|---|
| 226 | (+) LevelOutOfWindow3Callback : ADC analog watchdog 3 callback
|
|---|
| 227 | (+) EndOfSamplingCallback : ADC end of sampling callback
|
|---|
| 228 | (+) MspInitCallback : ADC Msp Init callback
|
|---|
| 229 | (+) MspDeInitCallback : ADC Msp DeInit callback
|
|---|
| 230 | This function takes as parameters the HAL peripheral handle, the Callback ID
|
|---|
| 231 | and a pointer to the user callback function.
|
|---|
| 232 | [..]
|
|---|
| 233 |
|
|---|
| 234 | Use function HAL_ADC_UnRegisterCallback to reset a callback to the default
|
|---|
| 235 | weak function.
|
|---|
| 236 | [..]
|
|---|
| 237 |
|
|---|
| 238 | HAL_ADC_UnRegisterCallback takes as parameters the HAL peripheral handle,
|
|---|
| 239 | and the Callback ID.
|
|---|
| 240 | This function allows to reset following callbacks:
|
|---|
| 241 | (+) ConvCpltCallback : ADC conversion complete callback
|
|---|
| 242 | (+) ConvHalfCpltCallback : ADC conversion DMA half-transfer callback
|
|---|
| 243 | (+) LevelOutOfWindowCallback : ADC analog watchdog 1 callback
|
|---|
| 244 | (+) ErrorCallback : ADC error callback
|
|---|
| 245 | (+) LevelOutOfWindow2Callback : ADC analog watchdog 2 callback
|
|---|
| 246 | (+) LevelOutOfWindow3Callback : ADC analog watchdog 3 callback
|
|---|
| 247 | (+) EndOfSamplingCallback : ADC end of sampling callback
|
|---|
| 248 | (+) MspInitCallback : ADC Msp Init callback
|
|---|
| 249 | (+) MspDeInitCallback : ADC Msp DeInit callback
|
|---|
| 250 | [..]
|
|---|
| 251 |
|
|---|
| 252 | By default, after the HAL_ADC_Init() and when the state is HAL_ADC_STATE_RESET
|
|---|
| 253 | all callbacks are set to the corresponding weak functions:
|
|---|
| 254 | examples HAL_ADC_ConvCpltCallback(), HAL_ADC_ErrorCallback().
|
|---|
| 255 | Exception done for MspInit and MspDeInit functions that are
|
|---|
| 256 | reset to the legacy weak functions in the HAL_ADC_Init()/ HAL_ADC_DeInit() only when
|
|---|
| 257 | these callbacks are null (not registered beforehand).
|
|---|
| 258 | [..]
|
|---|
| 259 |
|
|---|
| 260 | If MspInit or MspDeInit are not null, the HAL_ADC_Init()/ HAL_ADC_DeInit()
|
|---|
| 261 | keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state.
|
|---|
| 262 | [..]
|
|---|
| 263 |
|
|---|
| 264 | Callbacks can be registered/unregistered in HAL_ADC_STATE_READY state only.
|
|---|
| 265 | Exception done MspInit/MspDeInit functions that can be registered/unregistered
|
|---|
| 266 | in HAL_ADC_STATE_READY or HAL_ADC_STATE_RESET state,
|
|---|
| 267 | thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit.
|
|---|
| 268 | [..]
|
|---|
| 269 |
|
|---|
| 270 | Then, the user first registers the MspInit/MspDeInit user callbacks
|
|---|
| 271 | using HAL_ADC_RegisterCallback() before calling HAL_ADC_DeInit()
|
|---|
| 272 | or HAL_ADC_Init() function.
|
|---|
| 273 | [..]
|
|---|
| 274 |
|
|---|
| 275 | When the compilation flag USE_HAL_ADC_REGISTER_CALLBACKS is set to 0 or
|
|---|
| 276 | not defined, the callback registration feature is not available and all callbacks
|
|---|
| 277 | are set to the corresponding weak functions.
|
|---|
| 278 |
|
|---|
| 279 | @endverbatim
|
|---|
| 280 | ******************************************************************************
|
|---|
| 281 | */
|
|---|
| 282 |
|
|---|
| 283 | /* Includes ------------------------------------------------------------------*/
|
|---|
| 284 | #include "stm32g0xx_hal.h"
|
|---|
| 285 |
|
|---|
| 286 | /** @addtogroup STM32G0xx_HAL_Driver
|
|---|
| 287 | * @{
|
|---|
| 288 | */
|
|---|
| 289 |
|
|---|
| 290 | /** @defgroup ADC ADC
|
|---|
| 291 | * @brief ADC HAL module driver
|
|---|
| 292 | * @{
|
|---|
| 293 | */
|
|---|
| 294 |
|
|---|
| 295 | #ifdef HAL_ADC_MODULE_ENABLED
|
|---|
| 296 |
|
|---|
| 297 | /* Private typedef -----------------------------------------------------------*/
|
|---|
| 298 | /* Private define ------------------------------------------------------------*/
|
|---|
| 299 |
|
|---|
| 300 | /** @defgroup ADC_Private_Constants ADC Private Constants
|
|---|
| 301 | * @{
|
|---|
| 302 | */
|
|---|
| 303 |
|
|---|
| 304 | /* Fixed timeout values for ADC calibration, enable settling time, disable */
|
|---|
| 305 | /* settling time. */
|
|---|
| 306 | /* Values defined to be higher than worst cases: low clock frequency, */
|
|---|
| 307 | /* maximum prescaler. */
|
|---|
| 308 | /* Ex of profile low frequency : Clock source at 0.1 MHz, ADC clock */
|
|---|
| 309 | /* prescaler 4, sampling time 7.5 ADC clock cycles, resolution 12 bits. */
|
|---|
| 310 | /* Unit: ms */
|
|---|
| 311 | #define ADC_ENABLE_TIMEOUT (2UL)
|
|---|
| 312 | #define ADC_DISABLE_TIMEOUT (2UL)
|
|---|
| 313 | #define ADC_STOP_CONVERSION_TIMEOUT (2UL)
|
|---|
| 314 | #define ADC_CHANNEL_CONF_RDY_TIMEOUT (1UL)
|
|---|
| 315 |
|
|---|
| 316 | /* Register CHSELR bits corresponding to ranks 2 to 8 . */
|
|---|
| 317 | #define ADC_CHSELR_SQ2_TO_SQ8 (ADC_CHSELR_SQ2 | ADC_CHSELR_SQ3 | ADC_CHSELR_SQ4 | \
|
|---|
| 318 | ADC_CHSELR_SQ5 | ADC_CHSELR_SQ6 | ADC_CHSELR_SQ7 | ADC_CHSELR_SQ8)
|
|---|
| 319 |
|
|---|
| 320 | /**
|
|---|
| 321 | * @}
|
|---|
| 322 | */
|
|---|
| 323 |
|
|---|
| 324 | /* Private macro -------------------------------------------------------------*/
|
|---|
| 325 | /* Private variables ---------------------------------------------------------*/
|
|---|
| 326 | /* Private function prototypes -----------------------------------------------*/
|
|---|
| 327 | /** @defgroup ADC_Private_Functions ADC Private Functions
|
|---|
| 328 | * @{
|
|---|
| 329 | */
|
|---|
| 330 | static void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma);
|
|---|
| 331 | static void ADC_DMAHalfConvCplt(DMA_HandleTypeDef *hdma);
|
|---|
| 332 | static void ADC_DMAError(DMA_HandleTypeDef *hdma);
|
|---|
| 333 | /**
|
|---|
| 334 | * @}
|
|---|
| 335 | */
|
|---|
| 336 |
|
|---|
| 337 | /* Exported functions ---------------------------------------------------------*/
|
|---|
| 338 |
|
|---|
| 339 | /** @defgroup ADC_Exported_Functions ADC Exported Functions
|
|---|
| 340 | * @{
|
|---|
| 341 | */
|
|---|
| 342 |
|
|---|
| 343 | /** @defgroup ADC_Exported_Functions_Group1 Initialization and de-initialization functions
|
|---|
| 344 | * @brief ADC Initialization and Configuration functions
|
|---|
| 345 | *
|
|---|
| 346 | @verbatim
|
|---|
| 347 | ===============================================================================
|
|---|
| 348 | ##### Initialization and de-initialization functions #####
|
|---|
| 349 | ===============================================================================
|
|---|
| 350 | [..] This section provides functions allowing to:
|
|---|
| 351 | (+) Initialize and configure the ADC.
|
|---|
| 352 | (+) De-initialize the ADC.
|
|---|
| 353 | @endverbatim
|
|---|
| 354 | * @{
|
|---|
| 355 | */
|
|---|
| 356 |
|
|---|
| 357 | /**
|
|---|
| 358 | * @brief Initialize the ADC peripheral and regular group according to
|
|---|
| 359 | * parameters specified in structure "ADC_InitTypeDef".
|
|---|
| 360 | * @note As prerequisite, ADC clock must be configured at RCC top level
|
|---|
| 361 | * (refer to description of RCC configuration for ADC
|
|---|
| 362 | * in header of this file).
|
|---|
| 363 | * @note Possibility to update parameters on the fly:
|
|---|
| 364 | * This function initializes the ADC MSP (HAL_ADC_MspInit()) only when
|
|---|
| 365 | * coming from ADC state reset. Following calls to this function can
|
|---|
| 366 | * be used to reconfigure some parameters of ADC_InitTypeDef
|
|---|
| 367 | * structure on the fly, without modifying MSP configuration. If ADC
|
|---|
| 368 | * MSP has to be modified again, HAL_ADC_DeInit() must be called
|
|---|
| 369 | * before HAL_ADC_Init().
|
|---|
| 370 | * The setting of these parameters is conditioned to ADC state.
|
|---|
| 371 | * For parameters constraints, see comments of structure
|
|---|
| 372 | * "ADC_InitTypeDef".
|
|---|
| 373 | * @note This function configures the ADC within 2 scopes: scope of entire
|
|---|
| 374 | * ADC and scope of regular group. For parameters details, see comments
|
|---|
| 375 | * of structure "ADC_InitTypeDef".
|
|---|
| 376 | * @param hadc ADC handle
|
|---|
| 377 | * @retval HAL status
|
|---|
| 378 | */
|
|---|
| 379 | HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef *hadc)
|
|---|
| 380 | {
|
|---|
| 381 | HAL_StatusTypeDef tmp_hal_status = HAL_OK;
|
|---|
| 382 | uint32_t tmp_cfgr1 = 0UL;
|
|---|
| 383 | uint32_t tmp_cfgr2 = 0UL;
|
|---|
| 384 | uint32_t tmp_adc_reg_is_conversion_on_going;
|
|---|
| 385 | __IO uint32_t wait_loop_index = 0UL;
|
|---|
| 386 |
|
|---|
| 387 | /* Check ADC handle */
|
|---|
| 388 | if (hadc == NULL)
|
|---|
| 389 | {
|
|---|
| 390 | return HAL_ERROR;
|
|---|
| 391 | }
|
|---|
| 392 |
|
|---|
| 393 | /* Check the parameters */
|
|---|
| 394 | assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
|
|---|
| 395 | assert_param(IS_ADC_CLOCKPRESCALER(hadc->Init.ClockPrescaler));
|
|---|
| 396 | assert_param(IS_ADC_RESOLUTION(hadc->Init.Resolution));
|
|---|
| 397 | assert_param(IS_ADC_DATA_ALIGN(hadc->Init.DataAlign));
|
|---|
| 398 | assert_param(IS_ADC_SCAN_MODE(hadc->Init.ScanConvMode));
|
|---|
| 399 | assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode));
|
|---|
| 400 | assert_param(IS_ADC_EXTTRIG_EDGE(hadc->Init.ExternalTrigConvEdge));
|
|---|
| 401 | assert_param(IS_ADC_EXTTRIG(hadc->Init.ExternalTrigConv));
|
|---|
| 402 | assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DMAContinuousRequests));
|
|---|
| 403 | assert_param(IS_ADC_EOC_SELECTION(hadc->Init.EOCSelection));
|
|---|
| 404 | assert_param(IS_ADC_OVERRUN(hadc->Init.Overrun));
|
|---|
| 405 | assert_param(IS_FUNCTIONAL_STATE(hadc->Init.LowPowerAutoWait));
|
|---|
| 406 | assert_param(IS_FUNCTIONAL_STATE(hadc->Init.LowPowerAutoPowerOff));
|
|---|
| 407 | assert_param(IS_ADC_SAMfcPLE_TIME(hadc->Init.SamplingTimeCommon1));
|
|---|
| 408 | assert_param(IS_ADC_SAMPLE_TIME(hadc->Init.SamplingTimeCommon2));
|
|---|
| 409 | assert_param(IS_FUNCTIONAL_STATE(hadc->Init.OversamplingMode));
|
|---|
| 410 | if (hadc->Init.OversamplingMode == ENABLE)
|
|---|
| 411 | {
|
|---|
| 412 | assert_param(IS_ADC_OVERSAMPLING_RATIO(hadc->Init.Oversampling.Ratio));
|
|---|
| 413 | assert_param(IS_ADC_RIGHT_BIT_SHIFT(hadc->Init.Oversampling.RightBitShift));
|
|---|
| 414 | assert_param(IS_ADC_TRIGGERED_OVERSAMPLING_MODE(hadc->Init.Oversampling.TriggeredMode));
|
|---|
| 415 | }
|
|---|
| 416 | assert_param(IS_ADC_TRIGGER_FREQ(hadc->Init.TriggerFrequencyMode));
|
|---|
| 417 |
|
|---|
| 418 | if (hadc->Init.ScanConvMode != ADC_SCAN_DISABLE)
|
|---|
| 419 | {
|
|---|
| 420 | assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DiscontinuousConvMode));
|
|---|
| 421 |
|
|---|
| 422 | if (hadc->Init.ScanConvMode == ADC_SCAN_ENABLE)
|
|---|
| 423 | {
|
|---|
| 424 | assert_param(IS_ADC_REGULAR_NB_CONV(hadc->Init.NbrOfConversion));
|
|---|
| 425 | }
|
|---|
| 426 | }
|
|---|
| 427 |
|
|---|
| 428 | /* ADC group regular discontinuous mode can be enabled only if */
|
|---|
| 429 | /* continuous mode is disabled. */
|
|---|
| 430 | assert_param(!((hadc->Init.DiscontinuousConvMode == ENABLE) && (hadc->Init.ContinuousConvMode == ENABLE)));
|
|---|
| 431 |
|
|---|
| 432 | /* Actions performed only if ADC is coming from state reset: */
|
|---|
| 433 | /* - Initialization of ADC MSP */
|
|---|
| 434 | if (hadc->State == HAL_ADC_STATE_RESET)
|
|---|
| 435 | {
|
|---|
| 436 | #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
|
|---|
| 437 | /* Init the ADC Callback settings */
|
|---|
| 438 | hadc->ConvCpltCallback = HAL_ADC_ConvCpltCallback; /* Legacy weak callback */
|
|---|
| 439 | hadc->ConvHalfCpltCallback = HAL_ADC_ConvHalfCpltCallback; /* Legacy weak callback */
|
|---|
| 440 | hadc->LevelOutOfWindowCallback = HAL_ADC_LevelOutOfWindowCallback; /* Legacy weak callback */
|
|---|
| 441 | hadc->ErrorCallback = HAL_ADC_ErrorCallback; /* Legacy weak callback */
|
|---|
| 442 | hadc->LevelOutOfWindow2Callback = HAL_ADCEx_LevelOutOfWindow2Callback; /* Legacy weak callback */
|
|---|
| 443 | hadc->LevelOutOfWindow3Callback = HAL_ADCEx_LevelOutOfWindow3Callback; /* Legacy weak callback */
|
|---|
| 444 | hadc->EndOfSamplingCallback = HAL_ADCEx_EndOfSamplingCallback; /* Legacy weak callback */
|
|---|
| 445 |
|
|---|
| 446 | if (hadc->MspInitCallback == NULL)
|
|---|
| 447 | {
|
|---|
| 448 | hadc->MspInitCallback = HAL_ADC_MspInit; /* Legacy weak MspInit */
|
|---|
| 449 | }
|
|---|
| 450 |
|
|---|
| 451 | /* Init the low level hardware */
|
|---|
| 452 | hadc->MspInitCallback(hadc);
|
|---|
| 453 | #else
|
|---|
| 454 | /* Init the low level hardware */
|
|---|
| 455 | HAL_ADC_MspInit(hadc);
|
|---|
| 456 | #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
|
|---|
| 457 |
|
|---|
| 458 | /* Set ADC error code to none */
|
|---|
| 459 | ADC_CLEAR_ERRORCODE(hadc);
|
|---|
| 460 |
|
|---|
| 461 | /* Initialize Lock */
|
|---|
| 462 | hadc->Lock = HAL_UNLOCKED;
|
|---|
| 463 | }
|
|---|
| 464 |
|
|---|
| 465 | if (LL_ADC_IsInternalRegulatorEnabled(hadc->Instance) == 0UL)
|
|---|
| 466 | {
|
|---|
| 467 | /* Enable ADC internal voltage regulator */
|
|---|
| 468 | LL_ADC_EnableInternalRegulator(hadc->Instance);
|
|---|
| 469 |
|
|---|
| 470 | /* Delay for ADC stabilization time */
|
|---|
| 471 | /* Wait loop initialization and execution */
|
|---|
| 472 | /* Note: Variable divided by 2 to compensate partially */
|
|---|
| 473 | /* CPU processing cycles, scaling in us split to not */
|
|---|
| 474 | /* exceed 32 bits register capacity and handle low frequency. */
|
|---|
| 475 | wait_loop_index = ((LL_ADC_DELAY_INTERNAL_REGUL_STAB_US / 10UL) * ((SystemCoreClock / (100000UL * 2UL)) + 1UL));
|
|---|
| 476 | while (wait_loop_index != 0UL)
|
|---|
| 477 | {
|
|---|
| 478 | wait_loop_index--;
|
|---|
| 479 | }
|
|---|
| 480 | }
|
|---|
| 481 |
|
|---|
| 482 | /* Verification that ADC voltage regulator is correctly enabled, whether */
|
|---|
| 483 | /* or not ADC is coming from state reset (if any potential problem of */
|
|---|
| 484 | /* clocking, voltage regulator would not be enabled). */
|
|---|
| 485 | if (LL_ADC_IsInternalRegulatorEnabled(hadc->Instance) == 0UL)
|
|---|
| 486 | {
|
|---|
| 487 | /* Update ADC state machine to error */
|
|---|
| 488 | SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
|
|---|
| 489 |
|
|---|
| 490 | /* Set ADC error code to ADC peripheral internal error */
|
|---|
| 491 | SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
|
|---|
| 492 |
|
|---|
| 493 | tmp_hal_status = HAL_ERROR;
|
|---|
| 494 | }
|
|---|
| 495 |
|
|---|
| 496 | /* Configuration of ADC parameters if previous preliminary actions are */
|
|---|
| 497 | /* correctly completed and if there is no conversion on going on regular */
|
|---|
| 498 | /* group (ADC may already be enabled at this point if HAL_ADC_Init() is */
|
|---|
| 499 | /* called to update a parameter on the fly). */
|
|---|
| 500 | tmp_adc_reg_is_conversion_on_going = LL_ADC_REG_IsConversionOngoing(hadc->Instance);
|
|---|
| 501 |
|
|---|
| 502 | if (((hadc->State & HAL_ADC_STATE_ERROR_INTERNAL) == 0UL)
|
|---|
| 503 | && (tmp_adc_reg_is_conversion_on_going == 0UL)
|
|---|
| 504 | )
|
|---|
| 505 | {
|
|---|
| 506 | /* Set ADC state */
|
|---|
| 507 | ADC_STATE_CLR_SET(hadc->State,
|
|---|
| 508 | HAL_ADC_STATE_REG_BUSY,
|
|---|
| 509 | HAL_ADC_STATE_BUSY_INTERNAL);
|
|---|
| 510 |
|
|---|
| 511 | /* Configuration of common ADC parameters */
|
|---|
| 512 |
|
|---|
| 513 | /* Parameters update conditioned to ADC state: */
|
|---|
| 514 | /* Parameters that can be updated only when ADC is disabled: */
|
|---|
| 515 | /* - Internal voltage regulator (no parameter in HAL ADC init structure) */
|
|---|
| 516 | /* - Clock configuration */
|
|---|
| 517 | /* - ADC resolution */
|
|---|
| 518 | /* - Oversampling */
|
|---|
| 519 | /* - discontinuous mode */
|
|---|
| 520 | /* - LowPowerAutoWait mode */
|
|---|
| 521 | /* - LowPowerAutoPowerOff mode */
|
|---|
| 522 | /* - continuous conversion mode */
|
|---|
| 523 | /* - overrun */
|
|---|
| 524 | /* - external trigger to start conversion */
|
|---|
| 525 | /* - external trigger polarity */
|
|---|
| 526 | /* - data alignment */
|
|---|
| 527 | /* - resolution */
|
|---|
| 528 | /* - scan direction */
|
|---|
| 529 | /* - DMA continuous request */
|
|---|
| 530 | /* - Trigger frequency mode */
|
|---|
| 531 | /* Note: If low power mode AutoPowerOff is enabled, ADC enable */
|
|---|
| 532 | /* and disable phases are performed automatically by hardware */
|
|---|
| 533 | /* (in this case, flag ADC_FLAG_RDY is not set). */
|
|---|
| 534 | if (LL_ADC_IsEnabled(hadc->Instance) == 0UL)
|
|---|
| 535 | {
|
|---|
| 536 | /* Some parameters of this register are not reset, since they are set */
|
|---|
| 537 | /* by other functions and must be kept in case of usage of this */
|
|---|
| 538 | /* function on the fly (update of a parameter of ADC_InitTypeDef */
|
|---|
| 539 | /* without needing to reconfigure all other ADC groups/channels */
|
|---|
| 540 | /* parameters): */
|
|---|
| 541 | /* - internal measurement paths (VrefInt, ...) */
|
|---|
| 542 | /* (set into HAL_ADC_ConfigChannel() ) */
|
|---|
| 543 |
|
|---|
| 544 | tmp_cfgr1 |= (hadc->Init.Resolution |
|
|---|
| 545 | ADC_CFGR1_AUTOWAIT((uint32_t)hadc->Init.LowPowerAutoWait) |
|
|---|
| 546 | ADC_CFGR1_AUTOOFF((uint32_t)hadc->Init.LowPowerAutoPowerOff) |
|
|---|
| 547 | ADC_CFGR1_CONTINUOUS((uint32_t)hadc->Init.ContinuousConvMode) |
|
|---|
| 548 | ADC_CFGR1_OVERRUN(hadc->Init.Overrun) |
|
|---|
| 549 | hadc->Init.DataAlign |
|
|---|
| 550 | ADC_SCAN_SEQ_MODE(hadc->Init.ScanConvMode) |
|
|---|
| 551 | ADC_CFGR1_DMACONTREQ((uint32_t)hadc->Init.DMAContinuousRequests));
|
|---|
| 552 |
|
|---|
| 553 | /* Update setting of discontinuous mode only if continuous mode is disabled */
|
|---|
| 554 | if (hadc->Init.DiscontinuousConvMode == ENABLE)
|
|---|
| 555 | {
|
|---|
| 556 | if (hadc->Init.ContinuousConvMode == DISABLE)
|
|---|
| 557 | {
|
|---|
| 558 | /* Enable the selected ADC group regular discontinuous mode */
|
|---|
| 559 | tmp_cfgr1 |= ADC_CFGR1_DISCEN;
|
|---|
| 560 | }
|
|---|
| 561 | else
|
|---|
| 562 | {
|
|---|
| 563 | /* ADC regular group discontinuous was intended to be enabled, */
|
|---|
| 564 | /* but ADC regular group modes continuous and sequencer discontinuous */
|
|---|
| 565 | /* cannot be enabled simultaneously. */
|
|---|
| 566 |
|
|---|
| 567 | /* Update ADC state machine to error */
|
|---|
| 568 | SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
|
|---|
| 569 |
|
|---|
| 570 | /* Set ADC error code to ADC peripheral internal error */
|
|---|
| 571 | SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
|
|---|
| 572 | }
|
|---|
| 573 | }
|
|---|
| 574 |
|
|---|
| 575 | /* Enable external trigger if trigger selection is different of software */
|
|---|
| 576 | /* start. */
|
|---|
| 577 | /* Note: This configuration keeps the hardware feature of parameter */
|
|---|
| 578 | /* ExternalTrigConvEdge "trigger edge none" equivalent to */
|
|---|
| 579 | /* software start. */
|
|---|
| 580 | if (hadc->Init.ExternalTrigConv != ADC_SOFTWARE_START)
|
|---|
| 581 | {
|
|---|
| 582 | tmp_cfgr1 |= ((hadc->Init.ExternalTrigConv & ADC_CFGR1_EXTSEL) |
|
|---|
| 583 | hadc->Init.ExternalTrigConvEdge);
|
|---|
| 584 | }
|
|---|
| 585 |
|
|---|
| 586 | /* Update ADC configuration register with previous settings */
|
|---|
| 587 | MODIFY_REG(hadc->Instance->CFGR1,
|
|---|
| 588 | ADC_CFGR1_RES |
|
|---|
| 589 | ADC_CFGR1_DISCEN |
|
|---|
| 590 | ADC_CFGR1_CHSELRMOD |
|
|---|
| 591 | ADC_CFGR1_AUTOFF |
|
|---|
| 592 | ADC_CFGR1_WAIT |
|
|---|
| 593 | ADC_CFGR1_CONT |
|
|---|
| 594 | ADC_CFGR1_OVRMOD |
|
|---|
| 595 | ADC_CFGR1_EXTSEL |
|
|---|
| 596 | ADC_CFGR1_EXTEN |
|
|---|
| 597 | ADC_CFGR1_ALIGN |
|
|---|
| 598 | ADC_CFGR1_SCANDIR |
|
|---|
| 599 | ADC_CFGR1_DMACFG,
|
|---|
| 600 | tmp_cfgr1);
|
|---|
| 601 |
|
|---|
| 602 | tmp_cfgr2 |= ((hadc->Init.ClockPrescaler & ADC_CFGR2_CKMODE) |
|
|---|
| 603 | hadc->Init.TriggerFrequencyMode
|
|---|
| 604 | );
|
|---|
| 605 |
|
|---|
| 606 | if (hadc->Init.OversamplingMode == ENABLE)
|
|---|
| 607 | {
|
|---|
| 608 | tmp_cfgr2 |= (ADC_CFGR2_OVSE |
|
|---|
| 609 | (hadc->Init.ClockPrescaler & ADC_CFGR2_CKMODE) |
|
|---|
| 610 | hadc->Init.Oversampling.Ratio |
|
|---|
| 611 | hadc->Init.Oversampling.RightBitShift |
|
|---|
| 612 | hadc->Init.Oversampling.TriggeredMode
|
|---|
| 613 | );
|
|---|
| 614 | }
|
|---|
| 615 |
|
|---|
| 616 | MODIFY_REG(hadc->Instance->CFGR2,
|
|---|
| 617 | ADC_CFGR2_CKMODE |
|
|---|
| 618 | ADC_CFGR2_LFTRIG |
|
|---|
| 619 | ADC_CFGR2_OVSE |
|
|---|
| 620 | ADC_CFGR2_OVSR |
|
|---|
| 621 | ADC_CFGR2_OVSS |
|
|---|
| 622 | ADC_CFGR2_TOVS,
|
|---|
| 623 | tmp_cfgr2);
|
|---|
| 624 |
|
|---|
| 625 | /* Configuration of ADC clock mode: asynchronous clock source */
|
|---|
| 626 | /* with selectable prescaler. */
|
|---|
| 627 | if (((hadc->Init.ClockPrescaler) != ADC_CLOCK_SYNC_PCLK_DIV1) &&
|
|---|
| 628 | ((hadc->Init.ClockPrescaler) != ADC_CLOCK_SYNC_PCLK_DIV2) &&
|
|---|
| 629 | ((hadc->Init.ClockPrescaler) != ADC_CLOCK_SYNC_PCLK_DIV4))
|
|---|
| 630 | {
|
|---|
| 631 | MODIFY_REG(ADC1_COMMON->CCR,
|
|---|
| 632 | ADC_CCR_PRESC,
|
|---|
| 633 | hadc->Init.ClockPrescaler & ADC_CCR_PRESC);
|
|---|
| 634 | }
|
|---|
| 635 | }
|
|---|
| 636 |
|
|---|
| 637 | /* Channel sampling time configuration */
|
|---|
| 638 | LL_ADC_SetSamplingTimeCommonChannels(hadc->Instance, LL_ADC_SAMPLINGTIME_COMMON_1, hadc->Init.SamplingTimeCommon1);
|
|---|
| 639 | LL_ADC_SetSamplingTimeCommonChannels(hadc->Instance, LL_ADC_SAMPLINGTIME_COMMON_2, hadc->Init.SamplingTimeCommon2);
|
|---|
| 640 |
|
|---|
| 641 | /* Configuration of regular group sequencer: */
|
|---|
| 642 | /* - if scan mode is disabled, regular channels sequence length is set to */
|
|---|
| 643 | /* 0x00: 1 channel converted (channel on regular rank 1) */
|
|---|
| 644 | /* Parameter "NbrOfConversion" is discarded. */
|
|---|
| 645 | /* Note: Scan mode is not present by hardware on this device, but */
|
|---|
| 646 | /* emulated by software for alignment over all STM32 devices. */
|
|---|
| 647 | /* - if scan mode is enabled, regular channels sequence length is set to */
|
|---|
| 648 | /* parameter "NbrOfConversion". */
|
|---|
| 649 | /* Channels must be configured into each rank using function */
|
|---|
| 650 | /* "HAL_ADC_ConfigChannel()". */
|
|---|
| 651 | if (hadc->Init.ScanConvMode == ADC_SCAN_DISABLE)
|
|---|
| 652 | {
|
|---|
| 653 | /* Set sequencer scan length by clearing ranks above rank 1 */
|
|---|
| 654 | /* and do not modify rank 1 value. */
|
|---|
| 655 | SET_BIT(hadc->Instance->CHSELR,
|
|---|
| 656 | ADC_CHSELR_SQ2_TO_SQ8);
|
|---|
| 657 | }
|
|---|
| 658 | else if (hadc->Init.ScanConvMode == ADC_SCAN_ENABLE)
|
|---|
| 659 | {
|
|---|
| 660 | /* Set ADC group regular sequencer: */
|
|---|
| 661 | /* - Set ADC group regular sequencer to value memorized */
|
|---|
| 662 | /* in HAL ADC handle */
|
|---|
| 663 | /* Note: This value maybe be initialized at a unknown value, */
|
|---|
| 664 | /* therefore after the first call of "HAL_ADC_Init()", */
|
|---|
| 665 | /* each rank corresponding to parameter "NbrOfConversion" */
|
|---|
| 666 | /* must be set using "HAL_ADC_ConfigChannel()". */
|
|---|
| 667 | /* - Set sequencer scan length by clearing ranks above maximum rank */
|
|---|
| 668 | /* and do not modify other ranks value. */
|
|---|
| 669 | MODIFY_REG(hadc->Instance->CHSELR,
|
|---|
| 670 | ADC_CHSELR_SQ_ALL,
|
|---|
| 671 | (ADC_CHSELR_SQ2_TO_SQ8 << (((hadc->Init.NbrOfConversion - 1UL) * ADC_REGULAR_RANK_2) & 0x1FUL))
|
|---|
| 672 | | (hadc->ADCGroupRegularSequencerRanks)
|
|---|
| 673 | );
|
|---|
| 674 | }
|
|---|
| 675 | else
|
|---|
| 676 | {
|
|---|
| 677 | /* Nothing to do */
|
|---|
| 678 | }
|
|---|
| 679 |
|
|---|
| 680 | /* Check back that ADC registers have effectively been configured to */
|
|---|
| 681 | /* ensure of no potential problem of ADC core peripheral clocking. */
|
|---|
| 682 | if (LL_ADC_GetSamplingTimeCommonChannels(hadc->Instance, LL_ADC_SAMPLINGTIME_COMMON_1)
|
|---|
| 683 | == hadc->Init.SamplingTimeCommon1)
|
|---|
| 684 | {
|
|---|
| 685 | /* Set ADC error code to none */
|
|---|
| 686 | ADC_CLEAR_ERRORCODE(hadc);
|
|---|
| 687 |
|
|---|
| 688 | /* Set the ADC state */
|
|---|
| 689 | ADC_STATE_CLR_SET(hadc->State,
|
|---|
| 690 | HAL_ADC_STATE_BUSY_INTERNAL,
|
|---|
| 691 | HAL_ADC_STATE_READY);
|
|---|
| 692 | }
|
|---|
| 693 | else
|
|---|
| 694 | {
|
|---|
| 695 | /* Update ADC state machine to error */
|
|---|
| 696 | ADC_STATE_CLR_SET(hadc->State,
|
|---|
| 697 | HAL_ADC_STATE_BUSY_INTERNAL,
|
|---|
| 698 | HAL_ADC_STATE_ERROR_INTERNAL);
|
|---|
| 699 |
|
|---|
| 700 | /* Set ADC error code to ADC peripheral internal error */
|
|---|
| 701 | SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
|
|---|
| 702 |
|
|---|
| 703 | tmp_hal_status = HAL_ERROR;
|
|---|
| 704 | }
|
|---|
| 705 |
|
|---|
| 706 | }
|
|---|
| 707 | else
|
|---|
| 708 | {
|
|---|
| 709 | /* Update ADC state machine to error */
|
|---|
| 710 | SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
|
|---|
| 711 |
|
|---|
| 712 | tmp_hal_status = HAL_ERROR;
|
|---|
| 713 | }
|
|---|
| 714 |
|
|---|
| 715 | return tmp_hal_status;
|
|---|
| 716 | }
|
|---|
| 717 |
|
|---|
| 718 | /**
|
|---|
| 719 | * @brief Deinitialize the ADC peripheral registers to their default reset
|
|---|
| 720 | * values, with deinitialization of the ADC MSP.
|
|---|
| 721 | * @note For devices with several ADCs: reset of ADC common registers is done
|
|---|
| 722 | * only if all ADCs sharing the same common group are disabled.
|
|---|
| 723 | * (function "HAL_ADC_MspDeInit()" is also called under the same conditions:
|
|---|
| 724 | * all ADC instances use the same core clock at RCC level, disabling
|
|---|
| 725 | * the core clock reset all ADC instances).
|
|---|
| 726 | * If this is not the case, reset of these common parameters reset is
|
|---|
| 727 | * bypassed without error reporting: it can be the intended behavior in
|
|---|
| 728 | * case of reset of a single ADC while the other ADCs sharing the same
|
|---|
| 729 | * common group is still running.
|
|---|
| 730 | * @param hadc ADC handle
|
|---|
| 731 | * @retval HAL status
|
|---|
| 732 | */
|
|---|
| 733 | HAL_StatusTypeDef HAL_ADC_DeInit(ADC_HandleTypeDef *hadc)
|
|---|
| 734 | {
|
|---|
| 735 | HAL_StatusTypeDef tmp_hal_status;
|
|---|
| 736 |
|
|---|
| 737 | /* Check ADC handle */
|
|---|
| 738 | if (hadc == NULL)
|
|---|
| 739 | {
|
|---|
| 740 | return HAL_ERROR;
|
|---|
| 741 | }
|
|---|
| 742 |
|
|---|
| 743 | /* Check the parameters */
|
|---|
| 744 | assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
|
|---|
| 745 |
|
|---|
| 746 | /* Set ADC state */
|
|---|
| 747 | SET_BIT(hadc->State, HAL_ADC_STATE_BUSY_INTERNAL);
|
|---|
| 748 |
|
|---|
| 749 | /* Stop potential conversion on going, on regular group */
|
|---|
| 750 | tmp_hal_status = ADC_ConversionStop(hadc);
|
|---|
| 751 |
|
|---|
| 752 | /* Disable ADC peripheral if conversions are effectively stopped */
|
|---|
| 753 | if (tmp_hal_status == HAL_OK)
|
|---|
| 754 | {
|
|---|
| 755 | /* Disable the ADC peripheral */
|
|---|
| 756 | tmp_hal_status = ADC_Disable(hadc);
|
|---|
| 757 |
|
|---|
| 758 | /* Check if ADC is effectively disabled */
|
|---|
| 759 | if (tmp_hal_status == HAL_OK)
|
|---|
| 760 | {
|
|---|
| 761 | /* Change ADC state */
|
|---|
| 762 | hadc->State = HAL_ADC_STATE_READY;
|
|---|
| 763 | }
|
|---|
| 764 |
|
|---|
| 765 | /* Disable ADC internal voltage regulator */
|
|---|
| 766 | LL_ADC_DisableInternalRegulator(hadc->Instance);
|
|---|
| 767 | }
|
|---|
| 768 |
|
|---|
| 769 | /* Note: HAL ADC deInit is done independently of ADC conversion stop */
|
|---|
| 770 | /* and disable return status. In case of status fail, attempt to */
|
|---|
| 771 | /* perform deinitialization anyway and it is up user code in */
|
|---|
| 772 | /* in HAL_ADC_MspDeInit() to reset the ADC peripheral using */
|
|---|
| 773 | /* system RCC hard reset. */
|
|---|
| 774 |
|
|---|
| 775 | /* ========== Reset ADC registers ========== */
|
|---|
| 776 | /* Reset register IER */
|
|---|
| 777 | __HAL_ADC_DISABLE_IT(hadc, (ADC_IT_AWD3 | ADC_IT_AWD2 |
|
|---|
| 778 | ADC_IT_AWD1 | ADC_IT_OVR |
|
|---|
| 779 | ADC_IT_EOS | ADC_IT_EOC |
|
|---|
| 780 | ADC_IT_EOSMP | ADC_IT_RDY));
|
|---|
| 781 |
|
|---|
| 782 | /* Reset register ISR */
|
|---|
| 783 | __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_AWD3 | ADC_FLAG_AWD2 |
|
|---|
| 784 | ADC_FLAG_AWD1 | ADC_FLAG_OVR |
|
|---|
| 785 | ADC_FLAG_EOS | ADC_FLAG_EOC |
|
|---|
| 786 | ADC_FLAG_EOSMP | ADC_FLAG_RDY));
|
|---|
| 787 |
|
|---|
| 788 | /* Reset register CR */
|
|---|
| 789 | /* Bits ADC_CR_ADCAL, ADC_CR_ADSTP, ADC_CR_ADSTART are in access mode */
|
|---|
| 790 | /* "read-set": no direct reset applicable. */
|
|---|
| 791 |
|
|---|
| 792 | /* Reset register CFGR1 */
|
|---|
| 793 | hadc->Instance->CFGR1 &= ~(ADC_CFGR1_AWD1CH | ADC_CFGR1_AWD1EN | ADC_CFGR1_AWD1SGL | ADC_CFGR1_DISCEN |
|
|---|
| 794 | ADC_CFGR1_CHSELRMOD | ADC_CFGR1_AUTOFF |
|
|---|
| 795 | ADC_CFGR1_WAIT | ADC_CFGR1_CONT | ADC_CFGR1_OVRMOD |
|
|---|
| 796 | ADC_CFGR1_EXTEN | ADC_CFGR1_EXTSEL | ADC_CFGR1_ALIGN | ADC_CFGR1_RES |
|
|---|
| 797 | ADC_CFGR1_SCANDIR | ADC_CFGR1_DMACFG | ADC_CFGR1_DMAEN);
|
|---|
| 798 |
|
|---|
| 799 | /* Reset register SMPR */
|
|---|
| 800 | hadc->Instance->SMPR &= ~ADC_SMPR_SMP1;
|
|---|
| 801 |
|
|---|
| 802 | /* Reset register CHSELR */
|
|---|
| 803 | hadc->Instance->CHSELR &= ~(ADC_CHSELR_SQ_ALL);
|
|---|
| 804 |
|
|---|
| 805 | /* Reset register DR */
|
|---|
| 806 | /* bits in access mode read only, no direct reset applicable */
|
|---|
| 807 |
|
|---|
| 808 | /* Reset registers AWDxTR */
|
|---|
| 809 | hadc->Instance->AWD1TR &= ~(ADC_AWD1TR_HT1 | ADC_AWD1TR_LT1);
|
|---|
| 810 | hadc->Instance->AWD2TR &= ~(ADC_AWD2TR_HT2 | ADC_AWD2TR_LT2);
|
|---|
| 811 | hadc->Instance->AWD3TR &= ~(ADC_AWD3TR_HT3 | ADC_AWD3TR_LT3);
|
|---|
| 812 |
|
|---|
| 813 | /* Reset register CFGR2 */
|
|---|
| 814 | /* Note: CFGR2 reset done at the end of de-initialization due to */
|
|---|
| 815 | /* clock source reset */
|
|---|
| 816 | /* Note: Update of ADC clock mode is conditioned to ADC state disabled: */
|
|---|
| 817 | /* already done above. */
|
|---|
| 818 | hadc->Instance->CFGR2 &= ~ADC_CFGR2_CKMODE;
|
|---|
| 819 |
|
|---|
| 820 | /* Reset register CCR */
|
|---|
| 821 | ADC1_COMMON->CCR &= ~(ADC_CCR_VBATEN | ADC_CCR_TSEN | ADC_CCR_VREFEN | ADC_CCR_PRESC);
|
|---|
| 822 |
|
|---|
| 823 | /* ========== Hard reset ADC peripheral ========== */
|
|---|
| 824 | /* Performs a global reset of the entire ADC peripheral: ADC state is */
|
|---|
| 825 | /* forced to a similar state after device power-on. */
|
|---|
| 826 | /* Note: A possible implementation is to add RCC bus reset of ADC */
|
|---|
| 827 | /* (for example, using macro */
|
|---|
| 828 | /* __HAL_RCC_ADC..._FORCE_RESET()/..._RELEASE_RESET()/..._CLK_DISABLE()) */
|
|---|
| 829 | /* in function "void HAL_ADC_MspDeInit(ADC_HandleTypeDef *hadc)": */
|
|---|
| 830 | #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
|
|---|
| 831 | if (hadc->MspDeInitCallback == NULL)
|
|---|
| 832 | {
|
|---|
| 833 | hadc->MspDeInitCallback = HAL_ADC_MspDeInit; /* Legacy weak MspDeInit */
|
|---|
| 834 | }
|
|---|
| 835 |
|
|---|
| 836 | /* DeInit the low level hardware */
|
|---|
| 837 | hadc->MspDeInitCallback(hadc);
|
|---|
| 838 | #else
|
|---|
| 839 | /* DeInit the low level hardware */
|
|---|
| 840 | HAL_ADC_MspDeInit(hadc);
|
|---|
| 841 | #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
|
|---|
| 842 |
|
|---|
| 843 | /* Reset HAL ADC handle variable */
|
|---|
| 844 | hadc->ADCGroupRegularSequencerRanks = 0x00000000UL;
|
|---|
| 845 |
|
|---|
| 846 | /* Set ADC error code to none */
|
|---|
| 847 | ADC_CLEAR_ERRORCODE(hadc);
|
|---|
| 848 |
|
|---|
| 849 | /* Set ADC state */
|
|---|
| 850 | hadc->State = HAL_ADC_STATE_RESET;
|
|---|
| 851 |
|
|---|
| 852 | __HAL_UNLOCK(hadc);
|
|---|
| 853 |
|
|---|
| 854 | return tmp_hal_status;
|
|---|
| 855 | }
|
|---|
| 856 |
|
|---|
| 857 | /**
|
|---|
| 858 | * @brief Initialize the ADC MSP.
|
|---|
| 859 | * @param hadc ADC handle
|
|---|
| 860 | * @retval None
|
|---|
| 861 | */
|
|---|
| 862 | __weak void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
|
|---|
| 863 | {
|
|---|
| 864 | /* Prevent unused argument(s) compilation warning */
|
|---|
| 865 | UNUSED(hadc);
|
|---|
| 866 |
|
|---|
| 867 | /* NOTE : This function should not be modified. When the callback is needed,
|
|---|
| 868 | function HAL_ADC_MspInit must be implemented in the user file.
|
|---|
| 869 | */
|
|---|
| 870 | }
|
|---|
| 871 |
|
|---|
| 872 | /**
|
|---|
| 873 | * @brief DeInitialize the ADC MSP.
|
|---|
| 874 | * @param hadc ADC handle
|
|---|
| 875 | * @note All ADC instances use the same core clock at RCC level, disabling
|
|---|
| 876 | * the core clock reset all ADC instances).
|
|---|
| 877 | * @retval None
|
|---|
| 878 | */
|
|---|
| 879 | __weak void HAL_ADC_MspDeInit(ADC_HandleTypeDef *hadc)
|
|---|
| 880 | {
|
|---|
| 881 | /* Prevent unused argument(s) compilation warning */
|
|---|
| 882 | UNUSED(hadc);
|
|---|
| 883 |
|
|---|
| 884 | /* NOTE : This function should not be modified. When the callback is needed,
|
|---|
| 885 | function HAL_ADC_MspDeInit must be implemented in the user file.
|
|---|
| 886 | */
|
|---|
| 887 | }
|
|---|
| 888 |
|
|---|
| 889 | #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
|
|---|
| 890 | /**
|
|---|
| 891 | * @brief Register a User ADC Callback
|
|---|
| 892 | * To be used instead of the weak predefined callback
|
|---|
| 893 | * @param hadc Pointer to a ADC_HandleTypeDef structure that contains
|
|---|
| 894 | * the configuration information for the specified ADC.
|
|---|
| 895 | * @param CallbackID ID of the callback to be registered
|
|---|
| 896 | * This parameter can be one of the following values:
|
|---|
| 897 | * @arg @ref HAL_ADC_CONVERSION_COMPLETE_CB_ID ADC conversion complete callback ID
|
|---|
| 898 | * @arg @ref HAL_ADC_CONVERSION_HALF_CB_ID ADC conversion DMA half-transfer callback ID
|
|---|
| 899 | * @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID ADC analog watchdog 1 callback ID
|
|---|
| 900 | * @arg @ref HAL_ADC_ERROR_CB_ID ADC error callback ID
|
|---|
| 901 | * @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_2_CB_ID ADC analog watchdog 2 callback ID
|
|---|
| 902 | * @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_3_CB_ID ADC analog watchdog 3 callback ID
|
|---|
| 903 | * @arg @ref HAL_ADC_END_OF_SAMPLING_CB_ID ADC end of sampling callback ID
|
|---|
| 904 | * @arg @ref HAL_ADC_MSPINIT_CB_ID ADC Msp Init callback ID
|
|---|
| 905 | * @arg @ref HAL_ADC_MSPDEINIT_CB_ID ADC Msp DeInit callback ID
|
|---|
| 906 | * @arg @ref HAL_ADC_MSPINIT_CB_ID MspInit callback ID
|
|---|
| 907 | * @arg @ref HAL_ADC_MSPDEINIT_CB_ID MspDeInit callback ID
|
|---|
| 908 | * @param pCallback pointer to the Callback function
|
|---|
| 909 | * @retval HAL status
|
|---|
| 910 | */
|
|---|
| 911 | HAL_StatusTypeDef HAL_ADC_RegisterCallback(ADC_HandleTypeDef *hadc, HAL_ADC_CallbackIDTypeDef CallbackID,
|
|---|
| 912 | pADC_CallbackTypeDef pCallback)
|
|---|
| 913 | {
|
|---|
| 914 | HAL_StatusTypeDef status = HAL_OK;
|
|---|
| 915 |
|
|---|
| 916 | if (pCallback == NULL)
|
|---|
| 917 | {
|
|---|
| 918 | /* Update the error code */
|
|---|
| 919 | hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
|
|---|
| 920 |
|
|---|
| 921 | return HAL_ERROR;
|
|---|
| 922 | }
|
|---|
| 923 |
|
|---|
| 924 | if ((hadc->State & HAL_ADC_STATE_READY) != 0UL)
|
|---|
| 925 | {
|
|---|
| 926 | switch (CallbackID)
|
|---|
| 927 | {
|
|---|
| 928 | case HAL_ADC_CONVERSION_COMPLETE_CB_ID :
|
|---|
| 929 | hadc->ConvCpltCallback = pCallback;
|
|---|
| 930 | break;
|
|---|
| 931 |
|
|---|
| 932 | case HAL_ADC_CONVERSION_HALF_CB_ID :
|
|---|
| 933 | hadc->ConvHalfCpltCallback = pCallback;
|
|---|
| 934 | break;
|
|---|
| 935 |
|
|---|
| 936 | case HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID :
|
|---|
| 937 | hadc->LevelOutOfWindowCallback = pCallback;
|
|---|
| 938 | break;
|
|---|
| 939 |
|
|---|
| 940 | case HAL_ADC_ERROR_CB_ID :
|
|---|
| 941 | hadc->ErrorCallback = pCallback;
|
|---|
| 942 | break;
|
|---|
| 943 |
|
|---|
| 944 | case HAL_ADC_LEVEL_OUT_OF_WINDOW_2_CB_ID :
|
|---|
| 945 | hadc->LevelOutOfWindow2Callback = pCallback;
|
|---|
| 946 | break;
|
|---|
| 947 |
|
|---|
| 948 | case HAL_ADC_LEVEL_OUT_OF_WINDOW_3_CB_ID :
|
|---|
| 949 | hadc->LevelOutOfWindow3Callback = pCallback;
|
|---|
| 950 | break;
|
|---|
| 951 |
|
|---|
| 952 | case HAL_ADC_END_OF_SAMPLING_CB_ID :
|
|---|
| 953 | hadc->EndOfSamplingCallback = pCallback;
|
|---|
| 954 | break;
|
|---|
| 955 |
|
|---|
| 956 | case HAL_ADC_MSPINIT_CB_ID :
|
|---|
| 957 | hadc->MspInitCallback = pCallback;
|
|---|
| 958 | break;
|
|---|
| 959 |
|
|---|
| 960 | case HAL_ADC_MSPDEINIT_CB_ID :
|
|---|
| 961 | hadc->MspDeInitCallback = pCallback;
|
|---|
| 962 | break;
|
|---|
| 963 |
|
|---|
| 964 | default :
|
|---|
| 965 | /* Update the error code */
|
|---|
| 966 | hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
|
|---|
| 967 |
|
|---|
| 968 | /* Return error status */
|
|---|
| 969 | status = HAL_ERROR;
|
|---|
| 970 | break;
|
|---|
| 971 | }
|
|---|
| 972 | }
|
|---|
| 973 | else if (HAL_ADC_STATE_RESET == hadc->State)
|
|---|
| 974 | {
|
|---|
| 975 | switch (CallbackID)
|
|---|
| 976 | {
|
|---|
| 977 | case HAL_ADC_MSPINIT_CB_ID :
|
|---|
| 978 | hadc->MspInitCallback = pCallback;
|
|---|
| 979 | break;
|
|---|
| 980 |
|
|---|
| 981 | case HAL_ADC_MSPDEINIT_CB_ID :
|
|---|
| 982 | hadc->MspDeInitCallback = pCallback;
|
|---|
| 983 | break;
|
|---|
| 984 |
|
|---|
| 985 | default :
|
|---|
| 986 | /* Update the error code */
|
|---|
| 987 | hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
|
|---|
| 988 |
|
|---|
| 989 | /* Return error status */
|
|---|
| 990 | status = HAL_ERROR;
|
|---|
| 991 | break;
|
|---|
| 992 | }
|
|---|
| 993 | }
|
|---|
| 994 | else
|
|---|
| 995 | {
|
|---|
| 996 | /* Update the error code */
|
|---|
| 997 | hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
|
|---|
| 998 |
|
|---|
| 999 | /* Return error status */
|
|---|
| 1000 | status = HAL_ERROR;
|
|---|
| 1001 | }
|
|---|
| 1002 |
|
|---|
| 1003 | return status;
|
|---|
| 1004 | }
|
|---|
| 1005 |
|
|---|
| 1006 | /**
|
|---|
| 1007 | * @brief Unregister a ADC Callback
|
|---|
| 1008 | * ADC callback is redirected to the weak predefined callback
|
|---|
| 1009 | * @param hadc Pointer to a ADC_HandleTypeDef structure that contains
|
|---|
| 1010 | * the configuration information for the specified ADC.
|
|---|
| 1011 | * @param CallbackID ID of the callback to be unregistered
|
|---|
| 1012 | * This parameter can be one of the following values:
|
|---|
| 1013 | * @arg @ref HAL_ADC_CONVERSION_COMPLETE_CB_ID ADC conversion complete callback ID
|
|---|
| 1014 | * @arg @ref HAL_ADC_CONVERSION_HALF_CB_ID ADC conversion DMA half-transfer callback ID
|
|---|
| 1015 | * @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID ADC analog watchdog 1 callback ID
|
|---|
| 1016 | * @arg @ref HAL_ADC_ERROR_CB_ID ADC error callback ID
|
|---|
| 1017 | * @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_2_CB_ID ADC analog watchdog 2 callback ID
|
|---|
| 1018 | * @arg @ref HAL_ADC_LEVEL_OUT_OF_WINDOW_3_CB_ID ADC analog watchdog 3 callback ID
|
|---|
| 1019 | * @arg @ref HAL_ADC_END_OF_SAMPLING_CB_ID ADC end of sampling callback ID
|
|---|
| 1020 | * @arg @ref HAL_ADC_MSPINIT_CB_ID ADC Msp Init callback ID
|
|---|
| 1021 | * @arg @ref HAL_ADC_MSPDEINIT_CB_ID ADC Msp DeInit callback ID
|
|---|
| 1022 | * @arg @ref HAL_ADC_MSPINIT_CB_ID MspInit callback ID
|
|---|
| 1023 | * @arg @ref HAL_ADC_MSPDEINIT_CB_ID MspDeInit callback ID
|
|---|
| 1024 | * @retval HAL status
|
|---|
| 1025 | */
|
|---|
| 1026 | HAL_StatusTypeDef HAL_ADC_UnRegisterCallback(ADC_HandleTypeDef *hadc, HAL_ADC_CallbackIDTypeDef CallbackID)
|
|---|
| 1027 | {
|
|---|
| 1028 | HAL_StatusTypeDef status = HAL_OK;
|
|---|
| 1029 |
|
|---|
| 1030 | if ((hadc->State & HAL_ADC_STATE_READY) != 0UL)
|
|---|
| 1031 | {
|
|---|
| 1032 | switch (CallbackID)
|
|---|
| 1033 | {
|
|---|
| 1034 | case HAL_ADC_CONVERSION_COMPLETE_CB_ID :
|
|---|
| 1035 | hadc->ConvCpltCallback = HAL_ADC_ConvCpltCallback;
|
|---|
| 1036 | break;
|
|---|
| 1037 |
|
|---|
| 1038 | case HAL_ADC_CONVERSION_HALF_CB_ID :
|
|---|
| 1039 | hadc->ConvHalfCpltCallback = HAL_ADC_ConvHalfCpltCallback;
|
|---|
| 1040 | break;
|
|---|
| 1041 |
|
|---|
| 1042 | case HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID :
|
|---|
| 1043 | hadc->LevelOutOfWindowCallback = HAL_ADC_LevelOutOfWindowCallback;
|
|---|
| 1044 | break;
|
|---|
| 1045 |
|
|---|
| 1046 | case HAL_ADC_ERROR_CB_ID :
|
|---|
| 1047 | hadc->ErrorCallback = HAL_ADC_ErrorCallback;
|
|---|
| 1048 | break;
|
|---|
| 1049 |
|
|---|
| 1050 | case HAL_ADC_LEVEL_OUT_OF_WINDOW_2_CB_ID :
|
|---|
| 1051 | hadc->LevelOutOfWindow2Callback = HAL_ADCEx_LevelOutOfWindow2Callback;
|
|---|
| 1052 | break;
|
|---|
| 1053 |
|
|---|
| 1054 | case HAL_ADC_LEVEL_OUT_OF_WINDOW_3_CB_ID :
|
|---|
| 1055 | hadc->LevelOutOfWindow3Callback = HAL_ADCEx_LevelOutOfWindow3Callback;
|
|---|
| 1056 | break;
|
|---|
| 1057 |
|
|---|
| 1058 | case HAL_ADC_END_OF_SAMPLING_CB_ID :
|
|---|
| 1059 | hadc->EndOfSamplingCallback = HAL_ADCEx_EndOfSamplingCallback;
|
|---|
| 1060 | break;
|
|---|
| 1061 |
|
|---|
| 1062 | case HAL_ADC_MSPINIT_CB_ID :
|
|---|
| 1063 | hadc->MspInitCallback = HAL_ADC_MspInit; /* Legacy weak MspInit */
|
|---|
| 1064 | break;
|
|---|
| 1065 |
|
|---|
| 1066 | case HAL_ADC_MSPDEINIT_CB_ID :
|
|---|
| 1067 | hadc->MspDeInitCallback = HAL_ADC_MspDeInit; /* Legacy weak MspDeInit */
|
|---|
| 1068 | break;
|
|---|
| 1069 |
|
|---|
| 1070 | default :
|
|---|
| 1071 | /* Update the error code */
|
|---|
| 1072 | hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
|
|---|
| 1073 |
|
|---|
| 1074 | /* Return error status */
|
|---|
| 1075 | status = HAL_ERROR;
|
|---|
| 1076 | break;
|
|---|
| 1077 | }
|
|---|
| 1078 | }
|
|---|
| 1079 | else if (HAL_ADC_STATE_RESET == hadc->State)
|
|---|
| 1080 | {
|
|---|
| 1081 | switch (CallbackID)
|
|---|
| 1082 | {
|
|---|
| 1083 | case HAL_ADC_MSPINIT_CB_ID :
|
|---|
| 1084 | hadc->MspInitCallback = HAL_ADC_MspInit; /* Legacy weak MspInit */
|
|---|
| 1085 | break;
|
|---|
| 1086 |
|
|---|
| 1087 | case HAL_ADC_MSPDEINIT_CB_ID :
|
|---|
| 1088 | hadc->MspDeInitCallback = HAL_ADC_MspDeInit; /* Legacy weak MspDeInit */
|
|---|
| 1089 | break;
|
|---|
| 1090 |
|
|---|
| 1091 | default :
|
|---|
| 1092 | /* Update the error code */
|
|---|
| 1093 | hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
|
|---|
| 1094 |
|
|---|
| 1095 | /* Return error status */
|
|---|
| 1096 | status = HAL_ERROR;
|
|---|
| 1097 | break;
|
|---|
| 1098 | }
|
|---|
| 1099 | }
|
|---|
| 1100 | else
|
|---|
| 1101 | {
|
|---|
| 1102 | /* Update the error code */
|
|---|
| 1103 | hadc->ErrorCode |= HAL_ADC_ERROR_INVALID_CALLBACK;
|
|---|
| 1104 |
|
|---|
| 1105 | /* Return error status */
|
|---|
| 1106 | status = HAL_ERROR;
|
|---|
| 1107 | }
|
|---|
| 1108 |
|
|---|
| 1109 | return status;
|
|---|
| 1110 | }
|
|---|
| 1111 |
|
|---|
| 1112 | #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
|
|---|
| 1113 |
|
|---|
| 1114 | /**
|
|---|
| 1115 | * @}
|
|---|
| 1116 | */
|
|---|
| 1117 |
|
|---|
| 1118 | /** @defgroup ADC_Exported_Functions_Group2 ADC Input and Output operation functions
|
|---|
| 1119 | * @brief ADC IO operation functions
|
|---|
| 1120 | *
|
|---|
| 1121 | @verbatim
|
|---|
| 1122 | ===============================================================================
|
|---|
| 1123 | ##### IO operation functions #####
|
|---|
| 1124 | ===============================================================================
|
|---|
| 1125 | [..] This section provides functions allowing to:
|
|---|
| 1126 | (+) Start conversion of regular group.
|
|---|
| 1127 | (+) Stop conversion of regular group.
|
|---|
| 1128 | (+) Poll for conversion complete on regular group.
|
|---|
| 1129 | (+) Poll for conversion event.
|
|---|
| 1130 | (+) Get result of regular channel conversion.
|
|---|
| 1131 | (+) Start conversion of regular group and enable interruptions.
|
|---|
| 1132 | (+) Stop conversion of regular group and disable interruptions.
|
|---|
| 1133 | (+) Handle ADC interrupt request
|
|---|
| 1134 | (+) Start conversion of regular group and enable DMA transfer.
|
|---|
| 1135 | (+) Stop conversion of regular group and disable ADC DMA transfer.
|
|---|
| 1136 | @endverbatim
|
|---|
| 1137 | * @{
|
|---|
| 1138 | */
|
|---|
| 1139 |
|
|---|
| 1140 | /**
|
|---|
| 1141 | * @brief Enable ADC, start conversion of regular group.
|
|---|
| 1142 | * @note Interruptions enabled in this function: None.
|
|---|
| 1143 | * @param hadc ADC handle
|
|---|
| 1144 | * @retval HAL status
|
|---|
| 1145 | */
|
|---|
| 1146 | HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef *hadc)
|
|---|
| 1147 | {
|
|---|
| 1148 | HAL_StatusTypeDef tmp_hal_status;
|
|---|
| 1149 |
|
|---|
| 1150 | /* Check the parameters */
|
|---|
| 1151 | assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
|
|---|
| 1152 |
|
|---|
| 1153 | /* Perform ADC enable and conversion start if no conversion is on going */
|
|---|
| 1154 | if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
|
|---|
| 1155 | {
|
|---|
| 1156 | __HAL_LOCK(hadc);
|
|---|
| 1157 |
|
|---|
| 1158 | /* Enable the ADC peripheral */
|
|---|
| 1159 | tmp_hal_status = ADC_Enable(hadc);
|
|---|
| 1160 |
|
|---|
| 1161 | /* Start conversion if ADC is effectively enabled */
|
|---|
| 1162 | if (tmp_hal_status == HAL_OK)
|
|---|
| 1163 | {
|
|---|
| 1164 | /* Set ADC state */
|
|---|
| 1165 | /* - Clear state bitfield related to regular group conversion results */
|
|---|
| 1166 | /* - Set state bitfield related to regular operation */
|
|---|
| 1167 | ADC_STATE_CLR_SET(hadc->State,
|
|---|
| 1168 | HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR | HAL_ADC_STATE_REG_EOSMP,
|
|---|
| 1169 | HAL_ADC_STATE_REG_BUSY);
|
|---|
| 1170 |
|
|---|
| 1171 | /* Set ADC error code */
|
|---|
| 1172 | /* Reset all ADC error code fields */
|
|---|
| 1173 | ADC_CLEAR_ERRORCODE(hadc);
|
|---|
| 1174 |
|
|---|
| 1175 | /* Clear ADC group regular conversion flag and overrun flag */
|
|---|
| 1176 | /* (To ensure of no unknown state from potential previous ADC operations) */
|
|---|
| 1177 | __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS | ADC_FLAG_OVR));
|
|---|
| 1178 |
|
|---|
| 1179 | /* Process unlocked */
|
|---|
| 1180 | /* Unlock before starting ADC conversions: in case of potential */
|
|---|
| 1181 | /* interruption, to let the process to ADC IRQ Handler. */
|
|---|
| 1182 | __HAL_UNLOCK(hadc);
|
|---|
| 1183 |
|
|---|
| 1184 | /* Enable conversion of regular group. */
|
|---|
| 1185 | /* If software start has been selected, conversion starts immediately. */
|
|---|
| 1186 | /* If external trigger has been selected, conversion will start at next */
|
|---|
| 1187 | /* trigger event. */
|
|---|
| 1188 | /* Start ADC group regular conversion */
|
|---|
| 1189 | LL_ADC_REG_StartConversion(hadc->Instance);
|
|---|
| 1190 | }
|
|---|
| 1191 | else
|
|---|
| 1192 | {
|
|---|
| 1193 | __HAL_UNLOCK(hadc);
|
|---|
| 1194 | }
|
|---|
| 1195 | }
|
|---|
| 1196 | else
|
|---|
| 1197 | {
|
|---|
| 1198 | tmp_hal_status = HAL_BUSY;
|
|---|
| 1199 | }
|
|---|
| 1200 |
|
|---|
| 1201 | return tmp_hal_status;
|
|---|
| 1202 | }
|
|---|
| 1203 |
|
|---|
| 1204 | /**
|
|---|
| 1205 | * @brief Stop ADC conversion of regular group (and injected channels in
|
|---|
| 1206 | * case of auto_injection mode), disable ADC peripheral.
|
|---|
| 1207 | * @note: ADC peripheral disable is forcing stop of potential
|
|---|
| 1208 | * conversion on injected group. If injected group is under use, it
|
|---|
| 1209 | * should be preliminarily stopped using HAL_ADCEx_InjectedStop function.
|
|---|
| 1210 | * @param hadc ADC handle
|
|---|
| 1211 | * @retval HAL status.
|
|---|
| 1212 | */
|
|---|
| 1213 | HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef *hadc)
|
|---|
| 1214 | {
|
|---|
| 1215 | HAL_StatusTypeDef tmp_hal_status;
|
|---|
| 1216 |
|
|---|
| 1217 | /* Check the parameters */
|
|---|
| 1218 | assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
|
|---|
| 1219 |
|
|---|
| 1220 | __HAL_LOCK(hadc);
|
|---|
| 1221 |
|
|---|
| 1222 | /* 1. Stop potential conversion on going, on ADC group regular */
|
|---|
| 1223 | tmp_hal_status = ADC_ConversionStop(hadc);
|
|---|
| 1224 |
|
|---|
| 1225 | /* Disable ADC peripheral if conversions are effectively stopped */
|
|---|
| 1226 | if (tmp_hal_status == HAL_OK)
|
|---|
| 1227 | {
|
|---|
| 1228 | /* 2. Disable the ADC peripheral */
|
|---|
| 1229 | tmp_hal_status = ADC_Disable(hadc);
|
|---|
| 1230 |
|
|---|
| 1231 | /* Check if ADC is effectively disabled */
|
|---|
| 1232 | if (tmp_hal_status == HAL_OK)
|
|---|
| 1233 | {
|
|---|
| 1234 | /* Set ADC state */
|
|---|
| 1235 | ADC_STATE_CLR_SET(hadc->State,
|
|---|
| 1236 | HAL_ADC_STATE_REG_BUSY,
|
|---|
| 1237 | HAL_ADC_STATE_READY);
|
|---|
| 1238 | }
|
|---|
| 1239 | }
|
|---|
| 1240 |
|
|---|
| 1241 | __HAL_UNLOCK(hadc);
|
|---|
| 1242 |
|
|---|
| 1243 | return tmp_hal_status;
|
|---|
| 1244 | }
|
|---|
| 1245 |
|
|---|
| 1246 | /**
|
|---|
| 1247 | * @brief Wait for regular group conversion to be completed.
|
|---|
| 1248 | * @note ADC conversion flags EOS (end of sequence) and EOC (end of
|
|---|
| 1249 | * conversion) are cleared by this function, with an exception:
|
|---|
| 1250 | * if low power feature "LowPowerAutoWait" is enabled, flags are
|
|---|
| 1251 | * not cleared to not interfere with this feature until data register
|
|---|
| 1252 | * is read using function HAL_ADC_GetValue().
|
|---|
| 1253 | * @note This function cannot be used in a particular setup: ADC configured
|
|---|
| 1254 | * in DMA mode and polling for end of each conversion (ADC init
|
|---|
| 1255 | * parameter "EOCSelection" set to ADC_EOC_SINGLE_CONV).
|
|---|
| 1256 | * In this case, DMA resets the flag EOC and polling cannot be
|
|---|
| 1257 | * performed on each conversion. Nevertheless, polling can still
|
|---|
| 1258 | * be performed on the complete sequence (ADC init
|
|---|
| 1259 | * parameter "EOCSelection" set to ADC_EOC_SEQ_CONV).
|
|---|
| 1260 | * @param hadc ADC handle
|
|---|
| 1261 | * @param Timeout Timeout value in millisecond.
|
|---|
| 1262 | * @retval HAL status
|
|---|
| 1263 | */
|
|---|
| 1264 | HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef *hadc, uint32_t Timeout)
|
|---|
| 1265 | {
|
|---|
| 1266 | uint32_t tickstart;
|
|---|
| 1267 | uint32_t tmp_flag_end;
|
|---|
| 1268 |
|
|---|
| 1269 | /* Check the parameters */
|
|---|
| 1270 | assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
|
|---|
| 1271 |
|
|---|
| 1272 | /* If end of conversion selected to end of sequence conversions */
|
|---|
| 1273 | if (hadc->Init.EOCSelection == ADC_EOC_SEQ_CONV)
|
|---|
| 1274 | {
|
|---|
| 1275 | tmp_flag_end = ADC_FLAG_EOS;
|
|---|
| 1276 | }
|
|---|
| 1277 | /* If end of conversion selected to end of unitary conversion */
|
|---|
| 1278 | else /* ADC_EOC_SINGLE_CONV */
|
|---|
| 1279 | {
|
|---|
| 1280 | /* Verification that ADC configuration is compliant with polling for */
|
|---|
| 1281 | /* each conversion: */
|
|---|
| 1282 | /* Particular case is ADC configured in DMA mode and ADC sequencer with */
|
|---|
| 1283 | /* several ranks and polling for end of each conversion. */
|
|---|
| 1284 | /* For code simplicity sake, this particular case is generalized to */
|
|---|
| 1285 | /* ADC configured in DMA mode and and polling for end of each conversion. */
|
|---|
| 1286 | if ((hadc->Instance->CFGR1 & ADC_CFGR1_DMAEN) != 0UL)
|
|---|
| 1287 | {
|
|---|
| 1288 | /* Update ADC state machine to error */
|
|---|
| 1289 | SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
|
|---|
| 1290 |
|
|---|
| 1291 | return HAL_ERROR;
|
|---|
| 1292 | }
|
|---|
| 1293 | else
|
|---|
| 1294 | {
|
|---|
| 1295 | tmp_flag_end = (ADC_FLAG_EOC);
|
|---|
| 1296 | }
|
|---|
| 1297 | }
|
|---|
| 1298 |
|
|---|
| 1299 | /* Get tick count */
|
|---|
| 1300 | tickstart = HAL_GetTick();
|
|---|
| 1301 |
|
|---|
| 1302 | /* Wait until End of unitary conversion or sequence conversions flag is raised */
|
|---|
| 1303 | while ((hadc->Instance->ISR & tmp_flag_end) == 0UL)
|
|---|
| 1304 | {
|
|---|
| 1305 | /* Check if timeout is disabled (set to infinite wait) */
|
|---|
| 1306 | if (Timeout != HAL_MAX_DELAY)
|
|---|
| 1307 | {
|
|---|
| 1308 | if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0UL))
|
|---|
| 1309 | {
|
|---|
| 1310 | /* New check to avoid false timeout detection in case of preemption */
|
|---|
| 1311 | if ((hadc->Instance->ISR & tmp_flag_end) == 0UL)
|
|---|
| 1312 | {
|
|---|
| 1313 | /* Update ADC state machine to timeout */
|
|---|
| 1314 | SET_BIT(hadc->State, HAL_ADC_STATE_TIMEOUT);
|
|---|
| 1315 |
|
|---|
| 1316 | __HAL_UNLOCK(hadc);
|
|---|
| 1317 |
|
|---|
| 1318 | return HAL_TIMEOUT;
|
|---|
| 1319 | }
|
|---|
| 1320 | }
|
|---|
| 1321 | }
|
|---|
| 1322 | }
|
|---|
| 1323 |
|
|---|
| 1324 | /* Update ADC state machine */
|
|---|
| 1325 | SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
|
|---|
| 1326 |
|
|---|
| 1327 | /* Determine whether any further conversion upcoming on group regular */
|
|---|
| 1328 | /* by external trigger, continuous mode or scan sequence on going. */
|
|---|
| 1329 | if ((LL_ADC_REG_IsTriggerSourceSWStart(hadc->Instance) != 0UL)
|
|---|
| 1330 | && (hadc->Init.ContinuousConvMode == DISABLE)
|
|---|
| 1331 | )
|
|---|
| 1332 | {
|
|---|
| 1333 | /* Check whether end of sequence is reached */
|
|---|
| 1334 | if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOS))
|
|---|
| 1335 | {
|
|---|
| 1336 | /* Allowed to modify bits ADC_IT_EOC/ADC_IT_EOS only if bit */
|
|---|
| 1337 | /* ADSTART==0 (no conversion on going) */
|
|---|
| 1338 | if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
|
|---|
| 1339 | {
|
|---|
| 1340 | /* Disable ADC end of single conversion interrupt on group regular */
|
|---|
| 1341 | /* Note: Overrun interrupt was enabled with EOC interrupt in */
|
|---|
| 1342 | /* HAL_Start_IT(), but is not disabled here because can be used */
|
|---|
| 1343 | /* by overrun IRQ process below. */
|
|---|
| 1344 | __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC | ADC_IT_EOS);
|
|---|
| 1345 |
|
|---|
| 1346 | /* Set ADC state */
|
|---|
| 1347 | ADC_STATE_CLR_SET(hadc->State,
|
|---|
| 1348 | HAL_ADC_STATE_REG_BUSY,
|
|---|
| 1349 | HAL_ADC_STATE_READY);
|
|---|
| 1350 | }
|
|---|
| 1351 | else
|
|---|
| 1352 | {
|
|---|
| 1353 | /* Change ADC state to error state */
|
|---|
| 1354 | SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
|
|---|
| 1355 |
|
|---|
| 1356 | /* Set ADC error code to ADC peripheral internal error */
|
|---|
| 1357 | SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
|
|---|
| 1358 | }
|
|---|
| 1359 | }
|
|---|
| 1360 | }
|
|---|
| 1361 |
|
|---|
| 1362 | /* Clear end of conversion flag of regular group if low power feature */
|
|---|
| 1363 | /* "LowPowerAutoWait " is disabled, to not interfere with this feature */
|
|---|
| 1364 | /* until data register is read using function HAL_ADC_GetValue(). */
|
|---|
| 1365 | if (hadc->Init.LowPowerAutoWait == DISABLE)
|
|---|
| 1366 | {
|
|---|
| 1367 | /* Clear regular group conversion flag */
|
|---|
| 1368 | __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS));
|
|---|
| 1369 | }
|
|---|
| 1370 |
|
|---|
| 1371 | /* Return function status */
|
|---|
| 1372 | return HAL_OK;
|
|---|
| 1373 | }
|
|---|
| 1374 |
|
|---|
| 1375 | /**
|
|---|
| 1376 | * @brief Poll for ADC event.
|
|---|
| 1377 | * @param hadc ADC handle
|
|---|
| 1378 | * @param EventType the ADC event type.
|
|---|
| 1379 | * This parameter can be one of the following values:
|
|---|
| 1380 | * @arg @ref ADC_EOSMP_EVENT ADC End of Sampling event
|
|---|
| 1381 | * @arg @ref ADC_AWD1_EVENT ADC Analog watchdog 1 event (main analog watchdog, present on
|
|---|
| 1382 | * all STM32 series)
|
|---|
| 1383 | * @arg @ref ADC_AWD2_EVENT ADC Analog watchdog 2 event (additional analog watchdog, not present on
|
|---|
| 1384 | * all STM32 series)
|
|---|
| 1385 | * @arg @ref ADC_AWD3_EVENT ADC Analog watchdog 3 event (additional analog watchdog, not present on
|
|---|
| 1386 | * all STM32 series)
|
|---|
| 1387 | * @arg @ref ADC_OVR_EVENT ADC Overrun event
|
|---|
| 1388 | * @param Timeout Timeout value in millisecond.
|
|---|
| 1389 | * @note The relevant flag is cleared if found to be set, except for ADC_FLAG_OVR.
|
|---|
| 1390 | * Indeed, the latter is reset only if hadc->Init.Overrun field is set
|
|---|
| 1391 | * to ADC_OVR_DATA_OVERWRITTEN. Otherwise, data register may be potentially overwritten
|
|---|
| 1392 | * by a new converted data as soon as OVR is cleared.
|
|---|
| 1393 | * To reset OVR flag once the preserved data is retrieved, the user can resort
|
|---|
| 1394 | * to macro __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR);
|
|---|
| 1395 | * @retval HAL status
|
|---|
| 1396 | */
|
|---|
| 1397 | HAL_StatusTypeDef HAL_ADC_PollForEvent(ADC_HandleTypeDef *hadc, uint32_t EventType, uint32_t Timeout)
|
|---|
| 1398 | {
|
|---|
| 1399 | uint32_t tickstart;
|
|---|
| 1400 |
|
|---|
| 1401 | /* Check the parameters */
|
|---|
| 1402 | assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
|
|---|
| 1403 | assert_param(IS_ADC_EVENT_TYPE(EventType));
|
|---|
| 1404 |
|
|---|
| 1405 | /* Get tick count */
|
|---|
| 1406 | tickstart = HAL_GetTick();
|
|---|
| 1407 |
|
|---|
| 1408 | /* Check selected event flag */
|
|---|
| 1409 | while (__HAL_ADC_GET_FLAG(hadc, EventType) == 0UL)
|
|---|
| 1410 | {
|
|---|
| 1411 | /* Check if timeout is disabled (set to infinite wait) */
|
|---|
| 1412 | if (Timeout != HAL_MAX_DELAY)
|
|---|
| 1413 | {
|
|---|
| 1414 | if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0UL))
|
|---|
| 1415 | {
|
|---|
| 1416 | /* New check to avoid false timeout detection in case of preemption */
|
|---|
| 1417 | if (__HAL_ADC_GET_FLAG(hadc, EventType) == 0UL)
|
|---|
| 1418 | {
|
|---|
| 1419 | /* Update ADC state machine to timeout */
|
|---|
| 1420 | SET_BIT(hadc->State, HAL_ADC_STATE_TIMEOUT);
|
|---|
| 1421 |
|
|---|
| 1422 | __HAL_UNLOCK(hadc);
|
|---|
| 1423 |
|
|---|
| 1424 | return HAL_TIMEOUT;
|
|---|
| 1425 | }
|
|---|
| 1426 | }
|
|---|
| 1427 | }
|
|---|
| 1428 | }
|
|---|
| 1429 |
|
|---|
| 1430 | switch (EventType)
|
|---|
| 1431 | {
|
|---|
| 1432 | /* End Of Sampling event */
|
|---|
| 1433 | case ADC_EOSMP_EVENT:
|
|---|
| 1434 | /* Set ADC state */
|
|---|
| 1435 | SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOSMP);
|
|---|
| 1436 |
|
|---|
| 1437 | /* Clear the End Of Sampling flag */
|
|---|
| 1438 | __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOSMP);
|
|---|
| 1439 |
|
|---|
| 1440 | break;
|
|---|
| 1441 |
|
|---|
| 1442 | /* Analog watchdog (level out of window) event */
|
|---|
| 1443 | /* Note: In case of several analog watchdog enabled, if needed to know */
|
|---|
| 1444 | /* which one triggered and on which ADCx, test ADC state of analog watchdog */
|
|---|
| 1445 | /* flags HAL_ADC_STATE_AWD1/2/3 using function "HAL_ADC_GetState()". */
|
|---|
| 1446 | /* For example: */
|
|---|
| 1447 | /* " if ((HAL_ADC_GetState(hadc1) & HAL_ADC_STATE_AWD1) != 0UL) " */
|
|---|
| 1448 | /* " if ((HAL_ADC_GetState(hadc1) & HAL_ADC_STATE_AWD2) != 0UL) " */
|
|---|
| 1449 | /* " if ((HAL_ADC_GetState(hadc1) & HAL_ADC_STATE_AWD3) != 0UL) " */
|
|---|
| 1450 |
|
|---|
| 1451 | /* Check analog watchdog 1 flag */
|
|---|
| 1452 | case ADC_AWD_EVENT:
|
|---|
| 1453 | /* Set ADC state */
|
|---|
| 1454 | SET_BIT(hadc->State, HAL_ADC_STATE_AWD1);
|
|---|
| 1455 |
|
|---|
| 1456 | /* Clear ADC analog watchdog flag */
|
|---|
| 1457 | __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD1);
|
|---|
| 1458 |
|
|---|
| 1459 | break;
|
|---|
| 1460 |
|
|---|
| 1461 | /* Check analog watchdog 2 flag */
|
|---|
| 1462 | case ADC_AWD2_EVENT:
|
|---|
| 1463 | /* Set ADC state */
|
|---|
| 1464 | SET_BIT(hadc->State, HAL_ADC_STATE_AWD2);
|
|---|
| 1465 |
|
|---|
| 1466 | /* Clear ADC analog watchdog flag */
|
|---|
| 1467 | __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD2);
|
|---|
| 1468 |
|
|---|
| 1469 | break;
|
|---|
| 1470 |
|
|---|
| 1471 | /* Check analog watchdog 3 flag */
|
|---|
| 1472 | case ADC_AWD3_EVENT:
|
|---|
| 1473 | /* Set ADC state */
|
|---|
| 1474 | SET_BIT(hadc->State, HAL_ADC_STATE_AWD3);
|
|---|
| 1475 |
|
|---|
| 1476 | /* Clear ADC analog watchdog flag */
|
|---|
| 1477 | __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD3);
|
|---|
| 1478 |
|
|---|
| 1479 | break;
|
|---|
| 1480 |
|
|---|
| 1481 | /* Overrun event */
|
|---|
| 1482 | default: /* Case ADC_OVR_EVENT */
|
|---|
| 1483 | /* If overrun is set to overwrite previous data, overrun event is not */
|
|---|
| 1484 | /* considered as an error. */
|
|---|
| 1485 | /* (cf ref manual "Managing conversions without using the DMA and without */
|
|---|
| 1486 | /* overrun ") */
|
|---|
| 1487 | if (hadc->Init.Overrun == ADC_OVR_DATA_PRESERVED)
|
|---|
| 1488 | {
|
|---|
| 1489 | /* Set ADC state */
|
|---|
| 1490 | SET_BIT(hadc->State, HAL_ADC_STATE_REG_OVR);
|
|---|
| 1491 |
|
|---|
| 1492 | /* Set ADC error code to overrun */
|
|---|
| 1493 | SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_OVR);
|
|---|
| 1494 | }
|
|---|
| 1495 | else
|
|---|
| 1496 | {
|
|---|
| 1497 | /* Clear ADC Overrun flag only if Overrun is set to ADC_OVR_DATA_OVERWRITTEN
|
|---|
| 1498 | otherwise, data register is potentially overwritten by new converted data as soon
|
|---|
| 1499 | as OVR is cleared. */
|
|---|
| 1500 | __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR);
|
|---|
| 1501 | }
|
|---|
| 1502 | break;
|
|---|
| 1503 | }
|
|---|
| 1504 |
|
|---|
| 1505 | /* Return function status */
|
|---|
| 1506 | return HAL_OK;
|
|---|
| 1507 | }
|
|---|
| 1508 |
|
|---|
| 1509 | /**
|
|---|
| 1510 | * @brief Enable ADC, start conversion of regular group with interruption.
|
|---|
| 1511 | * @note Interruptions enabled in this function according to initialization
|
|---|
| 1512 | * setting : EOC (end of conversion), EOS (end of sequence),
|
|---|
| 1513 | * OVR overrun.
|
|---|
| 1514 | * Each of these interruptions has its dedicated callback function.
|
|---|
| 1515 | * @note To guarantee a proper reset of all interruptions once all the needed
|
|---|
| 1516 | * conversions are obtained, HAL_ADC_Stop_IT() must be called to ensure
|
|---|
| 1517 | * a correct stop of the IT-based conversions.
|
|---|
| 1518 | * @note By default, HAL_ADC_Start_IT() does not enable the End Of Sampling
|
|---|
| 1519 | * interruption. If required (e.g. in case of oversampling with trigger
|
|---|
| 1520 | * mode), the user must:
|
|---|
| 1521 | * 1. first clear the EOSMP flag if set with macro __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOSMP)
|
|---|
| 1522 | * 2. then enable the EOSMP interrupt with macro __HAL_ADC_ENABLE_IT(hadc, ADC_IT_EOSMP)
|
|---|
| 1523 | * before calling HAL_ADC_Start_IT().
|
|---|
| 1524 | * @param hadc ADC handle
|
|---|
| 1525 | * @retval HAL status
|
|---|
| 1526 | */
|
|---|
| 1527 | HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef *hadc)
|
|---|
| 1528 | {
|
|---|
| 1529 | HAL_StatusTypeDef tmp_hal_status;
|
|---|
| 1530 |
|
|---|
| 1531 | /* Check the parameters */
|
|---|
| 1532 | assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
|
|---|
| 1533 |
|
|---|
| 1534 | /* Perform ADC enable and conversion start if no conversion is on going */
|
|---|
| 1535 | if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
|
|---|
| 1536 | {
|
|---|
| 1537 | __HAL_LOCK(hadc);
|
|---|
| 1538 |
|
|---|
| 1539 | /* Enable the ADC peripheral */
|
|---|
| 1540 | tmp_hal_status = ADC_Enable(hadc);
|
|---|
| 1541 |
|
|---|
| 1542 | /* Start conversion if ADC is effectively enabled */
|
|---|
| 1543 | if (tmp_hal_status == HAL_OK)
|
|---|
| 1544 | {
|
|---|
| 1545 | /* Set ADC state */
|
|---|
| 1546 | /* - Clear state bitfield related to regular group conversion results */
|
|---|
| 1547 | /* - Set state bitfield related to regular operation */
|
|---|
| 1548 | ADC_STATE_CLR_SET(hadc->State,
|
|---|
| 1549 | HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR | HAL_ADC_STATE_REG_EOSMP,
|
|---|
| 1550 | HAL_ADC_STATE_REG_BUSY);
|
|---|
| 1551 |
|
|---|
| 1552 |
|
|---|
| 1553 | /* Set ADC error code */
|
|---|
| 1554 | /* Reset all ADC error code fields */
|
|---|
| 1555 | ADC_CLEAR_ERRORCODE(hadc);
|
|---|
| 1556 |
|
|---|
| 1557 | /* Clear ADC group regular conversion flag and overrun flag */
|
|---|
| 1558 | /* (To ensure of no unknown state from potential previous ADC operations) */
|
|---|
| 1559 | __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS | ADC_FLAG_OVR));
|
|---|
| 1560 |
|
|---|
| 1561 | /* Process unlocked */
|
|---|
| 1562 | /* Unlock before starting ADC conversions: in case of potential */
|
|---|
| 1563 | /* interruption, to let the process to ADC IRQ Handler. */
|
|---|
| 1564 | __HAL_UNLOCK(hadc);
|
|---|
| 1565 |
|
|---|
| 1566 | /* Disable all interruptions before enabling the desired ones */
|
|---|
| 1567 | __HAL_ADC_DISABLE_IT(hadc, (ADC_IT_EOC | ADC_IT_EOS | ADC_IT_OVR));
|
|---|
| 1568 |
|
|---|
| 1569 | /* Enable ADC end of conversion interrupt */
|
|---|
| 1570 | switch (hadc->Init.EOCSelection)
|
|---|
| 1571 | {
|
|---|
| 1572 | case ADC_EOC_SEQ_CONV:
|
|---|
| 1573 | __HAL_ADC_ENABLE_IT(hadc, ADC_IT_EOS);
|
|---|
| 1574 | break;
|
|---|
| 1575 | /* case ADC_EOC_SINGLE_CONV */
|
|---|
| 1576 | default:
|
|---|
| 1577 | __HAL_ADC_ENABLE_IT(hadc, ADC_IT_EOC);
|
|---|
| 1578 | break;
|
|---|
| 1579 | }
|
|---|
| 1580 |
|
|---|
| 1581 | /* Enable ADC overrun interrupt */
|
|---|
| 1582 | /* If hadc->Init.Overrun is set to ADC_OVR_DATA_PRESERVED, only then is
|
|---|
| 1583 | ADC_IT_OVR enabled; otherwise data overwrite is considered as normal
|
|---|
| 1584 | behavior and no CPU time is lost for a non-processed interruption */
|
|---|
| 1585 | if (hadc->Init.Overrun == ADC_OVR_DATA_PRESERVED)
|
|---|
| 1586 | {
|
|---|
| 1587 | __HAL_ADC_ENABLE_IT(hadc, ADC_IT_OVR);
|
|---|
| 1588 | }
|
|---|
| 1589 |
|
|---|
| 1590 | /* Enable conversion of regular group. */
|
|---|
| 1591 | /* If software start has been selected, conversion starts immediately. */
|
|---|
| 1592 | /* If external trigger has been selected, conversion will start at next */
|
|---|
| 1593 | /* trigger event. */
|
|---|
| 1594 | /* Start ADC group regular conversion */
|
|---|
| 1595 | LL_ADC_REG_StartConversion(hadc->Instance);
|
|---|
| 1596 | }
|
|---|
| 1597 | else
|
|---|
| 1598 | {
|
|---|
| 1599 | __HAL_UNLOCK(hadc);
|
|---|
| 1600 | }
|
|---|
| 1601 |
|
|---|
| 1602 | }
|
|---|
| 1603 | else
|
|---|
| 1604 | {
|
|---|
| 1605 | tmp_hal_status = HAL_BUSY;
|
|---|
| 1606 | }
|
|---|
| 1607 |
|
|---|
| 1608 | return tmp_hal_status;
|
|---|
| 1609 | }
|
|---|
| 1610 |
|
|---|
| 1611 | /**
|
|---|
| 1612 | * @brief Stop ADC conversion of regular group (and injected group in
|
|---|
| 1613 | * case of auto_injection mode), disable interrution of
|
|---|
| 1614 | * end-of-conversion, disable ADC peripheral.
|
|---|
| 1615 | * @param hadc ADC handle
|
|---|
| 1616 | * @retval HAL status.
|
|---|
| 1617 | */
|
|---|
| 1618 | HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef *hadc)
|
|---|
| 1619 | {
|
|---|
| 1620 | HAL_StatusTypeDef tmp_hal_status;
|
|---|
| 1621 |
|
|---|
| 1622 | /* Check the parameters */
|
|---|
| 1623 | assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
|
|---|
| 1624 |
|
|---|
| 1625 | __HAL_LOCK(hadc);
|
|---|
| 1626 |
|
|---|
| 1627 | /* 1. Stop potential conversion on going, on ADC group regular */
|
|---|
| 1628 | tmp_hal_status = ADC_ConversionStop(hadc);
|
|---|
| 1629 |
|
|---|
| 1630 | /* Disable ADC peripheral if conversions are effectively stopped */
|
|---|
| 1631 | if (tmp_hal_status == HAL_OK)
|
|---|
| 1632 | {
|
|---|
| 1633 | /* Disable ADC end of conversion interrupt for regular group */
|
|---|
| 1634 | /* Disable ADC overrun interrupt */
|
|---|
| 1635 | __HAL_ADC_DISABLE_IT(hadc, (ADC_IT_EOC | ADC_IT_EOS | ADC_IT_OVR));
|
|---|
| 1636 |
|
|---|
| 1637 | /* 2. Disable the ADC peripheral */
|
|---|
| 1638 | tmp_hal_status = ADC_Disable(hadc);
|
|---|
| 1639 |
|
|---|
| 1640 | /* Check if ADC is effectively disabled */
|
|---|
| 1641 | if (tmp_hal_status == HAL_OK)
|
|---|
| 1642 | {
|
|---|
| 1643 | /* Set ADC state */
|
|---|
| 1644 | ADC_STATE_CLR_SET(hadc->State,
|
|---|
| 1645 | HAL_ADC_STATE_REG_BUSY,
|
|---|
| 1646 | HAL_ADC_STATE_READY);
|
|---|
| 1647 | }
|
|---|
| 1648 | }
|
|---|
| 1649 |
|
|---|
| 1650 | __HAL_UNLOCK(hadc);
|
|---|
| 1651 |
|
|---|
| 1652 | return tmp_hal_status;
|
|---|
| 1653 | }
|
|---|
| 1654 |
|
|---|
| 1655 | /**
|
|---|
| 1656 | * @brief Enable ADC, start conversion of regular group and transfer result through DMA.
|
|---|
| 1657 | * @note Interruptions enabled in this function:
|
|---|
| 1658 | * overrun (if applicable), DMA half transfer, DMA transfer complete.
|
|---|
| 1659 | * Each of these interruptions has its dedicated callback function.
|
|---|
| 1660 | * @param hadc ADC handle
|
|---|
| 1661 | * @param pData Destination Buffer address.
|
|---|
| 1662 | * @param Length Number of data to be transferred from ADC peripheral to memory
|
|---|
| 1663 | * @retval HAL status.
|
|---|
| 1664 | */
|
|---|
| 1665 | HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef *hadc, uint32_t *pData, uint32_t Length)
|
|---|
| 1666 | {
|
|---|
| 1667 | HAL_StatusTypeDef tmp_hal_status;
|
|---|
| 1668 |
|
|---|
| 1669 | /* Check the parameters */
|
|---|
| 1670 | assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
|
|---|
| 1671 |
|
|---|
| 1672 | /* Perform ADC enable and conversion start if no conversion is on going */
|
|---|
| 1673 | if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
|
|---|
| 1674 | {
|
|---|
| 1675 | __HAL_LOCK(hadc);
|
|---|
| 1676 |
|
|---|
| 1677 | /* Specific case for first call occurrence of this function (DMA transfer */
|
|---|
| 1678 | /* not activated and ADC disabled), DMA transfer must be activated */
|
|---|
| 1679 | /* with ADC disabled. */
|
|---|
| 1680 | if ((hadc->Instance->CFGR1 & ADC_CFGR1_DMAEN) == 0UL)
|
|---|
| 1681 | {
|
|---|
| 1682 | if (LL_ADC_IsEnabled(hadc->Instance) != 0UL)
|
|---|
| 1683 | {
|
|---|
| 1684 | /* Disable ADC */
|
|---|
| 1685 | LL_ADC_Disable(hadc->Instance);
|
|---|
| 1686 | }
|
|---|
| 1687 |
|
|---|
| 1688 | /* Enable ADC DMA mode */
|
|---|
| 1689 | hadc->Instance->CFGR1 |= ADC_CFGR1_DMAEN;
|
|---|
| 1690 | }
|
|---|
| 1691 |
|
|---|
| 1692 | /* Enable the ADC peripheral */
|
|---|
| 1693 | tmp_hal_status = ADC_Enable(hadc);
|
|---|
| 1694 |
|
|---|
| 1695 | /* Start conversion if ADC is effectively enabled */
|
|---|
| 1696 | if (tmp_hal_status == HAL_OK)
|
|---|
| 1697 | {
|
|---|
| 1698 | /* Set ADC state */
|
|---|
| 1699 | /* - Clear state bitfield related to regular group conversion results */
|
|---|
| 1700 | /* - Set state bitfield related to regular operation */
|
|---|
| 1701 | ADC_STATE_CLR_SET(hadc->State,
|
|---|
| 1702 | HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR | HAL_ADC_STATE_REG_EOSMP,
|
|---|
| 1703 | HAL_ADC_STATE_REG_BUSY);
|
|---|
| 1704 |
|
|---|
| 1705 | /* Set ADC error code */
|
|---|
| 1706 | /* Reset all ADC error code fields */
|
|---|
| 1707 | ADC_CLEAR_ERRORCODE(hadc);
|
|---|
| 1708 |
|
|---|
| 1709 | /* Set the DMA transfer complete callback */
|
|---|
| 1710 | hadc->DMA_Handle->XferCpltCallback = ADC_DMAConvCplt;
|
|---|
| 1711 |
|
|---|
| 1712 | /* Set the DMA half transfer complete callback */
|
|---|
| 1713 | hadc->DMA_Handle->XferHalfCpltCallback = ADC_DMAHalfConvCplt;
|
|---|
| 1714 |
|
|---|
| 1715 | /* Set the DMA error callback */
|
|---|
| 1716 | hadc->DMA_Handle->XferErrorCallback = ADC_DMAError;
|
|---|
| 1717 |
|
|---|
| 1718 |
|
|---|
| 1719 | /* Manage ADC and DMA start: ADC overrun interruption, DMA start, ADC */
|
|---|
| 1720 | /* start (in case of SW start): */
|
|---|
| 1721 |
|
|---|
| 1722 | /* Clear regular group conversion flag and overrun flag */
|
|---|
| 1723 | /* (To ensure of no unknown state from potential previous ADC */
|
|---|
| 1724 | /* operations) */
|
|---|
| 1725 | __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS | ADC_FLAG_OVR));
|
|---|
| 1726 |
|
|---|
| 1727 | /* Process unlocked */
|
|---|
| 1728 | /* Unlock before starting ADC conversions: in case of potential */
|
|---|
| 1729 | /* interruption, to let the process to ADC IRQ Handler. */
|
|---|
| 1730 | __HAL_UNLOCK(hadc);
|
|---|
| 1731 |
|
|---|
| 1732 | /* Enable ADC overrun interrupt */
|
|---|
| 1733 | __HAL_ADC_ENABLE_IT(hadc, ADC_IT_OVR);
|
|---|
| 1734 |
|
|---|
| 1735 | /* Start the DMA channel */
|
|---|
| 1736 | tmp_hal_status = HAL_DMA_Start_IT(hadc->DMA_Handle, (uint32_t)&hadc->Instance->DR, (uint32_t)pData, Length);
|
|---|
| 1737 |
|
|---|
| 1738 | /* Enable conversion of regular group. */
|
|---|
| 1739 | /* If software start has been selected, conversion starts immediately. */
|
|---|
| 1740 | /* If external trigger has been selected, conversion will start at next */
|
|---|
| 1741 | /* trigger event. */
|
|---|
| 1742 | /* Start ADC group regular conversion */
|
|---|
| 1743 | LL_ADC_REG_StartConversion(hadc->Instance);
|
|---|
| 1744 | }
|
|---|
| 1745 | }
|
|---|
| 1746 | else
|
|---|
| 1747 | {
|
|---|
| 1748 | tmp_hal_status = HAL_BUSY;
|
|---|
| 1749 | }
|
|---|
| 1750 |
|
|---|
| 1751 | return tmp_hal_status;
|
|---|
| 1752 | }
|
|---|
| 1753 |
|
|---|
| 1754 | /**
|
|---|
| 1755 | * @brief Stop ADC conversion of regular group (and injected group in
|
|---|
| 1756 | * case of auto_injection mode), disable ADC DMA transfer, disable
|
|---|
| 1757 | * ADC peripheral.
|
|---|
| 1758 | * @param hadc ADC handle
|
|---|
| 1759 | * @retval HAL status.
|
|---|
| 1760 | */
|
|---|
| 1761 | HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef *hadc)
|
|---|
| 1762 | {
|
|---|
| 1763 | HAL_StatusTypeDef tmp_hal_status;
|
|---|
| 1764 |
|
|---|
| 1765 | /* Check the parameters */
|
|---|
| 1766 | assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
|
|---|
| 1767 |
|
|---|
| 1768 | __HAL_LOCK(hadc);
|
|---|
| 1769 |
|
|---|
| 1770 | /* 1. Stop potential ADC group regular conversion on going */
|
|---|
| 1771 | tmp_hal_status = ADC_ConversionStop(hadc);
|
|---|
| 1772 |
|
|---|
| 1773 | /* Disable ADC peripheral if conversions are effectively stopped */
|
|---|
| 1774 | if (tmp_hal_status == HAL_OK)
|
|---|
| 1775 | {
|
|---|
| 1776 | /* Disable the DMA channel (in case of DMA in circular mode or stop */
|
|---|
| 1777 | /* while DMA transfer is on going) */
|
|---|
| 1778 | if (hadc->DMA_Handle->State == HAL_DMA_STATE_BUSY)
|
|---|
| 1779 | {
|
|---|
| 1780 | tmp_hal_status = HAL_DMA_Abort(hadc->DMA_Handle);
|
|---|
| 1781 |
|
|---|
| 1782 | /* Check if DMA channel effectively disabled */
|
|---|
| 1783 | if (tmp_hal_status != HAL_OK)
|
|---|
| 1784 | {
|
|---|
| 1785 | /* Update ADC state machine to error */
|
|---|
| 1786 | SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_DMA);
|
|---|
| 1787 | }
|
|---|
| 1788 | }
|
|---|
| 1789 |
|
|---|
| 1790 | /* Disable ADC overrun interrupt */
|
|---|
| 1791 | __HAL_ADC_DISABLE_IT(hadc, ADC_IT_OVR);
|
|---|
| 1792 |
|
|---|
| 1793 | /* 2. Disable the ADC peripheral */
|
|---|
| 1794 | /* Update "tmp_hal_status" only if DMA channel disabling passed, */
|
|---|
| 1795 | /* to keep in memory a potential failing status. */
|
|---|
| 1796 | if (tmp_hal_status == HAL_OK)
|
|---|
| 1797 | {
|
|---|
| 1798 | tmp_hal_status = ADC_Disable(hadc);
|
|---|
| 1799 | }
|
|---|
| 1800 | else
|
|---|
| 1801 | {
|
|---|
| 1802 | (void)ADC_Disable(hadc);
|
|---|
| 1803 | }
|
|---|
| 1804 |
|
|---|
| 1805 | /* Check if ADC is effectively disabled */
|
|---|
| 1806 | if (tmp_hal_status == HAL_OK)
|
|---|
| 1807 | {
|
|---|
| 1808 | /* Set ADC state */
|
|---|
| 1809 | ADC_STATE_CLR_SET(hadc->State,
|
|---|
| 1810 | HAL_ADC_STATE_REG_BUSY,
|
|---|
| 1811 | HAL_ADC_STATE_READY);
|
|---|
| 1812 | }
|
|---|
| 1813 |
|
|---|
| 1814 | /* Disable ADC DMA (ADC DMA configuration of continuous requests is kept) */
|
|---|
| 1815 | CLEAR_BIT(hadc->Instance->CFGR1, ADC_CFGR1_DMAEN);
|
|---|
| 1816 | }
|
|---|
| 1817 |
|
|---|
| 1818 | __HAL_UNLOCK(hadc);
|
|---|
| 1819 |
|
|---|
| 1820 | return tmp_hal_status;
|
|---|
| 1821 | }
|
|---|
| 1822 |
|
|---|
| 1823 | /**
|
|---|
| 1824 | * @brief Get ADC regular group conversion result.
|
|---|
| 1825 | * @note Reading register DR automatically clears ADC flag EOC
|
|---|
| 1826 | * (ADC group regular end of unitary conversion).
|
|---|
| 1827 | * @note This function does not clear ADC flag EOS
|
|---|
| 1828 | * (ADC group regular end of sequence conversion).
|
|---|
| 1829 | * Occurrence of flag EOS rising:
|
|---|
| 1830 | * - If sequencer is composed of 1 rank, flag EOS is equivalent
|
|---|
| 1831 | * to flag EOC.
|
|---|
| 1832 | * - If sequencer is composed of several ranks, during the scan
|
|---|
| 1833 | * sequence flag EOC only is raised, at the end of the scan sequence
|
|---|
| 1834 | * both flags EOC and EOS are raised.
|
|---|
| 1835 | * To clear this flag, either use function:
|
|---|
| 1836 | * in programming model IT: @ref HAL_ADC_IRQHandler(), in programming
|
|---|
| 1837 | * model polling: @ref HAL_ADC_PollForConversion()
|
|---|
| 1838 | * or @ref __HAL_ADC_CLEAR_FLAG(&hadc, ADC_FLAG_EOS).
|
|---|
| 1839 | * @param hadc ADC handle
|
|---|
| 1840 | * @retval ADC group regular conversion data
|
|---|
| 1841 | */
|
|---|
| 1842 | uint32_t HAL_ADC_GetValue(const ADC_HandleTypeDef *hadc)
|
|---|
| 1843 | {
|
|---|
| 1844 | /* Check the parameters */
|
|---|
| 1845 | assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
|
|---|
| 1846 |
|
|---|
| 1847 | /* Note: EOC flag is not cleared here by software because automatically */
|
|---|
| 1848 | /* cleared by hardware when reading register DR. */
|
|---|
| 1849 |
|
|---|
| 1850 | /* Return ADC converted value */
|
|---|
| 1851 | return hadc->Instance->DR;
|
|---|
| 1852 | }
|
|---|
| 1853 |
|
|---|
| 1854 | /**
|
|---|
| 1855 | * @brief Handle ADC interrupt request.
|
|---|
| 1856 | * @param hadc ADC handle
|
|---|
| 1857 | * @retval None
|
|---|
| 1858 | */
|
|---|
| 1859 | void HAL_ADC_IRQHandler(ADC_HandleTypeDef *hadc)
|
|---|
| 1860 | {
|
|---|
| 1861 | uint32_t overrun_error = 0UL; /* flag set if overrun occurrence has to be considered as an error */
|
|---|
| 1862 | uint32_t tmp_isr = hadc->Instance->ISR;
|
|---|
| 1863 | uint32_t tmp_ier = hadc->Instance->IER;
|
|---|
| 1864 |
|
|---|
| 1865 | /* Check the parameters */
|
|---|
| 1866 | assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
|
|---|
| 1867 | assert_param(IS_ADC_EOC_SELECTION(hadc->Init.EOCSelection));
|
|---|
| 1868 |
|
|---|
| 1869 | /* ========== Check End of Sampling flag for ADC group regular ========== */
|
|---|
| 1870 | if (((tmp_isr & ADC_FLAG_EOSMP) == ADC_FLAG_EOSMP) && ((tmp_ier & ADC_IT_EOSMP) == ADC_IT_EOSMP))
|
|---|
| 1871 | {
|
|---|
| 1872 | /* Update state machine on end of sampling status if not in error state */
|
|---|
| 1873 | if ((hadc->State & HAL_ADC_STATE_ERROR_INTERNAL) == 0UL)
|
|---|
| 1874 | {
|
|---|
| 1875 | /* Set ADC state */
|
|---|
| 1876 | SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOSMP);
|
|---|
| 1877 | }
|
|---|
| 1878 |
|
|---|
| 1879 | /* End Of Sampling callback */
|
|---|
| 1880 | #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
|
|---|
| 1881 | hadc->EndOfSamplingCallback(hadc);
|
|---|
| 1882 | #else
|
|---|
| 1883 | HAL_ADCEx_EndOfSamplingCallback(hadc);
|
|---|
| 1884 | #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
|
|---|
| 1885 |
|
|---|
| 1886 | /* Clear regular group conversion flag */
|
|---|
| 1887 | __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOSMP);
|
|---|
| 1888 | }
|
|---|
| 1889 |
|
|---|
| 1890 | /* ====== Check ADC group regular end of unitary conversion sequence conversions ===== */
|
|---|
| 1891 | if ((((tmp_isr & ADC_FLAG_EOC) == ADC_FLAG_EOC) && ((tmp_ier & ADC_IT_EOC) == ADC_IT_EOC)) ||
|
|---|
| 1892 | (((tmp_isr & ADC_FLAG_EOS) == ADC_FLAG_EOS) && ((tmp_ier & ADC_IT_EOS) == ADC_IT_EOS)))
|
|---|
| 1893 | {
|
|---|
| 1894 | /* Update state machine on conversion status if not in error state */
|
|---|
| 1895 | if ((hadc->State & HAL_ADC_STATE_ERROR_INTERNAL) == 0UL)
|
|---|
| 1896 | {
|
|---|
| 1897 | /* Set ADC state */
|
|---|
| 1898 | SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
|
|---|
| 1899 | }
|
|---|
| 1900 |
|
|---|
| 1901 | /* Determine whether any further conversion upcoming on group regular */
|
|---|
| 1902 | /* by external trigger, continuous mode or scan sequence on going */
|
|---|
| 1903 | /* to disable interruption. */
|
|---|
| 1904 | if ((LL_ADC_REG_IsTriggerSourceSWStart(hadc->Instance) != 0UL)
|
|---|
| 1905 | && (hadc->Init.ContinuousConvMode == DISABLE)
|
|---|
| 1906 | )
|
|---|
| 1907 | {
|
|---|
| 1908 | /* If End of Sequence is reached, disable interrupts */
|
|---|
| 1909 | if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOS))
|
|---|
| 1910 | {
|
|---|
| 1911 | /* Allowed to modify bits ADC_IT_EOC/ADC_IT_EOS only if bit */
|
|---|
| 1912 | /* ADSTART==0 (no conversion on going) */
|
|---|
| 1913 | if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
|
|---|
| 1914 | {
|
|---|
| 1915 | /* Disable ADC end of single conversion interrupt on group regular */
|
|---|
| 1916 | /* Note: Overrun interrupt was enabled with EOC interrupt in */
|
|---|
| 1917 | /* HAL_Start_IT(), but is not disabled here because can be used */
|
|---|
| 1918 | /* by overrun IRQ process below. */
|
|---|
| 1919 | __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC | ADC_IT_EOS);
|
|---|
| 1920 |
|
|---|
| 1921 | /* Set ADC state */
|
|---|
| 1922 | ADC_STATE_CLR_SET(hadc->State,
|
|---|
| 1923 | HAL_ADC_STATE_REG_BUSY,
|
|---|
| 1924 | HAL_ADC_STATE_READY);
|
|---|
| 1925 | }
|
|---|
| 1926 | else
|
|---|
| 1927 | {
|
|---|
| 1928 | /* Change ADC state to error state */
|
|---|
| 1929 | SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
|
|---|
| 1930 |
|
|---|
| 1931 | /* Set ADC error code to ADC peripheral internal error */
|
|---|
| 1932 | SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
|
|---|
| 1933 | }
|
|---|
| 1934 | }
|
|---|
| 1935 | }
|
|---|
| 1936 |
|
|---|
| 1937 | /* Conversion complete callback */
|
|---|
| 1938 | /* Note: Into callback function "HAL_ADC_ConvCpltCallback()", */
|
|---|
| 1939 | /* to determine if conversion has been triggered from EOC or EOS, */
|
|---|
| 1940 | /* possibility to use: */
|
|---|
| 1941 | /* " if ( __HAL_ADC_GET_FLAG(&hadc, ADC_FLAG_EOS)) " */
|
|---|
| 1942 | #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
|
|---|
| 1943 | hadc->ConvCpltCallback(hadc);
|
|---|
| 1944 | #else
|
|---|
| 1945 | HAL_ADC_ConvCpltCallback(hadc);
|
|---|
| 1946 | #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
|
|---|
| 1947 |
|
|---|
| 1948 | /* Clear regular group conversion flag */
|
|---|
| 1949 | /* Note: in case of overrun set to ADC_OVR_DATA_PRESERVED, end of */
|
|---|
| 1950 | /* conversion flags clear induces the release of the preserved data.*/
|
|---|
| 1951 | /* Therefore, if the preserved data value is needed, it must be */
|
|---|
| 1952 | /* read preliminarily into HAL_ADC_ConvCpltCallback(). */
|
|---|
| 1953 | __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS));
|
|---|
| 1954 | }
|
|---|
| 1955 |
|
|---|
| 1956 | /* ========== Check Analog watchdog 1 flag ========== */
|
|---|
| 1957 | if (((tmp_isr & ADC_FLAG_AWD1) == ADC_FLAG_AWD1) && ((tmp_ier & ADC_IT_AWD1) == ADC_IT_AWD1))
|
|---|
| 1958 | {
|
|---|
| 1959 | /* Set ADC state */
|
|---|
| 1960 | SET_BIT(hadc->State, HAL_ADC_STATE_AWD1);
|
|---|
| 1961 |
|
|---|
| 1962 | /* Level out of window 1 callback */
|
|---|
| 1963 | #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
|
|---|
| 1964 | hadc->LevelOutOfWindowCallback(hadc);
|
|---|
| 1965 | #else
|
|---|
| 1966 | HAL_ADC_LevelOutOfWindowCallback(hadc);
|
|---|
| 1967 | #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
|
|---|
| 1968 |
|
|---|
| 1969 | /* Clear ADC analog watchdog flag */
|
|---|
| 1970 | __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD1);
|
|---|
| 1971 | }
|
|---|
| 1972 |
|
|---|
| 1973 | /* ========== Check analog watchdog 2 flag ========== */
|
|---|
| 1974 | if (((tmp_isr & ADC_FLAG_AWD2) == ADC_FLAG_AWD2) && ((tmp_ier & ADC_IT_AWD2) == ADC_IT_AWD2))
|
|---|
| 1975 | {
|
|---|
| 1976 | /* Set ADC state */
|
|---|
| 1977 | SET_BIT(hadc->State, HAL_ADC_STATE_AWD2);
|
|---|
| 1978 |
|
|---|
| 1979 | /* Level out of window 2 callback */
|
|---|
| 1980 | #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
|
|---|
| 1981 | hadc->LevelOutOfWindow2Callback(hadc);
|
|---|
| 1982 | #else
|
|---|
| 1983 | HAL_ADCEx_LevelOutOfWindow2Callback(hadc);
|
|---|
| 1984 | #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
|
|---|
| 1985 |
|
|---|
| 1986 | /* Clear ADC analog watchdog flag */
|
|---|
| 1987 | __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD2);
|
|---|
| 1988 | }
|
|---|
| 1989 |
|
|---|
| 1990 | /* ========== Check analog watchdog 3 flag ========== */
|
|---|
| 1991 | if (((tmp_isr & ADC_FLAG_AWD3) == ADC_FLAG_AWD3) && ((tmp_ier & ADC_IT_AWD3) == ADC_IT_AWD3))
|
|---|
| 1992 | {
|
|---|
| 1993 | /* Set ADC state */
|
|---|
| 1994 | SET_BIT(hadc->State, HAL_ADC_STATE_AWD3);
|
|---|
| 1995 |
|
|---|
| 1996 | /* Level out of window 3 callback */
|
|---|
| 1997 | #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
|
|---|
| 1998 | hadc->LevelOutOfWindow3Callback(hadc);
|
|---|
| 1999 | #else
|
|---|
| 2000 | HAL_ADCEx_LevelOutOfWindow3Callback(hadc);
|
|---|
| 2001 | #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
|
|---|
| 2002 |
|
|---|
| 2003 | /* Clear ADC analog watchdog flag */
|
|---|
| 2004 | __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD3);
|
|---|
| 2005 | }
|
|---|
| 2006 |
|
|---|
| 2007 | /* ========== Check Overrun flag ========== */
|
|---|
| 2008 | if (((tmp_isr & ADC_FLAG_OVR) == ADC_FLAG_OVR) && ((tmp_ier & ADC_IT_OVR) == ADC_IT_OVR))
|
|---|
| 2009 | {
|
|---|
| 2010 | /* If overrun is set to overwrite previous data (default setting), */
|
|---|
| 2011 | /* overrun event is not considered as an error. */
|
|---|
| 2012 | /* (cf ref manual "Managing conversions without using the DMA and without */
|
|---|
| 2013 | /* overrun ") */
|
|---|
| 2014 | /* Exception for usage with DMA overrun event always considered as an */
|
|---|
| 2015 | /* error. */
|
|---|
| 2016 | if (hadc->Init.Overrun == ADC_OVR_DATA_PRESERVED)
|
|---|
| 2017 | {
|
|---|
| 2018 | overrun_error = 1UL;
|
|---|
| 2019 | }
|
|---|
| 2020 | else
|
|---|
| 2021 | {
|
|---|
| 2022 | /* Check DMA configuration */
|
|---|
| 2023 | if (LL_ADC_REG_GetDMATransfer(hadc->Instance) != LL_ADC_REG_DMA_TRANSFER_NONE)
|
|---|
| 2024 | {
|
|---|
| 2025 | overrun_error = 1UL;
|
|---|
| 2026 | }
|
|---|
| 2027 | }
|
|---|
| 2028 |
|
|---|
| 2029 | if (overrun_error == 1UL)
|
|---|
| 2030 | {
|
|---|
| 2031 | /* Change ADC state to error state */
|
|---|
| 2032 | SET_BIT(hadc->State, HAL_ADC_STATE_REG_OVR);
|
|---|
| 2033 |
|
|---|
| 2034 | /* Set ADC error code to overrun */
|
|---|
| 2035 | SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_OVR);
|
|---|
| 2036 |
|
|---|
| 2037 | /* Error callback */
|
|---|
| 2038 | /* Note: In case of overrun, ADC conversion data is preserved until */
|
|---|
| 2039 | /* flag OVR is reset. */
|
|---|
| 2040 | /* Therefore, old ADC conversion data can be retrieved in */
|
|---|
| 2041 | /* function "HAL_ADC_ErrorCallback()". */
|
|---|
| 2042 | #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
|
|---|
| 2043 | hadc->ErrorCallback(hadc);
|
|---|
| 2044 | #else
|
|---|
| 2045 | HAL_ADC_ErrorCallback(hadc);
|
|---|
| 2046 | #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
|
|---|
| 2047 | }
|
|---|
| 2048 |
|
|---|
| 2049 | /* Clear ADC overrun flag */
|
|---|
| 2050 | __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR);
|
|---|
| 2051 | }
|
|---|
| 2052 |
|
|---|
| 2053 | /* ========== Check channel configuration ready flag ========== */
|
|---|
| 2054 | if (((tmp_isr & ADC_FLAG_CCRDY) == ADC_FLAG_CCRDY) && ((tmp_ier & ADC_IT_CCRDY) == ADC_IT_CCRDY))
|
|---|
| 2055 | {
|
|---|
| 2056 | /* Channel configuration ready callback */
|
|---|
| 2057 | HAL_ADCEx_ChannelConfigReadyCallback(hadc);
|
|---|
| 2058 |
|
|---|
| 2059 | /* Clear ADC analog watchdog flag */
|
|---|
| 2060 | __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_CCRDY);
|
|---|
| 2061 | }
|
|---|
| 2062 | }
|
|---|
| 2063 |
|
|---|
| 2064 | /**
|
|---|
| 2065 | * @brief Conversion complete callback in non-blocking mode.
|
|---|
| 2066 | * @param hadc ADC handle
|
|---|
| 2067 | * @retval None
|
|---|
| 2068 | */
|
|---|
| 2069 | __weak void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
|
|---|
| 2070 | {
|
|---|
| 2071 | /* Prevent unused argument(s) compilation warning */
|
|---|
| 2072 | UNUSED(hadc);
|
|---|
| 2073 |
|
|---|
| 2074 | /* NOTE : This function should not be modified. When the callback is needed,
|
|---|
| 2075 | function HAL_ADC_ConvCpltCallback must be implemented in the user file.
|
|---|
| 2076 | */
|
|---|
| 2077 | }
|
|---|
| 2078 |
|
|---|
| 2079 | /**
|
|---|
| 2080 | * @brief Conversion DMA half-transfer callback in non-blocking mode.
|
|---|
| 2081 | * @param hadc ADC handle
|
|---|
| 2082 | * @retval None
|
|---|
| 2083 | */
|
|---|
| 2084 | __weak void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef *hadc)
|
|---|
| 2085 | {
|
|---|
| 2086 | /* Prevent unused argument(s) compilation warning */
|
|---|
| 2087 | UNUSED(hadc);
|
|---|
| 2088 |
|
|---|
| 2089 | /* NOTE : This function should not be modified. When the callback is needed,
|
|---|
| 2090 | function HAL_ADC_ConvHalfCpltCallback must be implemented in the user file.
|
|---|
| 2091 | */
|
|---|
| 2092 | }
|
|---|
| 2093 |
|
|---|
| 2094 | /**
|
|---|
| 2095 | * @brief Analog watchdog 1 callback in non-blocking mode.
|
|---|
| 2096 | * @param hadc ADC handle
|
|---|
| 2097 | * @retval None
|
|---|
| 2098 | */
|
|---|
| 2099 | __weak void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef *hadc)
|
|---|
| 2100 | {
|
|---|
| 2101 | /* Prevent unused argument(s) compilation warning */
|
|---|
| 2102 | UNUSED(hadc);
|
|---|
| 2103 |
|
|---|
| 2104 | /* NOTE : This function should not be modified. When the callback is needed,
|
|---|
| 2105 | function HAL_ADC_LevelOutOfWindowCallback must be implemented in the user file.
|
|---|
| 2106 | */
|
|---|
| 2107 | }
|
|---|
| 2108 |
|
|---|
| 2109 | /**
|
|---|
| 2110 | * @brief ADC error callback in non-blocking mode
|
|---|
| 2111 | * (ADC conversion with interruption or transfer by DMA).
|
|---|
| 2112 | * @note In case of error due to overrun when using ADC with DMA transfer
|
|---|
| 2113 | * (HAL ADC handle parameter "ErrorCode" to state "HAL_ADC_ERROR_OVR"):
|
|---|
| 2114 | * - Reinitialize the DMA using function "HAL_ADC_Stop_DMA()".
|
|---|
| 2115 | * - If needed, restart a new ADC conversion using function
|
|---|
| 2116 | * "HAL_ADC_Start_DMA()"
|
|---|
| 2117 | * (this function is also clearing overrun flag)
|
|---|
| 2118 | * @param hadc ADC handle
|
|---|
| 2119 | * @retval None
|
|---|
| 2120 | */
|
|---|
| 2121 | __weak void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc)
|
|---|
| 2122 | {
|
|---|
| 2123 | /* Prevent unused argument(s) compilation warning */
|
|---|
| 2124 | UNUSED(hadc);
|
|---|
| 2125 |
|
|---|
| 2126 | /* NOTE : This function should not be modified. When the callback is needed,
|
|---|
| 2127 | function HAL_ADC_ErrorCallback must be implemented in the user file.
|
|---|
| 2128 | */
|
|---|
| 2129 | }
|
|---|
| 2130 |
|
|---|
| 2131 | /**
|
|---|
| 2132 | * @}
|
|---|
| 2133 | */
|
|---|
| 2134 |
|
|---|
| 2135 | /** @defgroup ADC_Exported_Functions_Group3 Peripheral Control functions
|
|---|
| 2136 | * @brief Peripheral Control functions
|
|---|
| 2137 | *
|
|---|
| 2138 | @verbatim
|
|---|
| 2139 | ===============================================================================
|
|---|
| 2140 | ##### Peripheral Control functions #####
|
|---|
| 2141 | ===============================================================================
|
|---|
| 2142 | [..] This section provides functions allowing to:
|
|---|
| 2143 | (+) Configure channels on regular group
|
|---|
| 2144 | (+) Configure the analog watchdog
|
|---|
| 2145 |
|
|---|
| 2146 | @endverbatim
|
|---|
| 2147 | * @{
|
|---|
| 2148 | */
|
|---|
| 2149 |
|
|---|
| 2150 | /**
|
|---|
| 2151 | * @brief Configure a channel to be assigned to ADC group regular.
|
|---|
| 2152 | * @note In case of usage of internal measurement channels:
|
|---|
| 2153 | * Vbat/VrefInt/TempSensor.
|
|---|
| 2154 | * These internal paths can be disabled using function
|
|---|
| 2155 | * HAL_ADC_DeInit().
|
|---|
| 2156 | * @note Possibility to update parameters on the fly:
|
|---|
| 2157 | * This function initializes channel into ADC group regular,
|
|---|
| 2158 | * following calls to this function can be used to reconfigure
|
|---|
| 2159 | * some parameters of structure "ADC_ChannelConfTypeDef" on the fly,
|
|---|
| 2160 | * without resetting the ADC.
|
|---|
| 2161 | * The setting of these parameters is conditioned to ADC state:
|
|---|
| 2162 | * Refer to comments of structure "ADC_ChannelConfTypeDef".
|
|---|
| 2163 | * @param hadc ADC handle
|
|---|
| 2164 | * @param pConfig Structure of ADC channel assigned to ADC group regular.
|
|---|
| 2165 | * @retval HAL status
|
|---|
| 2166 | */
|
|---|
| 2167 | HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef *hadc, const ADC_ChannelConfTypeDef *pConfig)
|
|---|
| 2168 | {
|
|---|
| 2169 | HAL_StatusTypeDef tmp_hal_status = HAL_OK;
|
|---|
| 2170 | uint32_t tmp_config_internal_channel;
|
|---|
| 2171 | __IO uint32_t wait_loop_index = 0UL;
|
|---|
| 2172 |
|
|---|
| 2173 | /* Check the parameters */
|
|---|
| 2174 | assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
|
|---|
| 2175 | assert_param(IS_ADC_CHANNEL(pConfig->Channel));
|
|---|
| 2176 | assert_param(IS_ADC_SAMPLING_TIME_COMMON(pConfig->SamplingTime));
|
|---|
| 2177 |
|
|---|
| 2178 | if ((hadc->Init.ScanConvMode == ADC_SCAN_SEQ_FIXED) ||
|
|---|
| 2179 | (hadc->Init.ScanConvMode == ADC_SCAN_SEQ_FIXED_BACKWARD))
|
|---|
| 2180 | {
|
|---|
| 2181 | assert_param(IS_ADC_REGULAR_RANK_SEQ_FIXED(pConfig->Rank));
|
|---|
| 2182 | }
|
|---|
| 2183 | else
|
|---|
| 2184 | {
|
|---|
| 2185 | assert_param(IS_ADC_REGULAR_NB_CONV(hadc->Init.NbrOfConversion));
|
|---|
| 2186 |
|
|---|
| 2187 | assert_param(IS_ADC_REGULAR_RANK(pConfig->Rank));
|
|---|
| 2188 | }
|
|---|
| 2189 |
|
|---|
| 2190 | __HAL_LOCK(hadc);
|
|---|
| 2191 |
|
|---|
| 2192 | /* Parameters update conditioned to ADC state: */
|
|---|
| 2193 | /* Parameters that can be updated when ADC is disabled or enabled without */
|
|---|
| 2194 | /* conversion on going on regular group: */
|
|---|
| 2195 | /* - Channel number */
|
|---|
| 2196 | /* - Channel sampling time */
|
|---|
| 2197 | /* - Management of internal measurement channels: VrefInt/TempSensor/Vbat */
|
|---|
| 2198 | if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
|
|---|
| 2199 | {
|
|---|
| 2200 | /* Configure channel: depending on rank setting, add it or remove it from */
|
|---|
| 2201 | /* ADC sequencer. */
|
|---|
| 2202 | /* If sequencer set to not fully configurable with channel rank set to */
|
|---|
| 2203 | /* none, remove the channel from the sequencer. */
|
|---|
| 2204 | /* Otherwise (sequencer set to fully configurable or to to not fully */
|
|---|
| 2205 | /* configurable with channel rank to be set), configure the selected */
|
|---|
| 2206 | /* channel. */
|
|---|
| 2207 | if (pConfig->Rank != ADC_RANK_NONE)
|
|---|
| 2208 | {
|
|---|
| 2209 | /* Regular sequence configuration */
|
|---|
| 2210 | /* Note: ADC channel configuration requires few ADC clock cycles */
|
|---|
| 2211 | /* to be ready. Processing of ADC settings in this function */
|
|---|
| 2212 | /* induce that a specific wait time is not necessary. */
|
|---|
| 2213 | /* For more details on ADC channel configuration ready, */
|
|---|
| 2214 | /* refer to function "LL_ADC_IsActiveFlag_CCRDY()". */
|
|---|
| 2215 | if ((hadc->Init.ScanConvMode == ADC_SCAN_SEQ_FIXED) ||
|
|---|
| 2216 | (hadc->Init.ScanConvMode == ADC_SCAN_SEQ_FIXED_BACKWARD))
|
|---|
| 2217 | {
|
|---|
| 2218 | /* Sequencer set to not fully configurable: */
|
|---|
| 2219 | /* Set the channel by enabling the corresponding bitfield. */
|
|---|
| 2220 | LL_ADC_REG_SetSequencerChAdd(hadc->Instance, pConfig->Channel);
|
|---|
| 2221 | }
|
|---|
| 2222 | else
|
|---|
| 2223 | {
|
|---|
| 2224 | /* Sequencer set to fully configurable: */
|
|---|
| 2225 | /* Set the channel by entering it into the selected rank. */
|
|---|
| 2226 |
|
|---|
| 2227 | /* Memorize the channel set into variable in HAL ADC handle */
|
|---|
| 2228 | MODIFY_REG(hadc->ADCGroupRegularSequencerRanks,
|
|---|
| 2229 | ADC_CHSELR_SQ1 << (pConfig->Rank & 0x1FUL),
|
|---|
| 2230 | __LL_ADC_CHANNEL_TO_DECIMAL_NB(pConfig->Channel) << (pConfig->Rank & 0x1FUL));
|
|---|
| 2231 |
|
|---|
| 2232 | /* If the selected rank is below ADC group regular sequencer length, */
|
|---|
| 2233 | /* apply the configuration in ADC register. */
|
|---|
| 2234 | /* Note: Otherwise, configuration is not applied. */
|
|---|
| 2235 | /* To apply it, parameter'NbrOfConversion' must be increased. */
|
|---|
| 2236 | if (((pConfig->Rank >> 2UL) + 1UL) <= hadc->Init.NbrOfConversion)
|
|---|
| 2237 | {
|
|---|
| 2238 | LL_ADC_REG_SetSequencerRanks(hadc->Instance, pConfig->Rank, pConfig->Channel);
|
|---|
| 2239 | }
|
|---|
| 2240 | }
|
|---|
| 2241 |
|
|---|
| 2242 | /* Set sampling time of the selected ADC channel */
|
|---|
| 2243 | LL_ADC_SetChannelSamplingTime(hadc->Instance, pConfig->Channel, pConfig->SamplingTime);
|
|---|
| 2244 |
|
|---|
| 2245 | /* Management of internal measurement channels: VrefInt/TempSensor/Vbat */
|
|---|
| 2246 | /* internal measurement paths enable: If internal channel selected, */
|
|---|
| 2247 | /* enable dedicated internal buffers and path. */
|
|---|
| 2248 | /* Note: these internal measurement paths can be disabled using */
|
|---|
| 2249 | /* HAL_ADC_DeInit() or removing the channel from sequencer with */
|
|---|
| 2250 | /* channel configuration parameter "Rank". */
|
|---|
| 2251 | if (__LL_ADC_IS_CHANNEL_INTERNAL(pConfig->Channel))
|
|---|
| 2252 | {
|
|---|
| 2253 | tmp_config_internal_channel = LL_ADC_GetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance));
|
|---|
| 2254 |
|
|---|
| 2255 | /* If the requested internal measurement path has already been enabled, */
|
|---|
| 2256 | /* bypass the configuration processing. */
|
|---|
| 2257 | if ((pConfig->Channel == ADC_CHANNEL_TEMPSENSOR) &&
|
|---|
| 2258 | ((tmp_config_internal_channel & LL_ADC_PATH_INTERNAL_TEMPSENSOR) == 0UL))
|
|---|
| 2259 | {
|
|---|
| 2260 | LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance),
|
|---|
| 2261 | LL_ADC_PATH_INTERNAL_TEMPSENSOR | tmp_config_internal_channel);
|
|---|
| 2262 |
|
|---|
| 2263 | /* Delay for temperature sensor stabilization time */
|
|---|
| 2264 | /* Wait loop initialization and execution */
|
|---|
| 2265 | /* Note: Variable divided by 2 to compensate partially */
|
|---|
| 2266 | /* CPU processing cycles, scaling in us split to not */
|
|---|
| 2267 | /* exceed 32 bits register capacity and handle low frequency. */
|
|---|
| 2268 | wait_loop_index = ((LL_ADC_DELAY_TEMPSENSOR_STAB_US / 10UL) * ((SystemCoreClock / (100000UL * 2UL)) + 1UL));
|
|---|
| 2269 | while (wait_loop_index != 0UL)
|
|---|
| 2270 | {
|
|---|
| 2271 | wait_loop_index--;
|
|---|
| 2272 | }
|
|---|
| 2273 | }
|
|---|
| 2274 | else if ((pConfig->Channel == ADC_CHANNEL_VBAT)
|
|---|
| 2275 | && ((tmp_config_internal_channel & LL_ADC_PATH_INTERNAL_VBAT) == 0UL))
|
|---|
| 2276 | {
|
|---|
| 2277 | LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance),
|
|---|
| 2278 | LL_ADC_PATH_INTERNAL_VBAT | tmp_config_internal_channel);
|
|---|
| 2279 | }
|
|---|
| 2280 | else if ((pConfig->Channel == ADC_CHANNEL_VREFINT) &&
|
|---|
| 2281 | ((tmp_config_internal_channel & LL_ADC_PATH_INTERNAL_VREFINT) == 0UL))
|
|---|
| 2282 | {
|
|---|
| 2283 | LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance),
|
|---|
| 2284 | LL_ADC_PATH_INTERNAL_VREFINT | tmp_config_internal_channel);
|
|---|
| 2285 | }
|
|---|
| 2286 | else
|
|---|
| 2287 | {
|
|---|
| 2288 | /* nothing to do */
|
|---|
| 2289 | }
|
|---|
| 2290 | }
|
|---|
| 2291 | }
|
|---|
| 2292 | else
|
|---|
| 2293 | {
|
|---|
| 2294 | /* Regular sequencer configuration */
|
|---|
| 2295 | /* Note: Case of sequencer set to fully configurable: */
|
|---|
| 2296 | /* Sequencer rank cannot be disabled, only affected to */
|
|---|
| 2297 | /* another channel. */
|
|---|
| 2298 | /* To remove a rank, use parameter 'NbrOfConversion". */
|
|---|
| 2299 | if ((hadc->Init.ScanConvMode == ADC_SCAN_SEQ_FIXED) ||
|
|---|
| 2300 | (hadc->Init.ScanConvMode == ADC_SCAN_SEQ_FIXED_BACKWARD))
|
|---|
| 2301 | {
|
|---|
| 2302 | /* Sequencer set to not fully configurable: */
|
|---|
| 2303 | /* Reset the channel by disabling the corresponding bitfield. */
|
|---|
| 2304 | LL_ADC_REG_SetSequencerChRem(hadc->Instance, pConfig->Channel);
|
|---|
| 2305 | }
|
|---|
| 2306 |
|
|---|
| 2307 | /* Management of internal measurement channels: Vbat/VrefInt/TempSensor. */
|
|---|
| 2308 | /* If internal channel selected, enable dedicated internal buffers and */
|
|---|
| 2309 | /* paths. */
|
|---|
| 2310 | if (__LL_ADC_IS_CHANNEL_INTERNAL(pConfig->Channel))
|
|---|
| 2311 | {
|
|---|
| 2312 | tmp_config_internal_channel = LL_ADC_GetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance));
|
|---|
| 2313 |
|
|---|
| 2314 | if (pConfig->Channel == ADC_CHANNEL_TEMPSENSOR)
|
|---|
| 2315 | {
|
|---|
| 2316 | LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance),
|
|---|
| 2317 | ~LL_ADC_PATH_INTERNAL_TEMPSENSOR & tmp_config_internal_channel);
|
|---|
| 2318 | }
|
|---|
| 2319 | else if (pConfig->Channel == ADC_CHANNEL_VBAT)
|
|---|
| 2320 | {
|
|---|
| 2321 | LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance),
|
|---|
| 2322 | ~LL_ADC_PATH_INTERNAL_VBAT & tmp_config_internal_channel);
|
|---|
| 2323 | }
|
|---|
| 2324 | else if (pConfig->Channel == ADC_CHANNEL_VREFINT)
|
|---|
| 2325 | {
|
|---|
| 2326 | LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance),
|
|---|
| 2327 | ~LL_ADC_PATH_INTERNAL_VREFINT & tmp_config_internal_channel);
|
|---|
| 2328 | }
|
|---|
| 2329 | else
|
|---|
| 2330 | {
|
|---|
| 2331 | /* nothing to do */
|
|---|
| 2332 | }
|
|---|
| 2333 | }
|
|---|
| 2334 | }
|
|---|
| 2335 | }
|
|---|
| 2336 |
|
|---|
| 2337 | /* If a conversion is on going on regular group, no update on regular */
|
|---|
| 2338 | /* channel could be done on neither of the channel configuration structure */
|
|---|
| 2339 | /* parameters. */
|
|---|
| 2340 | else
|
|---|
| 2341 | {
|
|---|
| 2342 | /* Update ADC state machine to error */
|
|---|
| 2343 | SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
|
|---|
| 2344 |
|
|---|
| 2345 | tmp_hal_status = HAL_ERROR;
|
|---|
| 2346 | }
|
|---|
| 2347 |
|
|---|
| 2348 | __HAL_UNLOCK(hadc);
|
|---|
| 2349 |
|
|---|
| 2350 | return tmp_hal_status;
|
|---|
| 2351 | }
|
|---|
| 2352 |
|
|---|
| 2353 | /**
|
|---|
| 2354 | * @brief Configure the analog watchdog.
|
|---|
| 2355 | * @note Possibility to update parameters on the fly:
|
|---|
| 2356 | * This function initializes the selected analog watchdog, successive
|
|---|
| 2357 | * calls to this function can be used to reconfigure some parameters
|
|---|
| 2358 | * of structure "ADC_AnalogWDGConfTypeDef" on the fly, without resetting
|
|---|
| 2359 | * the ADC.
|
|---|
| 2360 | * The setting of these parameters is conditioned to ADC state.
|
|---|
| 2361 | * For parameters constraints, see comments of structure
|
|---|
| 2362 | * "ADC_AnalogWDGConfTypeDef".
|
|---|
| 2363 | * @note On this STM32 series, analog watchdog thresholds can be modified
|
|---|
| 2364 | * while ADC conversion is on going.
|
|---|
| 2365 | * In this case, some constraints must be taken into account:
|
|---|
| 2366 | * the programmed threshold values are effective from the next
|
|---|
| 2367 | * ADC EOC (end of unitary conversion).
|
|---|
| 2368 | * Considering that registers write delay may happen due to
|
|---|
| 2369 | * bus activity, this might cause an uncertainty on the
|
|---|
| 2370 | * effective timing of the new programmed threshold values.
|
|---|
| 2371 | * @param hadc ADC handle
|
|---|
| 2372 | * @param pAnalogWDGConfig Structure of ADC analog watchdog configuration
|
|---|
| 2373 | * @retval HAL status
|
|---|
| 2374 | */
|
|---|
| 2375 | HAL_StatusTypeDef HAL_ADC_AnalogWDGConfig(ADC_HandleTypeDef *hadc, const ADC_AnalogWDGConfTypeDef *pAnalogWDGConfig)
|
|---|
| 2376 | {
|
|---|
| 2377 | HAL_StatusTypeDef tmp_hal_status = HAL_OK;
|
|---|
| 2378 | uint32_t tmp_awd_high_threshold_shifted;
|
|---|
| 2379 | uint32_t tmp_awd_low_threshold_shifted;
|
|---|
| 2380 | uint32_t backup_setting_adc_enable_state = 0UL;
|
|---|
| 2381 |
|
|---|
| 2382 | /* Check the parameters */
|
|---|
| 2383 | assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
|
|---|
| 2384 | assert_param(IS_ADC_ANALOG_WATCHDOG_NUMBER(pAnalogWDGConfig->WatchdogNumber));
|
|---|
| 2385 | assert_param(IS_ADC_ANALOG_WATCHDOG_MODE(pAnalogWDGConfig->WatchdogMode));
|
|---|
| 2386 | assert_param(IS_FUNCTIONAL_STATE(pAnalogWDGConfig->ITMode));
|
|---|
| 2387 |
|
|---|
| 2388 | if (pAnalogWDGConfig->WatchdogMode == ADC_ANALOGWATCHDOG_SINGLE_REG)
|
|---|
| 2389 | {
|
|---|
| 2390 | assert_param(IS_ADC_CHANNEL(pAnalogWDGConfig->Channel));
|
|---|
| 2391 | }
|
|---|
| 2392 |
|
|---|
| 2393 | /* Verify thresholds range */
|
|---|
| 2394 | if (hadc->Init.OversamplingMode == ENABLE)
|
|---|
| 2395 | {
|
|---|
| 2396 | /* Case of oversampling enabled: depending on ratio and shift configuration,
|
|---|
| 2397 | analog watchdog thresholds can be higher than ADC resolution.
|
|---|
| 2398 | Verify if thresholds are within maximum thresholds range. */
|
|---|
| 2399 | assert_param(IS_ADC_RANGE(ADC_RESOLUTION_12B, pAnalogWDGConfig->HighThreshold));
|
|---|
| 2400 | assert_param(IS_ADC_RANGE(ADC_RESOLUTION_12B, pAnalogWDGConfig->LowThreshold));
|
|---|
| 2401 | }
|
|---|
| 2402 | else
|
|---|
| 2403 | {
|
|---|
| 2404 | /* Verify if thresholds are within the selected ADC resolution */
|
|---|
| 2405 | assert_param(IS_ADC_RANGE(ADC_GET_RESOLUTION(hadc), pAnalogWDGConfig->HighThreshold));
|
|---|
| 2406 | assert_param(IS_ADC_RANGE(ADC_GET_RESOLUTION(hadc), pAnalogWDGConfig->LowThreshold));
|
|---|
| 2407 | }
|
|---|
| 2408 |
|
|---|
| 2409 | __HAL_LOCK(hadc);
|
|---|
| 2410 |
|
|---|
| 2411 | /* Parameters update conditioned to ADC state: */
|
|---|
| 2412 | /* Parameters that can be updated when ADC is disabled or enabled without */
|
|---|
| 2413 | /* conversion on going on ADC group regular: */
|
|---|
| 2414 | /* - Analog watchdog channels */
|
|---|
| 2415 | if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
|
|---|
| 2416 | {
|
|---|
| 2417 | /* Analog watchdog configuration */
|
|---|
| 2418 | if (pAnalogWDGConfig->WatchdogNumber == ADC_ANALOGWATCHDOG_1)
|
|---|
| 2419 | {
|
|---|
| 2420 | /* Constraint of ADC on this STM32 series: ADC must be disable
|
|---|
| 2421 | to modify bitfields of register ADC_CFGR1 */
|
|---|
| 2422 | if (LL_ADC_IsEnabled(hadc->Instance) != 0UL)
|
|---|
| 2423 | {
|
|---|
| 2424 | backup_setting_adc_enable_state = 1UL;
|
|---|
| 2425 | tmp_hal_status = ADC_Disable(hadc);
|
|---|
| 2426 | }
|
|---|
| 2427 |
|
|---|
| 2428 | /* Configuration of analog watchdog: */
|
|---|
| 2429 | /* - Set the analog watchdog enable mode: one or overall group of */
|
|---|
| 2430 | /* channels. */
|
|---|
| 2431 | switch (pAnalogWDGConfig->WatchdogMode)
|
|---|
| 2432 | {
|
|---|
| 2433 | case ADC_ANALOGWATCHDOG_SINGLE_REG:
|
|---|
| 2434 | LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, LL_ADC_AWD1,
|
|---|
| 2435 | __LL_ADC_ANALOGWD_CHANNEL_GROUP(pAnalogWDGConfig->Channel,
|
|---|
| 2436 | LL_ADC_GROUP_REGULAR));
|
|---|
| 2437 | break;
|
|---|
| 2438 |
|
|---|
| 2439 | case ADC_ANALOGWATCHDOG_ALL_REG:
|
|---|
| 2440 | LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, LL_ADC_AWD1, LL_ADC_AWD_ALL_CHANNELS_REG);
|
|---|
| 2441 | break;
|
|---|
| 2442 |
|
|---|
| 2443 | default: /* ADC_ANALOGWATCHDOG_NONE */
|
|---|
| 2444 | LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, LL_ADC_AWD1, LL_ADC_AWD_DISABLE);
|
|---|
| 2445 | break;
|
|---|
| 2446 | }
|
|---|
| 2447 |
|
|---|
| 2448 | if (backup_setting_adc_enable_state == 1UL)
|
|---|
| 2449 | {
|
|---|
| 2450 | if (tmp_hal_status == HAL_OK)
|
|---|
| 2451 | {
|
|---|
| 2452 | tmp_hal_status = ADC_Enable(hadc);
|
|---|
| 2453 | }
|
|---|
| 2454 | }
|
|---|
| 2455 |
|
|---|
| 2456 | /* Update state, clear previous result related to AWD1 */
|
|---|
| 2457 | CLEAR_BIT(hadc->State, HAL_ADC_STATE_AWD1);
|
|---|
| 2458 |
|
|---|
| 2459 | /* Clear flag ADC analog watchdog */
|
|---|
| 2460 | /* Note: Flag cleared Clear the ADC Analog watchdog flag to be ready */
|
|---|
| 2461 | /* to use for HAL_ADC_IRQHandler() or HAL_ADC_PollForEvent() */
|
|---|
| 2462 | /* (in case left enabled by previous ADC operations). */
|
|---|
| 2463 | LL_ADC_ClearFlag_AWD1(hadc->Instance);
|
|---|
| 2464 |
|
|---|
| 2465 | /* Configure ADC analog watchdog interrupt */
|
|---|
| 2466 | if (pAnalogWDGConfig->ITMode == ENABLE)
|
|---|
| 2467 | {
|
|---|
| 2468 | LL_ADC_EnableIT_AWD1(hadc->Instance);
|
|---|
| 2469 | }
|
|---|
| 2470 | else
|
|---|
| 2471 | {
|
|---|
| 2472 | LL_ADC_DisableIT_AWD1(hadc->Instance);
|
|---|
| 2473 | }
|
|---|
| 2474 | }
|
|---|
| 2475 | /* Case of ADC_ANALOGWATCHDOG_2 or ADC_ANALOGWATCHDOG_3 */
|
|---|
| 2476 | else
|
|---|
| 2477 | {
|
|---|
| 2478 | switch (pAnalogWDGConfig->WatchdogMode)
|
|---|
| 2479 | {
|
|---|
| 2480 | case ADC_ANALOGWATCHDOG_SINGLE_REG:
|
|---|
| 2481 | /* Update AWD by bitfield to keep the possibility to monitor */
|
|---|
| 2482 | /* several channels by successive calls of this function. */
|
|---|
| 2483 | if (pAnalogWDGConfig->WatchdogNumber == ADC_ANALOGWATCHDOG_2)
|
|---|
| 2484 | {
|
|---|
| 2485 | SET_BIT(hadc->Instance->AWD2CR, (1UL << __LL_ADC_CHANNEL_TO_DECIMAL_NB(pAnalogWDGConfig->Channel)));
|
|---|
| 2486 | }
|
|---|
| 2487 | else
|
|---|
| 2488 | {
|
|---|
| 2489 | SET_BIT(hadc->Instance->AWD3CR, (1UL << __LL_ADC_CHANNEL_TO_DECIMAL_NB(pAnalogWDGConfig->Channel)));
|
|---|
| 2490 | }
|
|---|
| 2491 | break;
|
|---|
| 2492 |
|
|---|
| 2493 | case ADC_ANALOGWATCHDOG_ALL_REG:
|
|---|
| 2494 | LL_ADC_SetAnalogWDMonitChannels(hadc->Instance,
|
|---|
| 2495 | pAnalogWDGConfig->WatchdogNumber,
|
|---|
| 2496 | LL_ADC_AWD_ALL_CHANNELS_REG);
|
|---|
| 2497 | break;
|
|---|
| 2498 |
|
|---|
| 2499 | default: /* ADC_ANALOGWATCHDOG_NONE */
|
|---|
| 2500 | LL_ADC_SetAnalogWDMonitChannels(hadc->Instance, pAnalogWDGConfig->WatchdogNumber, LL_ADC_AWD_DISABLE);
|
|---|
| 2501 | break;
|
|---|
| 2502 | }
|
|---|
| 2503 |
|
|---|
| 2504 | if (pAnalogWDGConfig->WatchdogNumber == ADC_ANALOGWATCHDOG_2)
|
|---|
| 2505 | {
|
|---|
| 2506 | /* Update state, clear previous result related to AWD2 */
|
|---|
| 2507 | CLEAR_BIT(hadc->State, HAL_ADC_STATE_AWD2);
|
|---|
| 2508 |
|
|---|
| 2509 | /* Clear flag ADC analog watchdog */
|
|---|
| 2510 | /* Note: Flag cleared Clear the ADC Analog watchdog flag to be ready */
|
|---|
| 2511 | /* to use for HAL_ADC_IRQHandler() or HAL_ADC_PollForEvent() */
|
|---|
| 2512 | /* (in case left enabled by previous ADC operations). */
|
|---|
| 2513 | LL_ADC_ClearFlag_AWD2(hadc->Instance);
|
|---|
| 2514 |
|
|---|
| 2515 | /* Configure ADC analog watchdog interrupt */
|
|---|
| 2516 | if (pAnalogWDGConfig->ITMode == ENABLE)
|
|---|
| 2517 | {
|
|---|
| 2518 | LL_ADC_EnableIT_AWD2(hadc->Instance);
|
|---|
| 2519 | }
|
|---|
| 2520 | else
|
|---|
| 2521 | {
|
|---|
| 2522 | LL_ADC_DisableIT_AWD2(hadc->Instance);
|
|---|
| 2523 | }
|
|---|
| 2524 | }
|
|---|
| 2525 | /* (pAnalogWDGConfig->WatchdogNumber == ADC_ANALOGWATCHDOG_3) */
|
|---|
| 2526 | else
|
|---|
| 2527 | {
|
|---|
| 2528 | /* Update state, clear previous result related to AWD3 */
|
|---|
| 2529 | CLEAR_BIT(hadc->State, HAL_ADC_STATE_AWD3);
|
|---|
| 2530 |
|
|---|
| 2531 | /* Clear flag ADC analog watchdog */
|
|---|
| 2532 | /* Note: Flag cleared Clear the ADC Analog watchdog flag to be ready */
|
|---|
| 2533 | /* to use for HAL_ADC_IRQHandler() or HAL_ADC_PollForEvent() */
|
|---|
| 2534 | /* (in case left enabled by previous ADC operations). */
|
|---|
| 2535 | LL_ADC_ClearFlag_AWD3(hadc->Instance);
|
|---|
| 2536 |
|
|---|
| 2537 | /* Configure ADC analog watchdog interrupt */
|
|---|
| 2538 | if (pAnalogWDGConfig->ITMode == ENABLE)
|
|---|
| 2539 | {
|
|---|
| 2540 | LL_ADC_EnableIT_AWD3(hadc->Instance);
|
|---|
| 2541 | }
|
|---|
| 2542 | else
|
|---|
| 2543 | {
|
|---|
| 2544 | LL_ADC_DisableIT_AWD3(hadc->Instance);
|
|---|
| 2545 | }
|
|---|
| 2546 | }
|
|---|
| 2547 | }
|
|---|
| 2548 |
|
|---|
| 2549 | }
|
|---|
| 2550 |
|
|---|
| 2551 | /* Analog watchdog thresholds configuration */
|
|---|
| 2552 | if (pAnalogWDGConfig->WatchdogNumber == ADC_ANALOGWATCHDOG_1)
|
|---|
| 2553 | {
|
|---|
| 2554 | /* Shift the offset with respect to the selected ADC resolution: */
|
|---|
| 2555 | /* Thresholds have to be left-aligned on bit 11, the LSB (right bits) */
|
|---|
| 2556 | /* are set to 0. */
|
|---|
| 2557 | tmp_awd_high_threshold_shifted = ADC_AWD1THRESHOLD_SHIFT_RESOLUTION(hadc, pAnalogWDGConfig->HighThreshold);
|
|---|
| 2558 | tmp_awd_low_threshold_shifted = ADC_AWD1THRESHOLD_SHIFT_RESOLUTION(hadc, pAnalogWDGConfig->LowThreshold);
|
|---|
| 2559 | }
|
|---|
| 2560 | /* Case of ADC_ANALOGWATCHDOG_2 and ADC_ANALOGWATCHDOG_3 */
|
|---|
| 2561 | else
|
|---|
| 2562 | {
|
|---|
| 2563 | /* No need to shift the offset with respect to the selected ADC resolution: */
|
|---|
| 2564 | /* Thresholds have to be left-aligned on bit 11, the LSB (right bits) */
|
|---|
| 2565 | /* are set to 0. */
|
|---|
| 2566 | tmp_awd_high_threshold_shifted = pAnalogWDGConfig->HighThreshold;
|
|---|
| 2567 | tmp_awd_low_threshold_shifted = pAnalogWDGConfig->LowThreshold;
|
|---|
| 2568 | }
|
|---|
| 2569 |
|
|---|
| 2570 | /* Set ADC analog watchdog thresholds value of both thresholds high and low */
|
|---|
| 2571 | LL_ADC_ConfigAnalogWDThresholds(hadc->Instance, pAnalogWDGConfig->WatchdogNumber, tmp_awd_high_threshold_shifted,
|
|---|
| 2572 | tmp_awd_low_threshold_shifted);
|
|---|
| 2573 |
|
|---|
| 2574 | __HAL_UNLOCK(hadc);
|
|---|
| 2575 |
|
|---|
| 2576 | return tmp_hal_status;
|
|---|
| 2577 | }
|
|---|
| 2578 |
|
|---|
| 2579 |
|
|---|
| 2580 | /**
|
|---|
| 2581 | * @}
|
|---|
| 2582 | */
|
|---|
| 2583 |
|
|---|
| 2584 | /** @defgroup ADC_Exported_Functions_Group4 Peripheral State functions
|
|---|
| 2585 | * @brief ADC Peripheral State functions
|
|---|
| 2586 | *
|
|---|
| 2587 | @verbatim
|
|---|
| 2588 | ===============================================================================
|
|---|
| 2589 | ##### Peripheral state and errors functions #####
|
|---|
| 2590 | ===============================================================================
|
|---|
| 2591 | [..]
|
|---|
| 2592 | This subsection provides functions to get in run-time the status of the
|
|---|
| 2593 | peripheral.
|
|---|
| 2594 | (+) Check the ADC state
|
|---|
| 2595 | (+) Check the ADC error code
|
|---|
| 2596 |
|
|---|
| 2597 | @endverbatim
|
|---|
| 2598 | * @{
|
|---|
| 2599 | */
|
|---|
| 2600 |
|
|---|
| 2601 | /**
|
|---|
| 2602 | * @brief Return the ADC handle state.
|
|---|
| 2603 | * @note ADC state machine is managed by bitfields, ADC status must be
|
|---|
| 2604 | * compared with states bits.
|
|---|
| 2605 | * For example:
|
|---|
| 2606 | * " if ((HAL_ADC_GetState(hadc1) & HAL_ADC_STATE_REG_BUSY) != 0UL) "
|
|---|
| 2607 | * " if ((HAL_ADC_GetState(hadc1) & HAL_ADC_STATE_AWD1) != 0UL) "
|
|---|
| 2608 | * @param hadc ADC handle
|
|---|
| 2609 | * @retval ADC handle state (bitfield on 32 bits)
|
|---|
| 2610 | */
|
|---|
| 2611 | uint32_t HAL_ADC_GetState(const ADC_HandleTypeDef *hadc)
|
|---|
| 2612 | {
|
|---|
| 2613 | /* Check the parameters */
|
|---|
| 2614 | assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
|
|---|
| 2615 |
|
|---|
| 2616 | /* Return ADC handle state */
|
|---|
| 2617 | return hadc->State;
|
|---|
| 2618 | }
|
|---|
| 2619 |
|
|---|
| 2620 | /**
|
|---|
| 2621 | * @brief Return the ADC error code.
|
|---|
| 2622 | * @param hadc ADC handle
|
|---|
| 2623 | * @retval ADC error code (bitfield on 32 bits)
|
|---|
| 2624 | */
|
|---|
| 2625 | uint32_t HAL_ADC_GetError(const ADC_HandleTypeDef *hadc)
|
|---|
| 2626 | {
|
|---|
| 2627 | /* Check the parameters */
|
|---|
| 2628 | assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
|
|---|
| 2629 |
|
|---|
| 2630 | return hadc->ErrorCode;
|
|---|
| 2631 | }
|
|---|
| 2632 |
|
|---|
| 2633 | /**
|
|---|
| 2634 | * @}
|
|---|
| 2635 | */
|
|---|
| 2636 |
|
|---|
| 2637 | /**
|
|---|
| 2638 | * @}
|
|---|
| 2639 | */
|
|---|
| 2640 |
|
|---|
| 2641 | /** @defgroup ADC_Private_Functions ADC Private Functions
|
|---|
| 2642 | * @{
|
|---|
| 2643 | */
|
|---|
| 2644 |
|
|---|
| 2645 | /**
|
|---|
| 2646 | * @brief Stop ADC conversion.
|
|---|
| 2647 | * @note Prerequisite condition to use this function: ADC conversions must be
|
|---|
| 2648 | * stopped to disable the ADC.
|
|---|
| 2649 | * @param hadc ADC handle
|
|---|
| 2650 | * @retval HAL status.
|
|---|
| 2651 | */
|
|---|
| 2652 | HAL_StatusTypeDef ADC_ConversionStop(ADC_HandleTypeDef *hadc)
|
|---|
| 2653 | {
|
|---|
| 2654 | uint32_t tickstart;
|
|---|
| 2655 |
|
|---|
| 2656 | /* Check the parameters */
|
|---|
| 2657 | assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
|
|---|
| 2658 |
|
|---|
| 2659 | /* Verification if ADC is not already stopped on regular group to bypass */
|
|---|
| 2660 | /* this function if not needed. */
|
|---|
| 2661 | if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) != 0UL)
|
|---|
| 2662 | {
|
|---|
| 2663 | /* Stop potential conversion on going on regular group */
|
|---|
| 2664 | /* Software is allowed to set ADSTP only when ADSTART=1 and ADDIS=0 */
|
|---|
| 2665 | if (LL_ADC_IsDisableOngoing(hadc->Instance) == 0UL)
|
|---|
| 2666 | {
|
|---|
| 2667 | /* Stop ADC group regular conversion */
|
|---|
| 2668 | LL_ADC_REG_StopConversion(hadc->Instance);
|
|---|
| 2669 | }
|
|---|
| 2670 |
|
|---|
| 2671 | /* Wait for conversion effectively stopped */
|
|---|
| 2672 | /* Get tick count */
|
|---|
| 2673 | tickstart = HAL_GetTick();
|
|---|
| 2674 |
|
|---|
| 2675 | while ((hadc->Instance->CR & ADC_CR_ADSTART) != 0UL)
|
|---|
| 2676 | {
|
|---|
| 2677 | if ((HAL_GetTick() - tickstart) > ADC_STOP_CONVERSION_TIMEOUT)
|
|---|
| 2678 | {
|
|---|
| 2679 | /* New check to avoid false timeout detection in case of preemption */
|
|---|
| 2680 | if ((hadc->Instance->CR & ADC_CR_ADSTART) != 0UL)
|
|---|
| 2681 | {
|
|---|
| 2682 | /* Update ADC state machine to error */
|
|---|
| 2683 | SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
|
|---|
| 2684 |
|
|---|
| 2685 | /* Set ADC error code to ADC peripheral internal error */
|
|---|
| 2686 | SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
|
|---|
| 2687 |
|
|---|
| 2688 | return HAL_ERROR;
|
|---|
| 2689 | }
|
|---|
| 2690 | }
|
|---|
| 2691 | }
|
|---|
| 2692 |
|
|---|
| 2693 | }
|
|---|
| 2694 |
|
|---|
| 2695 | /* Return HAL status */
|
|---|
| 2696 | return HAL_OK;
|
|---|
| 2697 | }
|
|---|
| 2698 |
|
|---|
| 2699 | /**
|
|---|
| 2700 | * @brief Enable the selected ADC.
|
|---|
| 2701 | * @note Prerequisite condition to use this function: ADC must be disabled
|
|---|
| 2702 | * and voltage regulator must be enabled (done into HAL_ADC_Init()).
|
|---|
| 2703 | * @param hadc ADC handle
|
|---|
| 2704 | * @retval HAL status.
|
|---|
| 2705 | */
|
|---|
| 2706 | HAL_StatusTypeDef ADC_Enable(ADC_HandleTypeDef *hadc)
|
|---|
| 2707 | {
|
|---|
| 2708 | uint32_t tickstart;
|
|---|
| 2709 | __IO uint32_t wait_loop_index = 0UL;
|
|---|
| 2710 |
|
|---|
| 2711 | /* ADC enable and wait for ADC ready (in case of ADC is disabled or */
|
|---|
| 2712 | /* enabling phase not yet completed: flag ADC ready not yet set). */
|
|---|
| 2713 | /* Timeout implemented to not be stuck if ADC cannot be enabled (possible */
|
|---|
| 2714 | /* causes: ADC clock not running, ...). */
|
|---|
| 2715 | if (LL_ADC_IsEnabled(hadc->Instance) == 0UL)
|
|---|
| 2716 | {
|
|---|
| 2717 | /* Check if conditions to enable the ADC are fulfilled */
|
|---|
| 2718 | if ((hadc->Instance->CR & (ADC_CR_ADCAL | ADC_CR_ADSTP | ADC_CR_ADSTART | ADC_CR_ADDIS | ADC_CR_ADEN)) != 0UL)
|
|---|
| 2719 | {
|
|---|
| 2720 | /* Update ADC state machine to error */
|
|---|
| 2721 | SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
|
|---|
| 2722 |
|
|---|
| 2723 | /* Set ADC error code to ADC peripheral internal error */
|
|---|
| 2724 | SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
|
|---|
| 2725 |
|
|---|
| 2726 | return HAL_ERROR;
|
|---|
| 2727 | }
|
|---|
| 2728 |
|
|---|
| 2729 | /* Enable the ADC peripheral */
|
|---|
| 2730 | LL_ADC_Enable(hadc->Instance);
|
|---|
| 2731 |
|
|---|
| 2732 | if ((LL_ADC_GetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(hadc->Instance)) & LL_ADC_PATH_INTERNAL_TEMPSENSOR)
|
|---|
| 2733 | != 0UL)
|
|---|
| 2734 | {
|
|---|
| 2735 | /* Delay for temperature sensor buffer stabilization time */
|
|---|
| 2736 | /* Wait loop initialization and execution */
|
|---|
| 2737 | /* Note: Variable divided by 2 to compensate partially */
|
|---|
| 2738 | /* CPU processing cycles, scaling in us split to not */
|
|---|
| 2739 | /* exceed 32 bits register capacity and handle low frequency. */
|
|---|
| 2740 | wait_loop_index = ((LL_ADC_DELAY_TEMPSENSOR_BUFFER_STAB_US / 10UL)
|
|---|
| 2741 | * ((SystemCoreClock / (100000UL * 2UL)) + 1UL));
|
|---|
| 2742 | while (wait_loop_index != 0UL)
|
|---|
| 2743 | {
|
|---|
| 2744 | wait_loop_index--;
|
|---|
| 2745 | }
|
|---|
| 2746 | }
|
|---|
| 2747 |
|
|---|
| 2748 | /* If low power mode AutoPowerOff is enabled, power-on/off phases are */
|
|---|
| 2749 | /* performed automatically by hardware and flag ADC ready is not set. */
|
|---|
| 2750 | if (hadc->Init.LowPowerAutoPowerOff != ENABLE)
|
|---|
| 2751 | {
|
|---|
| 2752 | /* Wait for ADC effectively enabled */
|
|---|
| 2753 | tickstart = HAL_GetTick();
|
|---|
| 2754 |
|
|---|
| 2755 | while (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_RDY) == 0UL)
|
|---|
| 2756 | {
|
|---|
| 2757 | /* If ADEN bit is set less than 4 ADC clock cycles after the ADCAL bit
|
|---|
| 2758 | has been cleared (after a calibration), ADEN bit is reset by the
|
|---|
| 2759 | calibration logic.
|
|---|
| 2760 | The workaround is to continue setting ADEN until ADRDY is becomes 1.
|
|---|
| 2761 | Additionally, ADC_ENABLE_TIMEOUT is defined to encompass this
|
|---|
| 2762 | 4 ADC clock cycle duration */
|
|---|
| 2763 | /* Note: Test of ADC enabled required due to hardware constraint to */
|
|---|
| 2764 | /* not enable ADC if already enabled. */
|
|---|
| 2765 | if (LL_ADC_IsEnabled(hadc->Instance) == 0UL)
|
|---|
| 2766 | {
|
|---|
| 2767 | LL_ADC_Enable(hadc->Instance);
|
|---|
| 2768 | }
|
|---|
| 2769 |
|
|---|
| 2770 | if ((HAL_GetTick() - tickstart) > ADC_ENABLE_TIMEOUT)
|
|---|
| 2771 | {
|
|---|
| 2772 | /* New check to avoid false timeout detection in case of preemption */
|
|---|
| 2773 | if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_RDY) == 0UL)
|
|---|
| 2774 | {
|
|---|
| 2775 | /* Update ADC state machine to error */
|
|---|
| 2776 | SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
|
|---|
| 2777 |
|
|---|
| 2778 | /* Set ADC error code to ADC peripheral internal error */
|
|---|
| 2779 | SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
|
|---|
| 2780 |
|
|---|
| 2781 | return HAL_ERROR;
|
|---|
| 2782 | }
|
|---|
| 2783 | }
|
|---|
| 2784 | }
|
|---|
| 2785 | }
|
|---|
| 2786 | }
|
|---|
| 2787 |
|
|---|
| 2788 | /* Return HAL status */
|
|---|
| 2789 | return HAL_OK;
|
|---|
| 2790 | }
|
|---|
| 2791 |
|
|---|
| 2792 | /**
|
|---|
| 2793 | * @brief Disable the selected ADC.
|
|---|
| 2794 | * @note Prerequisite condition to use this function: ADC conversions must be
|
|---|
| 2795 | * stopped.
|
|---|
| 2796 | * @param hadc ADC handle
|
|---|
| 2797 | * @retval HAL status.
|
|---|
| 2798 | */
|
|---|
| 2799 | HAL_StatusTypeDef ADC_Disable(ADC_HandleTypeDef *hadc)
|
|---|
| 2800 | {
|
|---|
| 2801 | uint32_t tickstart;
|
|---|
| 2802 | const uint32_t tmp_adc_is_disable_on_going = LL_ADC_IsDisableOngoing(hadc->Instance);
|
|---|
| 2803 |
|
|---|
| 2804 | /* Verification if ADC is not already disabled: */
|
|---|
| 2805 | /* Note: forbidden to disable ADC (set bit ADC_CR_ADDIS) if ADC is already */
|
|---|
| 2806 | /* disabled. */
|
|---|
| 2807 | if ((LL_ADC_IsEnabled(hadc->Instance) != 0UL)
|
|---|
| 2808 | && (tmp_adc_is_disable_on_going == 0UL)
|
|---|
| 2809 | )
|
|---|
| 2810 | {
|
|---|
| 2811 | /* Check if conditions to disable the ADC are fulfilled */
|
|---|
| 2812 | if ((hadc->Instance->CR & (ADC_CR_ADSTART | ADC_CR_ADEN)) == ADC_CR_ADEN)
|
|---|
| 2813 | {
|
|---|
| 2814 | /* Disable the ADC peripheral */
|
|---|
| 2815 | LL_ADC_Disable(hadc->Instance);
|
|---|
| 2816 | __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOSMP | ADC_FLAG_RDY));
|
|---|
| 2817 | }
|
|---|
| 2818 | else
|
|---|
| 2819 | {
|
|---|
| 2820 | /* Update ADC state machine to error */
|
|---|
| 2821 | SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
|
|---|
| 2822 |
|
|---|
| 2823 | /* Set ADC error code to ADC peripheral internal error */
|
|---|
| 2824 | SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
|
|---|
| 2825 |
|
|---|
| 2826 | return HAL_ERROR;
|
|---|
| 2827 | }
|
|---|
| 2828 |
|
|---|
| 2829 | /* Wait for ADC effectively disabled */
|
|---|
| 2830 | /* Get tick count */
|
|---|
| 2831 | tickstart = HAL_GetTick();
|
|---|
| 2832 |
|
|---|
| 2833 | while ((hadc->Instance->CR & ADC_CR_ADEN) != 0UL)
|
|---|
| 2834 | {
|
|---|
| 2835 | if ((HAL_GetTick() - tickstart) > ADC_DISABLE_TIMEOUT)
|
|---|
| 2836 | {
|
|---|
| 2837 | /* New check to avoid false timeout detection in case of preemption */
|
|---|
| 2838 | if ((hadc->Instance->CR & ADC_CR_ADEN) != 0UL)
|
|---|
| 2839 | {
|
|---|
| 2840 | /* Update ADC state machine to error */
|
|---|
| 2841 | SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL);
|
|---|
| 2842 |
|
|---|
| 2843 | /* Set ADC error code to ADC peripheral internal error */
|
|---|
| 2844 | SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
|
|---|
| 2845 |
|
|---|
| 2846 | return HAL_ERROR;
|
|---|
| 2847 | }
|
|---|
| 2848 | }
|
|---|
| 2849 | }
|
|---|
| 2850 | }
|
|---|
| 2851 |
|
|---|
| 2852 | /* Return HAL status */
|
|---|
| 2853 | return HAL_OK;
|
|---|
| 2854 | }
|
|---|
| 2855 |
|
|---|
| 2856 | /**
|
|---|
| 2857 | * @brief DMA transfer complete callback.
|
|---|
| 2858 | * @param hdma pointer to DMA handle.
|
|---|
| 2859 | * @retval None
|
|---|
| 2860 | */
|
|---|
| 2861 | static void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma)
|
|---|
| 2862 | {
|
|---|
| 2863 | /* Retrieve ADC handle corresponding to current DMA handle */
|
|---|
| 2864 | ADC_HandleTypeDef *hadc = (ADC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
|
|---|
| 2865 |
|
|---|
| 2866 | /* Update state machine on conversion status if not in error state */
|
|---|
| 2867 | if ((hadc->State & (HAL_ADC_STATE_ERROR_INTERNAL | HAL_ADC_STATE_ERROR_DMA)) == 0UL)
|
|---|
| 2868 | {
|
|---|
| 2869 | /* Set ADC state */
|
|---|
| 2870 | SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
|
|---|
| 2871 |
|
|---|
| 2872 | /* Determine whether any further conversion upcoming on group regular */
|
|---|
| 2873 | /* by external trigger, continuous mode or scan sequence on going */
|
|---|
| 2874 | /* to disable interruption. */
|
|---|
| 2875 | if ((LL_ADC_REG_IsTriggerSourceSWStart(hadc->Instance) != 0UL)
|
|---|
| 2876 | && (hadc->Init.ContinuousConvMode == DISABLE)
|
|---|
| 2877 | )
|
|---|
| 2878 | {
|
|---|
| 2879 | /* If End of Sequence is reached, disable interrupts */
|
|---|
| 2880 | if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOS))
|
|---|
| 2881 | {
|
|---|
| 2882 | /* Allowed to modify bits ADC_IT_EOC/ADC_IT_EOS only if bit */
|
|---|
| 2883 | /* ADSTART==0 (no conversion on going) */
|
|---|
| 2884 | if (LL_ADC_REG_IsConversionOngoing(hadc->Instance) == 0UL)
|
|---|
| 2885 | {
|
|---|
| 2886 | /* Disable ADC end of single conversion interrupt on group regular */
|
|---|
| 2887 | /* Note: Overrun interrupt was enabled with EOC interrupt in */
|
|---|
| 2888 | /* HAL_Start_IT(), but is not disabled here because can be used */
|
|---|
| 2889 | /* by overrun IRQ process below. */
|
|---|
| 2890 | __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC | ADC_IT_EOS);
|
|---|
| 2891 |
|
|---|
| 2892 | /* Set ADC state */
|
|---|
| 2893 | ADC_STATE_CLR_SET(hadc->State,
|
|---|
| 2894 | HAL_ADC_STATE_REG_BUSY,
|
|---|
| 2895 | HAL_ADC_STATE_READY);
|
|---|
| 2896 | }
|
|---|
| 2897 | else
|
|---|
| 2898 | {
|
|---|
| 2899 | /* Change ADC state to error state */
|
|---|
| 2900 | SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
|
|---|
| 2901 |
|
|---|
| 2902 | /* Set ADC error code to ADC peripheral internal error */
|
|---|
| 2903 | SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL);
|
|---|
| 2904 | }
|
|---|
| 2905 | }
|
|---|
| 2906 | }
|
|---|
| 2907 |
|
|---|
| 2908 | /* Conversion complete callback */
|
|---|
| 2909 | #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
|
|---|
| 2910 | hadc->ConvCpltCallback(hadc);
|
|---|
| 2911 | #else
|
|---|
| 2912 | HAL_ADC_ConvCpltCallback(hadc);
|
|---|
| 2913 | #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
|
|---|
| 2914 | }
|
|---|
| 2915 | else /* DMA and-or internal error occurred */
|
|---|
| 2916 | {
|
|---|
| 2917 | if ((hadc->State & HAL_ADC_STATE_ERROR_INTERNAL) != 0UL)
|
|---|
| 2918 | {
|
|---|
| 2919 | /* Call HAL ADC Error Callback function */
|
|---|
| 2920 | #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
|
|---|
| 2921 | hadc->ErrorCallback(hadc);
|
|---|
| 2922 | #else
|
|---|
| 2923 | HAL_ADC_ErrorCallback(hadc);
|
|---|
| 2924 | #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
|
|---|
| 2925 | }
|
|---|
| 2926 | else
|
|---|
| 2927 | {
|
|---|
| 2928 | /* Call ADC DMA error callback */
|
|---|
| 2929 | hadc->DMA_Handle->XferErrorCallback(hdma);
|
|---|
| 2930 | }
|
|---|
| 2931 | }
|
|---|
| 2932 | }
|
|---|
| 2933 |
|
|---|
| 2934 | /**
|
|---|
| 2935 | * @brief DMA half transfer complete callback.
|
|---|
| 2936 | * @param hdma pointer to DMA handle.
|
|---|
| 2937 | * @retval None
|
|---|
| 2938 | */
|
|---|
| 2939 | static void ADC_DMAHalfConvCplt(DMA_HandleTypeDef *hdma)
|
|---|
| 2940 | {
|
|---|
| 2941 | /* Retrieve ADC handle corresponding to current DMA handle */
|
|---|
| 2942 | ADC_HandleTypeDef *hadc = (ADC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
|
|---|
| 2943 |
|
|---|
| 2944 | /* Half conversion callback */
|
|---|
| 2945 | #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
|
|---|
| 2946 | hadc->ConvHalfCpltCallback(hadc);
|
|---|
| 2947 | #else
|
|---|
| 2948 | HAL_ADC_ConvHalfCpltCallback(hadc);
|
|---|
| 2949 | #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
|
|---|
| 2950 | }
|
|---|
| 2951 |
|
|---|
| 2952 | /**
|
|---|
| 2953 | * @brief DMA error callback.
|
|---|
| 2954 | * @param hdma pointer to DMA handle.
|
|---|
| 2955 | * @retval None
|
|---|
| 2956 | */
|
|---|
| 2957 | static void ADC_DMAError(DMA_HandleTypeDef *hdma)
|
|---|
| 2958 | {
|
|---|
| 2959 | /* Retrieve ADC handle corresponding to current DMA handle */
|
|---|
| 2960 | ADC_HandleTypeDef *hadc = (ADC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
|
|---|
| 2961 |
|
|---|
| 2962 | /* Set ADC state */
|
|---|
| 2963 | SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_DMA);
|
|---|
| 2964 |
|
|---|
| 2965 | /* Set ADC error code to DMA error */
|
|---|
| 2966 | SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_DMA);
|
|---|
| 2967 |
|
|---|
| 2968 | /* Error callback */
|
|---|
| 2969 | #if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
|
|---|
| 2970 | hadc->ErrorCallback(hadc);
|
|---|
| 2971 | #else
|
|---|
| 2972 | HAL_ADC_ErrorCallback(hadc);
|
|---|
| 2973 | #endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
|
|---|
| 2974 | }
|
|---|
| 2975 |
|
|---|
| 2976 | /**
|
|---|
| 2977 | * @}
|
|---|
| 2978 | */
|
|---|
| 2979 |
|
|---|
| 2980 | #endif /* HAL_ADC_MODULE_ENABLED */
|
|---|
| 2981 | /**
|
|---|
| 2982 | * @}
|
|---|
| 2983 | */
|
|---|
| 2984 |
|
|---|
| 2985 | /**
|
|---|
| 2986 | * @}
|
|---|
| 2987 | */
|
|---|