Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
stm32l4xx_hal_adc.c
00001 /** 00002 ****************************************************************************** 00003 * @file stm32l4xx_hal_adc.c 00004 * @author MCD Application conversion 00005 * @version V1.5.1 00006 * @date 31-May-2016 00007 * @brief This file provides firmware functions to manage the following 00008 * functionalities of the Analog to Digital Convertor (ADC) 00009 * peripheral: 00010 * + Initialization and de-initialization functions 00011 * ++ Configuration of ADC 00012 * + Operation functions 00013 * ++ Start, stop, get result of regular conversions of regular 00014 * using 3 possible modes: polling, interruption or DMA. 00015 * + Control functions 00016 * ++ Analog Watchdog configuration 00017 * ++ Channels configuration on regular group 00018 * + State functions 00019 * ++ ADC state machine management 00020 * ++ Interrupts and flags management 00021 * 00022 @verbatim 00023 ============================================================================== 00024 ##### ADC specific features ##### 00025 ============================================================================== 00026 [..] 00027 (#) 12-bit, 10-bit, 8-bit or 6-bit configurable resolution. 00028 00029 (#) Interrupt generation at the end of regular conversion and in case of 00030 analog watchdog and overrun events. 00031 00032 (#) Single and continuous conversion modes. 00033 00034 (#) Scan mode for automatic conversion of channel 0 to channel 'n'. 00035 00036 (#) Data alignment with in-built data coherency. 00037 00038 (#) Channel-wise programmable sampling time. 00039 00040 (#) External trigger (timer or EXTI) with configurable polarity for 00041 regular groups. 00042 00043 (#) DMA request generation for transfer of regular group converted data. 00044 00045 (#) Configurable delay between conversions in Dual interleaved mode. 00046 00047 (#) ADC channels selectable single/differential input. 00048 00049 (#) ADC offset on regular groups. 00050 00051 (#) ADC supply requirements: 1.62 V to 3.6 V. 00052 00053 (#) ADC input range: from Vref_ (connected to Vssa) to Vref+ (connected to 00054 Vdda or to an external voltage reference). 00055 00056 00057 00058 ##### How to use this driver ##### 00059 ============================================================================== 00060 [..] 00061 00062 (#) Enable the ADC interface 00063 As prerequisite, in HAL_ADC_MspInit(), ADC clock source must be 00064 configured at RCC top level. 00065 00066 Two different clock sources are available: 00067 (++) - the ADC clock can be a specific clock source, coming from the system 00068 clock, the PLLSAI1 or the PLLSAI2 running up to 80MHz. 00069 (++) - or the ADC clock can be derived from the AHB clock of the ADC bus 00070 interface, divided by a programmable factor 00071 00072 00073 (++) For example, in case of PLLSAI2: 00074 (+++) __HAL_RCC_ADC_CLK_ENABLE(); 00075 (+++) HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit); 00076 (+++) where 00077 (+++) PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC 00078 (+++) PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_PLLSAI2 00079 00080 00081 (#) ADC pins configuration 00082 (++) Enable the clock for the ADC GPIOs using the following function: 00083 __HAL_RCC_GPIOx_CLK_ENABLE(); 00084 (++) Configure these ADC pins in analog mode using HAL_GPIO_Init(); 00085 00086 (#) Configure the ADC parameters (conversion resolution, data alignment, 00087 continuous mode, ...) using the HAL_ADC_Init() function. 00088 00089 (#) Optionally, perform an automatic ADC calibration to improve the 00090 conversion accuracy using function HAL_ADCEx_Calibration_Start(). 00091 00092 (#) Activate the ADC peripheral using one of the start functions: 00093 HAL_ADC_Start(), HAL_ADC_Start_IT(), HAL_ADC_Start_DMA(), 00094 HAL_ADCEx_InjectedStart(), HAL_ADCEx_InjectedStart_IT() or 00095 HAL_ADCEx_MultiModeStart_DMA() when multimode feature is available. 00096 00097 *** Channels to regular group configuration *** 00098 ============================================ 00099 [..] 00100 (+) To configure the ADC regular group features, use 00101 HAL_ADC_Init() and HAL_ADC_ConfigChannel() functions. 00102 (+) To activate the continuous mode, use the HAL_ADC_Init() function. 00103 (+) To read the ADC converted values, use the HAL_ADC_GetValue() function. 00104 00105 *** DMA for regular configuration *** 00106 ============================================================= 00107 [..] 00108 (+) To enable the DMA mode for regular group, use the 00109 HAL_ADC_Start_DMA() function. 00110 (+) To enable the generation of DMA requests continuously at the end of 00111 the last DMA transfer, resort to DMAContinuousRequests parameter of 00112 ADC handle initialization structure. 00113 00114 00115 00116 @endverbatim 00117 ****************************************************************************** 00118 * @attention 00119 * 00120 * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> 00121 * 00122 * Redistribution and use in source and binary forms, with or without modification, 00123 * are permitted provided that the following conditions are met: 00124 * 1. Redistributions of source code must retain the above copyright notice, 00125 * this list of conditions and the following disclaimer. 00126 * 2. Redistributions in binary form must reproduce the above copyright notice, 00127 * this list of conditions and the following disclaimer in the documentation 00128 * and/or other materials provided with the distribution. 00129 * 3. Neither the name of STMicroelectronics nor the names of its contributors 00130 * may be used to endorse or promote products derived from this software 00131 * without specific prior written permission. 00132 * 00133 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00134 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00135 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00136 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 00137 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00138 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 00139 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00140 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 00141 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 00142 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00143 * 00144 ****************************************************************************** 00145 */ 00146 00147 /* Includes ------------------------------------------------------------------*/ 00148 #include "stm32l4xx_hal.h" 00149 00150 /** @addtogroup STM32L4xx_HAL_Driver 00151 * @{ 00152 */ 00153 00154 /** @defgroup ADC ADC 00155 * @brief ADC HAL module driver 00156 * @{ 00157 */ 00158 00159 #ifdef HAL_ADC_MODULE_ENABLED 00160 00161 /* Private typedef -----------------------------------------------------------*/ 00162 /* Private define ------------------------------------------------------------*/ 00163 00164 /** @defgroup ADC_Private_Constants ADC Private Constants 00165 * @{ 00166 */ 00167 00168 #define ADC_CFGR_FIELDS_1 ((uint32_t)(ADC_CFGR_RES | ADC_CFGR_ALIGN |\ 00169 ADC_CFGR_CONT | ADC_CFGR_OVRMOD |\ 00170 ADC_CFGR_DISCEN | ADC_CFGR_DISCNUM |\ 00171 ADC_CFGR_EXTEN | ADC_CFGR_EXTSEL)) /*!< ADC_CFGR fields of parameters that can be updated 00172 when no regular conversion is on-going */ 00173 00174 #define ADC_CFGR2_FIELDS ((uint32_t)(ADC_CFGR2_ROVSE | ADC_CFGR2_OVSR |\ 00175 ADC_CFGR2_OVSS | ADC_CFGR2_TROVS |\ 00176 ADC_CFGR2_ROVSM)) /*!< ADC_CFGR2 fields of parameters that can be updated when no conversion 00177 (neither regular nor injected) is on-going */ 00178 00179 #define ADC_CFGR_WD_FIELDS ((uint32_t)(ADC_CFGR_AWD1SGL | ADC_CFGR_JAWD1EN | \ 00180 ADC_CFGR_AWD1EN | ADC_CFGR_AWD1CH)) /*!< ADC_CFGR fields of Analog Watchdog parameters that can be updated when no 00181 conversion (neither regular nor injected) is on-going */ 00182 00183 #define ADC_OFR_FIELDS ((uint32_t)(ADC_OFR1_OFFSET1 | ADC_OFR1_OFFSET1_CH | ADC_OFR1_OFFSET1_EN)) /*!< ADC_OFR fields of parameters that can be updated when no conversion 00184 (neither regular nor injected) is on-going */ 00185 00186 00187 00188 /* Delay to wait before setting ADEN once ADCAL has been reset 00189 must be at least 4 ADC clock cycles. 00190 Assuming lowest ADC clock (140 KHz according to DS), this 00191 4 ADC clock cycles duration is equal to 00192 4 / 140,000 = 0.028 ms. 00193 ADC_ENABLE_TIMEOUT set to 2 is a margin large enough to ensure 00194 the 4 ADC clock cycles have elapsed while waiting for ADRDY 00195 to become 1 */ 00196 #define ADC_ENABLE_TIMEOUT ((uint32_t) 2) /*!< ADC enable time-out value */ 00197 #define ADC_DISABLE_TIMEOUT ((uint32_t) 2) /*!< ADC disable time-out value */ 00198 00199 00200 00201 /* Delay for ADC voltage regulator startup time */ 00202 /* Maximum delay is 10 microseconds */ 00203 /* (refer device RM, parameter Tadcvreg_stup). */ 00204 #define ADC_STAB_DELAY_US ((uint32_t) 10) /*!< ADC voltage regulator startup time */ 00205 00206 00207 /* Timeout to wait for current conversion on going to be completed. */ 00208 /* Timeout fixed to worst case, for 1 channel. */ 00209 /* - maximum sampling time (640.5 adc_clk) */ 00210 /* - ADC resolution (Tsar 12 bits= 12.5 adc_clk) */ 00211 /* - ADC clock with prescaler 256 */ 00212 /* 653 * 256 = 167168 clock cycles max */ 00213 /* Unit: cycles of CPU clock. */ 00214 #define ADC_CONVERSION_TIME_MAX_CPU_CYCLES ((uint32_t) 167168) /*!< ADC conversion completion time-out value */ 00215 00216 00217 00218 00219 /** 00220 * @} 00221 */ 00222 00223 /* Private macro -------------------------------------------------------------*/ 00224 /* Private variables ---------------------------------------------------------*/ 00225 /* Private function prototypes -----------------------------------------------*/ 00226 /* Exported functions --------------------------------------------------------*/ 00227 00228 /** @defgroup ADC_Exported_Functions ADC Exported Functions 00229 * @{ 00230 */ 00231 00232 /** @defgroup ADC_Exported_Functions_Group1 Initialization and de-initialization functions 00233 * @brief Initialization and Configuration functions 00234 * 00235 @verbatim 00236 =============================================================================== 00237 ##### Initialization and de-initialization functions ##### 00238 =============================================================================== 00239 [..] This section provides functions allowing to: 00240 (+) Initialize and configure the ADC. 00241 (+) De-initialize the ADC. 00242 00243 @endverbatim 00244 * @{ 00245 */ 00246 00247 /** 00248 * @brief Initialize the ADC peripheral and regular group according to 00249 * parameters specified in structure "ADC_InitTypeDef". 00250 * @note As prerequisite, ADC clock must be configured at RCC top level 00251 * depending on possible clock sources: System/PLLSAI1/PLLSAI2 clocks 00252 * or AHB clock. 00253 * @note Possibility to update parameters on the fly: 00254 * this function initializes the ADC MSP (HAL_ADC_MspInit()) only when 00255 * coming from ADC state reset. Following calls to this function can 00256 * be used to reconfigure some parameters of ADC_InitTypeDef 00257 * structure on the fly, without modifying MSP configuration. If ADC 00258 * MSP has to be modified again, HAL_ADC_DeInit() must be called 00259 * before HAL_ADC_Init(). 00260 * The setting of these parameters is conditioned by ADC state. 00261 * For parameters constraints, see comments of structure 00262 * "ADC_InitTypeDef". 00263 * @note This function configures the ADC within 2 scopes: scope of entire 00264 * ADC and scope of regular group. For parameters details, see comments 00265 * of structure "ADC_InitTypeDef". 00266 * @note Parameters related to common ADC registers (ADC clock mode) are set 00267 * only if all ADCs are disabled. 00268 * If this is not the case, these common parameters setting are 00269 * bypassed without error reporting: it can be the intended behaviour in 00270 * case of update of a parameter of ADC_InitTypeDef on the fly, 00271 * without disabling the other ADCs. 00272 * @param hadc: ADC handle 00273 * @retval HAL status 00274 */ 00275 HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef* hadc) 00276 { 00277 HAL_StatusTypeDef tmp_status = HAL_OK; 00278 00279 ADC_Common_TypeDef *tmpADC_Common; 00280 uint32_t tmpCFGR = 0; 00281 __IO uint32_t wait_loop_index = 0; 00282 00283 /* Check ADC handle */ 00284 if(hadc == NULL) 00285 { 00286 return HAL_ERROR; 00287 } 00288 00289 /* Check the parameters */ 00290 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); 00291 assert_param(IS_ADC_CLOCKPRESCALER(hadc->Init.ClockPrescaler)); 00292 assert_param(IS_ADC_RESOLUTION(hadc->Init.Resolution)); 00293 assert_param(IS_ADC_DFSDMCFG_MODE(hadc)); 00294 assert_param(IS_ADC_DATA_ALIGN(hadc->Init.DataAlign)); 00295 assert_param(IS_ADC_SCAN_MODE(hadc->Init.ScanConvMode)); 00296 assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode)); 00297 assert_param(IS_ADC_EXTTRIG_EDGE(hadc->Init.ExternalTrigConvEdge)); 00298 assert_param(IS_ADC_EXTTRIG(hadc->Init.ExternalTrigConv)); 00299 assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DMAContinuousRequests)); 00300 assert_param(IS_ADC_EOC_SELECTION(hadc->Init.EOCSelection)); 00301 assert_param(IS_ADC_OVERRUN(hadc->Init.Overrun)); 00302 assert_param(IS_FUNCTIONAL_STATE(hadc->Init.LowPowerAutoWait)); 00303 assert_param(IS_FUNCTIONAL_STATE(hadc->Init.OversamplingMode)); 00304 00305 if(hadc->Init.ScanConvMode != ADC_SCAN_DISABLE) 00306 { 00307 assert_param(IS_ADC_REGULAR_NB_CONV(hadc->Init.NbrOfConversion)); 00308 assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DiscontinuousConvMode)); 00309 00310 if (hadc->Init.DiscontinuousConvMode == ENABLE) 00311 { 00312 assert_param(IS_ADC_REGULAR_DISCONT_NUMBER(hadc->Init.NbrOfDiscConversion)); 00313 } 00314 } 00315 00316 00317 /* DISCEN and CONT bits can't be set at the same time */ 00318 assert_param(!((hadc->Init.DiscontinuousConvMode == ENABLE) && (hadc->Init.ContinuousConvMode == ENABLE))); 00319 00320 00321 /* Actions performed only if ADC is coming from state reset: */ 00322 /* - Initialization of ADC MSP */ 00323 if (hadc->State == HAL_ADC_STATE_RESET) 00324 { 00325 /* Init the low level hardware */ 00326 HAL_ADC_MspInit(hadc); 00327 00328 /* Set ADC error code to none */ 00329 ADC_CLEAR_ERRORCODE(hadc); 00330 00331 /* Initialize Lock */ 00332 hadc->Lock = HAL_UNLOCKED; 00333 } 00334 00335 00336 /* - Exit from deep-power-down mode and ADC voltage regulator enable */ 00337 /* Exit deep power down mode if still in that state */ 00338 if (HAL_IS_BIT_SET(hadc->Instance->CR, ADC_CR_DEEPPWD)) 00339 { 00340 /* Exit deep power down mode */ 00341 CLEAR_BIT(hadc->Instance->CR, ADC_CR_DEEPPWD); 00342 00343 /* System was in deep power down mode, calibration must 00344 be relaunched or a previously saved calibration factor 00345 re-applied once the ADC voltage regulator is enabled */ 00346 } 00347 00348 00349 if (HAL_IS_BIT_CLR(hadc->Instance->CR, ADC_CR_ADVREGEN)) 00350 { 00351 /* Enable ADC internal voltage regulator */ 00352 SET_BIT(hadc->Instance->CR, ADC_CR_ADVREGEN); 00353 00354 /* Delay for ADC stabilization time */ 00355 /* Wait loop initialization and execution */ 00356 /* Note: Variable divided by 2 to compensate partially */ 00357 /* CPU processing cycles. */ 00358 wait_loop_index = (ADC_STAB_DELAY_US * (SystemCoreClock / (1000000 * 2))); 00359 while(wait_loop_index != 0) 00360 { 00361 wait_loop_index--; 00362 } 00363 } 00364 00365 00366 00367 00368 /* Verification that ADC voltage regulator is correctly enabled, whether */ 00369 /* or not ADC is coming from state reset (if any potential problem of */ 00370 /* clocking, voltage regulator would not be enabled). */ 00371 if (HAL_IS_BIT_CLR(hadc->Instance->CR, ADC_CR_ADVREGEN)) 00372 { 00373 /* Update ADC state machine to error */ 00374 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL); 00375 00376 /* Set ADC error code to ADC IP internal error */ 00377 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL); 00378 00379 tmp_status = HAL_ERROR; 00380 } 00381 00382 00383 /* Configuration of ADC parameters if previous preliminary actions are */ 00384 /* correctly completed and if there is no conversion on going on regular */ 00385 /* group (ADC may already be enabled at this point if HAL_ADC_Init() is */ 00386 /* called to update a parameter on the fly). */ 00387 if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL) && 00388 (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) == RESET) ) 00389 { 00390 00391 /* Initialize the ADC state */ 00392 SET_BIT(hadc->State, HAL_ADC_STATE_BUSY_INTERNAL); 00393 00394 /* Configuration of common ADC parameters */ 00395 00396 /* Pointer to the common control register */ 00397 tmpADC_Common = ADC_COMMON_REGISTER(hadc); 00398 00399 00400 /* Parameters update conditioned to ADC state: */ 00401 /* Parameters that can be updated only when ADC is disabled: */ 00402 /* - clock configuration */ 00403 if ((ADC_IS_ENABLE(hadc) == RESET) && 00404 (ADC_ANY_OTHER_ENABLED(hadc) == RESET) ) 00405 { 00406 /* Reset configuration of ADC common register CCR: */ 00407 /* */ 00408 /* - ADC clock mode and ACC prescaler (CKMODE and PRESC bits)are set */ 00409 /* according to adc->Init.ClockPrescaler. It selects the clock */ 00410 /* source and sets the clock division factor. */ 00411 /* */ 00412 /* Some parameters of this register are not reset, since they are set */ 00413 /* by other functions and must be kept in case of usage of this */ 00414 /* function on the fly (update of a parameter of ADC_InitTypeDef */ 00415 /* without needing to reconfigure all other ADC groups/channels */ 00416 /* parameters): */ 00417 /* - when multimode feature is available, multimode-related */ 00418 /* parameters: MDMA, DMACFG, DELAY, DUAL (set by API */ 00419 /* HAL_ADCEx_MultiModeConfigChannel() ) */ 00420 /* - internal measurement paths: Vbat, temperature sensor, Vref */ 00421 /* (set into HAL_ADC_ConfigChannel() or */ 00422 /* HAL_ADCEx_InjectedConfigChannel() ) */ 00423 00424 MODIFY_REG(tmpADC_Common->CCR, ADC_CCR_PRESC|ADC_CCR_CKMODE, hadc->Init.ClockPrescaler); 00425 } 00426 00427 00428 /* Configuration of ADC: */ 00429 /* - resolution Init.Resolution */ 00430 /* - data alignment Init.DataAlign */ 00431 /* - external trigger to start conversion Init.ExternalTrigConv */ 00432 /* - external trigger polarity Init.ExternalTrigConvEdge */ 00433 /* - continuous conversion mode Init.ContinuousConvMode */ 00434 /* - overrun Init.Overrun */ 00435 /* - discontinuous mode Init.DiscontinuousConvMode */ 00436 /* - discontinuous mode channel count Init.NbrOfDiscConversion */ 00437 tmpCFGR = ( ADC_CFGR_CONTINUOUS(hadc->Init.ContinuousConvMode) | 00438 hadc->Init.Overrun | 00439 hadc->Init.DataAlign | 00440 hadc->Init.Resolution | 00441 ADC_CFGR_REG_DISCONTINUOUS(hadc->Init.DiscontinuousConvMode) | 00442 ADC_CFGR_DISCONTINUOUS_NUM(hadc->Init.NbrOfDiscConversion) ); 00443 00444 /* Enable external trigger if trigger selection is different of software */ 00445 /* start. */ 00446 /* - external trigger to start conversion Init.ExternalTrigConv */ 00447 /* - external trigger polarity Init.ExternalTrigConvEdge */ 00448 /* Note: parameter ExternalTrigConvEdge set to "trigger edge none" is */ 00449 /* equivalent to software start. */ 00450 if ((hadc->Init.ExternalTrigConv != ADC_SOFTWARE_START) 00451 && (hadc->Init.ExternalTrigConvEdge != ADC_EXTERNALTRIGCONVEDGE_NONE)) 00452 { 00453 tmpCFGR |= ( hadc->Init.ExternalTrigConv | hadc->Init.ExternalTrigConvEdge); 00454 } 00455 00456 /* Update Configuration Register CFGR */ 00457 MODIFY_REG(hadc->Instance->CFGR, ADC_CFGR_FIELDS_1, tmpCFGR); 00458 00459 00460 /* Parameters update conditioned to ADC state: */ 00461 /* Parameters that can be updated when ADC is disabled or enabled without */ 00462 /* conversion on going on regular and injected groups: */ 00463 /* - DMA continuous request Init.DMAContinuousRequests */ 00464 /* - LowPowerAutoWait feature Init.LowPowerAutoWait */ 00465 /* - Oversampling parameters Init.Oversampling */ 00466 if (ADC_IS_CONVERSION_ONGOING_REGULAR_INJECTED(hadc) == RESET) 00467 { 00468 tmpCFGR = ( ADC_CFGR_DFSDM(hadc) | 00469 ADC_CFGR_AUTOWAIT(hadc->Init.LowPowerAutoWait) | 00470 ADC_CFGR_DMACONTREQ(hadc->Init.DMAContinuousRequests) ); 00471 00472 MODIFY_REG(hadc->Instance->CFGR, ADC_CFGR_FIELDS_2, tmpCFGR); 00473 00474 00475 if (hadc->Init.OversamplingMode == ENABLE) 00476 { 00477 assert_param(IS_ADC_OVERSAMPLING_RATIO(hadc->Init.Oversampling.Ratio)); 00478 assert_param(IS_ADC_RIGHT_BIT_SHIFT(hadc->Init.Oversampling.RightBitShift)); 00479 assert_param(IS_ADC_TRIGGERED_OVERSAMPLING_MODE(hadc->Init.Oversampling.TriggeredMode)); 00480 assert_param(IS_ADC_REGOVERSAMPLING_MODE(hadc->Init.Oversampling.OversamplingStopReset)); 00481 00482 if ((hadc->Init.ExternalTrigConv == ADC_SOFTWARE_START) 00483 || (hadc->Init.ExternalTrigConvEdge == ADC_EXTERNALTRIGCONVEDGE_NONE)) 00484 { 00485 /* Multi trigger is not applicable to software-triggered conversions */ 00486 assert_param((hadc->Init.Oversampling.TriggeredMode == ADC_TRIGGEREDMODE_SINGLE_TRIGGER)); 00487 } 00488 00489 00490 /* Configuration of Oversampler: */ 00491 /* - Oversampling Ratio */ 00492 /* - Right bit shift */ 00493 /* - Triggered mode */ 00494 /* - Oversampling mode (continued/resumed) */ 00495 MODIFY_REG(hadc->Instance->CFGR2, ADC_CFGR2_FIELDS, 00496 ADC_CFGR2_ROVSE | 00497 hadc->Init.Oversampling.Ratio | 00498 hadc->Init.Oversampling.RightBitShift | 00499 hadc->Init.Oversampling.TriggeredMode | 00500 hadc->Init.Oversampling.OversamplingStopReset); 00501 } 00502 else 00503 { 00504 /* Disable Regular OverSampling */ 00505 CLEAR_BIT( hadc->Instance->CFGR2, ADC_CFGR2_ROVSE); 00506 } 00507 00508 00509 } /* if (ADC_IS_CONVERSION_ONGOING_REGULAR_INJECTED(hadc) == RESET) */ 00510 00511 00512 00513 00514 /* Configuration of regular group sequencer: */ 00515 /* - if scan mode is disabled, regular channels sequence length is set to */ 00516 /* 0x00: 1 channel converted (channel on regular rank 1) */ 00517 /* Parameter "NbrOfConversion" is discarded. */ 00518 /* Note: Scan mode is not present by hardware on this device, but */ 00519 /* emulated by software for alignment over all STM32 devices. */ 00520 /* - if scan mode is enabled, regular channels sequence length is set to */ 00521 /* parameter "NbrOfConversion" */ 00522 00523 if (hadc->Init.ScanConvMode == ADC_SCAN_ENABLE) 00524 { 00525 /* Set number of ranks in regular group sequencer */ 00526 MODIFY_REG(hadc->Instance->SQR1, ADC_SQR1_L, (hadc->Init.NbrOfConversion - (uint8_t)1)); 00527 } 00528 else 00529 { 00530 CLEAR_BIT(hadc->Instance->SQR1, ADC_SQR1_L); 00531 } 00532 00533 00534 /* Initialize the ADC state */ 00535 /* Clear HAL_ADC_STATE_BUSY_INTERNAL bit, set HAL_ADC_STATE_READY bit */ 00536 ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_BUSY_INTERNAL, HAL_ADC_STATE_READY); 00537 } 00538 else 00539 { 00540 /* Update ADC state machine to error */ 00541 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL); 00542 00543 tmp_status = HAL_ERROR; 00544 } /* if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL) && (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) == RESET) ) */ 00545 00546 00547 /* Return function status */ 00548 return tmp_status; 00549 00550 } 00551 00552 /** 00553 * @brief Deinitialize the ADC peripheral registers to their default reset 00554 * values, with deinitialization of the ADC MSP. 00555 * @note Keep in mind that all ADCs use the same clock: disabling 00556 * the clock will reset all ADCs. 00557 * @note By default, HAL_ADC_DeInit() sets DEEPPWD: this saves more power by 00558 * reducing the leakage currents and is particularly interesting before 00559 * entering STOP 1 or STOP 2 modes. 00560 * @param hadc: ADC handle 00561 * @retval HAL status 00562 */ 00563 HAL_StatusTypeDef HAL_ADC_DeInit(ADC_HandleTypeDef* hadc) 00564 { 00565 /* Check ADC handle */ 00566 if(hadc == NULL) 00567 { 00568 return HAL_ERROR; 00569 } 00570 00571 /* Check the parameters */ 00572 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); 00573 00574 /* Change ADC state */ 00575 SET_BIT(hadc->State, HAL_ADC_STATE_BUSY_INTERNAL); 00576 00577 /* Stop potential conversion on going, on regular and injected groups */ 00578 /* No check on ADC_ConversionStop() return status, if the conversion 00579 stop failed, it is up to HAL_ADC_MspDeInit() to reset the ADC IP */ 00580 ADC_ConversionStop(hadc, ADC_REGULAR_INJECTED_GROUP); 00581 00582 00583 /* Disable ADC peripheral if conversions are effectively stopped */ 00584 /* Flush register JSQR: reset the queue sequencer when injected */ 00585 /* queue sequencer is enabled and ADC disabled. */ 00586 /* The software and hardware triggers of the injected sequence are both */ 00587 /* internally disabled just after the completion of the last valid */ 00588 /* injected sequence. */ 00589 SET_BIT(hadc->Instance->CFGR, ADC_CFGR_JQM); 00590 00591 /* Disable the ADC peripheral */ 00592 /* No check on ADC_Disable() return status, if the ADC disabling process 00593 failed, it is up to HAL_ADC_MspDeInit() to reset the ADC IP */ 00594 ADC_Disable(hadc); 00595 00596 00597 /* ========== Reset ADC registers ========== */ 00598 /* Reset register IER */ 00599 __HAL_ADC_DISABLE_IT(hadc, (ADC_IT_AWD3 | ADC_IT_AWD2 | ADC_IT_AWD1 | 00600 ADC_IT_JQOVF | ADC_IT_OVR | 00601 ADC_IT_JEOS | ADC_IT_JEOC | 00602 ADC_IT_EOS | ADC_IT_EOC | 00603 ADC_IT_EOSMP | ADC_IT_RDY ) ); 00604 00605 /* Reset register ISR */ 00606 __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_AWD3 | ADC_FLAG_AWD2 | ADC_FLAG_AWD1 | 00607 ADC_FLAG_JQOVF | ADC_FLAG_OVR | 00608 ADC_FLAG_JEOS | ADC_FLAG_JEOC | 00609 ADC_FLAG_EOS | ADC_FLAG_EOC | 00610 ADC_FLAG_EOSMP | ADC_FLAG_RDY ) ); 00611 00612 /* Reset register CR */ 00613 /* Bits ADC_CR_JADSTP, ADC_CR_ADSTP, ADC_CR_JADSTART, ADC_CR_ADSTART, 00614 ADC_CR_ADCAL, ADC_CR_ADDIS and ADC_CR_ADEN are in access mode "read-set": 00615 no direct reset applicable. 00616 Update CR register to reset value where doable by software */ 00617 CLEAR_BIT(hadc->Instance->CR, ADC_CR_ADVREGEN | ADC_CR_ADCALDIF); 00618 SET_BIT(hadc->Instance->CR, ADC_CR_DEEPPWD); 00619 00620 /* Reset register CFGR */ 00621 CLEAR_BIT(hadc->Instance->CFGR, ADC_CFGR_FIELDS); 00622 SET_BIT(hadc->Instance->CFGR, ADC_CFGR_JQDIS); 00623 00624 /* Reset register CFGR2 */ 00625 CLEAR_BIT(hadc->Instance->CFGR2, ADC_CFGR2_ROVSM | ADC_CFGR2_TROVS | ADC_CFGR2_OVSS | 00626 ADC_CFGR2_OVSR | ADC_CFGR2_JOVSE | ADC_CFGR2_ROVSE ); 00627 00628 /* Reset register SMPR1 */ 00629 CLEAR_BIT(hadc->Instance->SMPR1, ADC_SMPR1_FIELDS); 00630 00631 /* Reset register SMPR2 */ 00632 CLEAR_BIT(hadc->Instance->SMPR2, ADC_SMPR2_SMP18 | ADC_SMPR2_SMP17 | ADC_SMPR2_SMP16 | 00633 ADC_SMPR2_SMP15 | ADC_SMPR2_SMP14 | ADC_SMPR2_SMP13 | 00634 ADC_SMPR2_SMP12 | ADC_SMPR2_SMP11 | ADC_SMPR2_SMP10 ); 00635 00636 /* Reset register TR1 */ 00637 CLEAR_BIT(hadc->Instance->TR1, ADC_TR1_HT1 | ADC_TR1_LT1); 00638 00639 /* Reset register TR2 */ 00640 CLEAR_BIT(hadc->Instance->TR2, ADC_TR2_HT2 | ADC_TR2_LT2); 00641 00642 /* Reset register TR3 */ 00643 CLEAR_BIT(hadc->Instance->TR3, ADC_TR3_HT3 | ADC_TR3_LT3); 00644 00645 /* Reset register SQR1 */ 00646 CLEAR_BIT(hadc->Instance->SQR1, ADC_SQR1_SQ4 | ADC_SQR1_SQ3 | ADC_SQR1_SQ2 | 00647 ADC_SQR1_SQ1 | ADC_SQR1_L); 00648 00649 /* Reset register SQR2 */ 00650 CLEAR_BIT(hadc->Instance->SQR2, ADC_SQR2_SQ9 | ADC_SQR2_SQ8 | ADC_SQR2_SQ7 | 00651 ADC_SQR2_SQ6 | ADC_SQR2_SQ5); 00652 00653 /* Reset register SQR3 */ 00654 CLEAR_BIT(hadc->Instance->SQR3, ADC_SQR3_SQ14 | ADC_SQR3_SQ13 | ADC_SQR3_SQ12 | 00655 ADC_SQR3_SQ11 | ADC_SQR3_SQ10); 00656 00657 /* Reset register SQR4 */ 00658 CLEAR_BIT(hadc->Instance->SQR4, ADC_SQR4_SQ16 | ADC_SQR4_SQ15); 00659 00660 /* Register JSQR was reset when the ADC was disabled */ 00661 00662 /* Reset register DR */ 00663 /* bits in access mode read only, no direct reset applicable*/ 00664 00665 /* Reset register OFR1 */ 00666 CLEAR_BIT(hadc->Instance->OFR1, ADC_OFR1_OFFSET1_EN | ADC_OFR1_OFFSET1_CH | ADC_OFR1_OFFSET1); 00667 /* Reset register OFR2 */ 00668 CLEAR_BIT(hadc->Instance->OFR2, ADC_OFR2_OFFSET2_EN | ADC_OFR2_OFFSET2_CH | ADC_OFR2_OFFSET2); 00669 /* Reset register OFR3 */ 00670 CLEAR_BIT(hadc->Instance->OFR3, ADC_OFR3_OFFSET3_EN | ADC_OFR3_OFFSET3_CH | ADC_OFR3_OFFSET3); 00671 /* Reset register OFR4 */ 00672 CLEAR_BIT(hadc->Instance->OFR4, ADC_OFR4_OFFSET4_EN | ADC_OFR4_OFFSET4_CH | ADC_OFR4_OFFSET4); 00673 00674 /* Reset registers JDR1, JDR2, JDR3, JDR4 */ 00675 /* bits in access mode read only, no direct reset applicable*/ 00676 00677 /* Reset register AWD2CR */ 00678 CLEAR_BIT(hadc->Instance->AWD2CR, ADC_AWD2CR_AWD2CH); 00679 00680 /* Reset register AWD3CR */ 00681 CLEAR_BIT(hadc->Instance->AWD3CR, ADC_AWD3CR_AWD3CH); 00682 00683 /* Reset register DIFSEL */ 00684 CLEAR_BIT(hadc->Instance->DIFSEL, ADC_DIFSEL_DIFSEL); 00685 00686 /* Reset register CALFACT */ 00687 CLEAR_BIT(hadc->Instance->CALFACT, ADC_CALFACT_CALFACT_D | ADC_CALFACT_CALFACT_S); 00688 00689 00690 00691 00692 00693 00694 /* ========== Reset common ADC registers ========== */ 00695 00696 /* Software is allowed to change common parameters only when all the other 00697 ADCs are disabled. */ 00698 if ((ADC_IS_ENABLE(hadc) == RESET) && 00699 (ADC_ANY_OTHER_ENABLED(hadc) == RESET) ) 00700 { 00701 /* Reset configuration of ADC common register CCR: 00702 - clock mode: CKMODE, PRESCEN 00703 - multimode related parameters (when this feature is available): MDMA, 00704 DMACFG, DELAY, DUAL (set by HAL_ADCEx_MultiModeConfigChannel() API) 00705 - internal measurement paths: Vbat, temperature sensor, Vref (set into 00706 HAL_ADC_ConfigChannel() or HAL_ADCEx_InjectedConfigChannel() ) 00707 */ 00708 ADC_CLEAR_COMMON_CONTROL_REGISTER(hadc); 00709 } 00710 00711 /* DeInit the low level hardware. 00712 00713 For example: 00714 __HAL_RCC_ADC_FORCE_RESET(); 00715 __HAL_RCC_ADC_RELEASE_RESET(); 00716 __HAL_RCC_ADC_CLK_DISABLE(); 00717 00718 Keep in mind that all ADCs use the same clock: disabling 00719 the clock will reset all ADCs. 00720 00721 */ 00722 HAL_ADC_MspDeInit(hadc); 00723 00724 /* Set ADC error code to none */ 00725 ADC_CLEAR_ERRORCODE(hadc); 00726 00727 /* Reset injected channel configuration parameters */ 00728 hadc->InjectionConfig.ContextQueue = 0; 00729 hadc->InjectionConfig.ChannelCount = 0; 00730 00731 /* Change ADC state */ 00732 hadc->State = HAL_ADC_STATE_RESET; 00733 00734 /* Process unlocked */ 00735 __HAL_UNLOCK(hadc); 00736 00737 00738 /* Return function status */ 00739 return HAL_OK; 00740 00741 } 00742 00743 /** 00744 * @brief Initialize the ADC MSP. 00745 * @param hadc: ADC handle 00746 * @retval None 00747 */ 00748 __weak void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) 00749 { 00750 /* Prevent unused argument(s) compilation warning */ 00751 UNUSED(hadc); 00752 00753 /* NOTE : This function should not be modified. When the callback is needed, 00754 function HAL_ADC_MspInit must be implemented in the user file. 00755 */ 00756 } 00757 00758 /** 00759 * @brief DeInitialize the ADC MSP. 00760 * @param hadc: ADC handle 00761 * @note All ADCs use the same clock: disabling the clock will reset all ADCs. 00762 * @retval None 00763 */ 00764 __weak void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc) 00765 { 00766 /* Prevent unused argument(s) compilation warning */ 00767 UNUSED(hadc); 00768 00769 /* NOTE : This function should not be modified. When the callback is needed, 00770 function HAL_ADC_MspDeInit must be implemented in the user file. 00771 */ 00772 } 00773 00774 /** 00775 * @} 00776 */ 00777 00778 /** @defgroup ADC_Exported_Functions_Group2 Input and Output operation functions 00779 * @brief IO operation functions 00780 * 00781 @verbatim 00782 =============================================================================== 00783 ##### IO operation functions ##### 00784 =============================================================================== 00785 [..] This section provides functions allowing to: 00786 (+) Start conversion of regular group. 00787 (+) Stop conversion of regular group. 00788 (+) Poll for conversion complete on regular group. 00789 (+) Poll for conversion event. 00790 (+) Get result of regular channel conversion. 00791 (+) Start conversion of regular group and enable interruptions. 00792 (+) Stop conversion of regular group and disable interruptions. 00793 (+) Handle ADC interrupt request 00794 (+) Start conversion of regular group and enable DMA transfer. 00795 (+) Stop conversion of regular group and disable ADC DMA transfer. 00796 00797 @endverbatim 00798 * @{ 00799 */ 00800 00801 /** 00802 * @brief Enable ADC, start conversion of regular group. 00803 * @note Interruptions enabled in this function: None. 00804 * @note Case of multimode enabled (when multimode feature is available): 00805 * if ADC is Slave, ADC is enabled but conversion is not started, 00806 * if ADC is master, ADC is enabled and multimode conversion is started. 00807 * @param hadc: ADC handle 00808 * @retval HAL status 00809 */ 00810 HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc) 00811 { 00812 ADC_TypeDef *tmpADC_Master; 00813 HAL_StatusTypeDef tmp_status = HAL_OK; 00814 00815 /* Check the parameters */ 00816 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); 00817 00818 00819 /* if a regular conversion is already on-going (i.e. ADSTART is set), 00820 don't restart the conversion. */ 00821 if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc)) 00822 { 00823 return HAL_BUSY; 00824 } 00825 else 00826 { 00827 /* Process locked */ 00828 __HAL_LOCK(hadc); 00829 00830 /* Enable the ADC peripheral */ 00831 tmp_status = ADC_Enable(hadc); 00832 00833 /* Start conversion if ADC is effectively enabled */ 00834 if (tmp_status == HAL_OK) 00835 { 00836 /* State machine update: Check if an injected conversion is ongoing */ 00837 if (HAL_IS_BIT_SET(hadc->State, HAL_ADC_STATE_INJ_BUSY)) 00838 { 00839 /* Reset ADC error code fields related to regular conversions only */ 00840 CLEAR_BIT(hadc->ErrorCode, (HAL_ADC_ERROR_OVR|HAL_ADC_ERROR_DMA)); 00841 } 00842 else 00843 { 00844 /* Set ADC error code to none */ 00845 ADC_CLEAR_ERRORCODE(hadc); 00846 } 00847 /* Clear HAL_ADC_STATE_READY and regular conversion results bits, set HAL_ADC_STATE_REG_BUSY bit */ 00848 ADC_STATE_CLR_SET(hadc->State, (HAL_ADC_STATE_READY|HAL_ADC_STATE_REG_EOC|HAL_ADC_STATE_REG_OVR|HAL_ADC_STATE_REG_EOSMP), HAL_ADC_STATE_REG_BUSY); 00849 00850 /* Reset HAL_ADC_STATE_MULTIMODE_SLAVE bit 00851 - by default if ADC is Master or Independent or if multimode feature is not available 00852 - if multimode setting is set to independent mode (no dual regular or injected conversions are configured) */ 00853 if (ADC_NONMULTIMODE_OR_MULTIMODEMASTER(hadc)) 00854 { 00855 CLEAR_BIT(hadc->State, HAL_ADC_STATE_MULTIMODE_SLAVE); 00856 } 00857 00858 /* Clear regular group conversion flag and overrun flag */ 00859 /* (To ensure of no unknown state from potential previous ADC operations) */ 00860 __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS | ADC_FLAG_OVR)); 00861 00862 /* Enable conversion of regular group. */ 00863 /* If software start has been selected, conversion starts immediately. */ 00864 /* If external trigger has been selected, conversion starts at next */ 00865 /* trigger event. */ 00866 /* Case of multimode enabled (when multimode feature is available): */ 00867 /* - if ADC is slave and dual regular conversions are enabled, ADC is */ 00868 /* enabled only (conversion is not started), */ 00869 /* - if ADC is master, ADC is enabled and conversion is started. */ 00870 if (ADC_INDEPENDENT_OR_NONMULTIMODEREGULAR_SLAVE(hadc)) 00871 { 00872 /* Multimode feature is not available or ADC Instance is Independent or Master, 00873 or is not Slave ADC with dual regular conversions enabled. 00874 Then, set HAL_ADC_STATE_INJ_BUSY bit and reset HAL_ADC_STATE_INJ_EOC bit if JAUTO is set. */ 00875 if (READ_BIT(hadc->Instance->CFGR, ADC_CFGR_JAUTO) != RESET) 00876 { 00877 ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_INJ_EOC, HAL_ADC_STATE_INJ_BUSY); 00878 } 00879 /* Process unlocked */ 00880 __HAL_UNLOCK(hadc); 00881 /* Start ADC */ 00882 SET_BIT(hadc->Instance->CR, ADC_CR_ADSTART); 00883 } 00884 else 00885 { 00886 SET_BIT(hadc->State, HAL_ADC_STATE_MULTIMODE_SLAVE); 00887 /* if Master ADC JAUTO bit is set, update Slave State in setting 00888 HAL_ADC_STATE_INJ_BUSY bit and in resetting HAL_ADC_STATE_INJ_EOC bit */ 00889 tmpADC_Master = ADC_MASTER_REGISTER(hadc); 00890 if (READ_BIT(tmpADC_Master->CFGR, ADC_CFGR_JAUTO) != RESET) 00891 { 00892 ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_INJ_EOC, HAL_ADC_STATE_INJ_BUSY); 00893 00894 } /* if (READ_BIT(tmpADC_Master->CFGR, ADC_CFGR_JAUTO) != RESET) */ 00895 /* Process unlocked */ 00896 __HAL_UNLOCK(hadc); 00897 } /* if (ADC_INDEPENDENT_OR_NONMULTIMODEREGULAR_SLAVE(hadc)) */ 00898 } 00899 else 00900 { 00901 /* Process unlocked */ 00902 __HAL_UNLOCK(hadc); 00903 } 00904 00905 /* Return function status */ 00906 return tmp_status; 00907 } 00908 } 00909 00910 /** 00911 * @brief Stop ADC conversion of regular and injected groups, disable ADC peripheral. 00912 * @param hadc: ADC handle 00913 * @retval HAL status. 00914 */ 00915 HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc) 00916 { 00917 HAL_StatusTypeDef tmp_status = HAL_OK; 00918 00919 /* Check the parameters */ 00920 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); 00921 00922 /* Process locked */ 00923 __HAL_LOCK(hadc); 00924 00925 /* 1. Stop potential regular and injected on-going conversions */ 00926 tmp_status = ADC_ConversionStop(hadc, ADC_REGULAR_INJECTED_GROUP); 00927 00928 /* Disable ADC peripheral if conversions are effectively stopped */ 00929 if (tmp_status == HAL_OK) 00930 { 00931 /* 2. Disable the ADC peripheral */ 00932 tmp_status = ADC_Disable(hadc); 00933 00934 /* Check if ADC is effectively disabled */ 00935 if (tmp_status == HAL_OK) 00936 { 00937 /* Change ADC state */ 00938 /* Clear HAL_ADC_STATE_REG_BUSY and HAL_ADC_STATE_INJ_BUSY bits, set HAL_ADC_STATE_READY bit */ 00939 ADC_STATE_CLR_SET(hadc->State, (HAL_ADC_STATE_REG_BUSY|HAL_ADC_STATE_INJ_BUSY), HAL_ADC_STATE_READY); 00940 } 00941 } 00942 00943 /* Process unlocked */ 00944 __HAL_UNLOCK(hadc); 00945 00946 /* Return function status */ 00947 return tmp_status; 00948 } 00949 00950 00951 00952 /** 00953 * @brief Wait for regular group conversion to be completed. 00954 * @param hadc: ADC handle 00955 * @param Timeout: Timeout value in millisecond. 00956 * @note Depending on hadc->Init.EOCSelection, EOS or EOC is 00957 * checked and cleared depending on AUTDLY bit status. 00958 * @note HAL_ADC_PollForConversion() returns HAL_ERROR if EOC is polled in a 00959 * DMA-managed conversions configuration: indeed, EOC is immediately 00960 * reset by the DMA reading the DR register when the converted data is 00961 * available. Therefore, EOC is set for a too short period to be 00962 * reliably polled. 00963 * @retval HAL status 00964 */ 00965 HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout) 00966 { 00967 uint32_t tickstart; 00968 uint32_t tmp_Flag_End = 0x00; 00969 ADC_TypeDef *tmpADC_Master; 00970 uint32_t tmp_cfgr = 0x00; 00971 uint32_t tmp_eos_raised = 0x01; /* by default, assume that EOS is set, 00972 tmp_eos_raised will be corrected 00973 accordingly during API execution */ 00974 00975 /* Check the parameters */ 00976 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); 00977 00978 /* If end of sequence selected */ 00979 if (hadc->Init.EOCSelection == ADC_EOC_SEQ_CONV) 00980 { 00981 tmp_Flag_End = ADC_FLAG_EOS; 00982 } 00983 else /* end of conversion selected */ 00984 { 00985 /* Check that the ADC is not in a DMA-based configuration. Otherwise, 00986 returns an error. */ 00987 00988 /* Check whether dual regular conversions are disabled or unavailable. */ 00989 if (ADC_IS_DUAL_REGULAR_CONVERSION_ENABLE(hadc) == RESET) 00990 { 00991 /* Check DMAEN bit in handle ADC CFGR register */ 00992 if (READ_BIT(hadc->Instance->CFGR, ADC_CFGR_DMAEN) != RESET) 00993 { 00994 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG); 00995 return HAL_ERROR; 00996 } 00997 } 00998 else 00999 { 01000 /* Else need to check Common register CCR MDMA bit field. */ 01001 if (ADC_MULTIMODE_DMA_ENABLED()) 01002 { 01003 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG); 01004 return HAL_ERROR; 01005 } 01006 } 01007 01008 /* no DMA transfer detected, polling ADC_FLAG_EOC is possible */ 01009 tmp_Flag_End = ADC_FLAG_EOC; 01010 } 01011 01012 /* Get timeout */ 01013 tickstart = HAL_GetTick(); 01014 01015 /* Wait until End of Conversion or Sequence flag is raised */ 01016 while (HAL_IS_BIT_CLR(hadc->Instance->ISR, tmp_Flag_End)) 01017 { 01018 /* Check if timeout is disabled (set to infinite wait) */ 01019 if(Timeout != HAL_MAX_DELAY) 01020 { 01021 if((Timeout == 0) || ((HAL_GetTick()-tickstart) > Timeout)) 01022 { 01023 SET_BIT(hadc->State, HAL_ADC_STATE_TIMEOUT); 01024 return HAL_TIMEOUT; 01025 } 01026 } 01027 } 01028 01029 /* Next, to clear the polled flag as well as to update the handle State, 01030 EOS is checked and the relevant configuration register is retrieved. */ 01031 /* 1. Check whether or not EOS is set */ 01032 if (HAL_IS_BIT_CLR(hadc->Instance->ISR, ADC_FLAG_EOS)) 01033 { 01034 tmp_eos_raised = 0; 01035 } 01036 /* 2. Check whether or not hadc is the handle of a Slave ADC with dual 01037 regular conversions enabled. */ 01038 if (ADC_INDEPENDENT_OR_NONMULTIMODEREGULAR_SLAVE(hadc)) 01039 { 01040 /* Retrieve handle ADC CFGR register */ 01041 tmp_cfgr = READ_REG(hadc->Instance->CFGR); 01042 } 01043 else 01044 { 01045 /* Retrieve Master ADC CFGR register */ 01046 tmpADC_Master = ADC_MASTER_REGISTER(hadc); 01047 tmp_cfgr = READ_REG(tmpADC_Master->CFGR); 01048 } 01049 01050 /* Clear polled flag */ 01051 if (tmp_Flag_End == ADC_FLAG_EOS) 01052 { 01053 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOS); 01054 } 01055 else 01056 { 01057 01058 /* Clear end of conversion EOC flag of regular group if low power feature */ 01059 /* "LowPowerAutoWait " is disabled, to not interfere with this feature */ 01060 /* until data register is read using function HAL_ADC_GetValue(). */ 01061 /* For regular groups, no new conversion will start before EOC is cleared.*/ 01062 /* Note that 1. reading DR clears EOC. */ 01063 /* 2. in multimode with dual regular conversions enabled (when */ 01064 /* multimode feature is available), Master AUTDLY bit is */ 01065 /* checked. */ 01066 if (READ_BIT (tmp_cfgr, ADC_CFGR_AUTDLY) == RESET) 01067 { 01068 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOC); 01069 } 01070 } 01071 01072 01073 /* Update ADC state machine */ 01074 SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC); 01075 /* If 1. EOS is set 01076 2. conversions are software-triggered 01077 3. CONT bit is reset (that of handle ADC or Master ADC if applicable) 01078 Then regular conversions are over and HAL_ADC_STATE_REG_BUSY can be reset. 01079 4. additionally, if no injected conversions are on-going, HAL_ADC_STATE_READY 01080 can be set */ 01081 if ((tmp_eos_raised) 01082 && (ADC_IS_SOFTWARE_START_REGULAR(hadc)) 01083 && (READ_BIT (tmp_cfgr, ADC_CFGR_CONT) == RESET)) 01084 { 01085 CLEAR_BIT(hadc->State, HAL_ADC_STATE_REG_BUSY); 01086 /* If no injected conversion on-going, set HAL_ADC_STATE_READY bit */ 01087 if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_INJ_BUSY)) 01088 { 01089 SET_BIT(hadc->State, HAL_ADC_STATE_READY); 01090 } 01091 } 01092 01093 01094 /* Return API HAL status */ 01095 return HAL_OK; 01096 } 01097 01098 /** 01099 * @brief Poll for ADC event. 01100 * @param hadc: ADC handle 01101 * @param EventType: the ADC event type. 01102 * This parameter can be one of the following values: 01103 * @arg @ref ADC_EOSMP_EVENT ADC End of Sampling event 01104 * @arg @ref ADC_AWD_EVENT ADC Analog watchdog 1 event 01105 * @arg @ref ADC_AWD2_EVENT ADC Analog watchdog 2 event 01106 * @arg @ref ADC_AWD3_EVENT ADC Analog watchdog 3 event 01107 * @arg @ref ADC_OVR_EVENT ADC Overrun event 01108 * @arg @ref ADC_JQOVF_EVENT ADC Injected context queue overflow event 01109 * @param Timeout: Timeout value in millisecond. 01110 * @note The relevant flag is cleared if found to be set, except for ADC_FLAG_OVR. 01111 * Indeed, the latter is reset only if hadc->Init.Overrun field is set 01112 * to ADC_OVR_DATA_OVERWRITTEN. Otherwise, DR may be potentially overwritten 01113 * by a new converted data as soon as OVR is cleared. 01114 * To reset OVR flag once the preserved data is retrieved, the user can resort 01115 * to macro __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR); 01116 * @retval HAL status 01117 */ 01118 HAL_StatusTypeDef HAL_ADC_PollForEvent(ADC_HandleTypeDef* hadc, uint32_t EventType, uint32_t Timeout) 01119 { 01120 uint32_t tickstart; 01121 01122 /* Check the parameters */ 01123 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); 01124 assert_param(IS_ADC_EVENT_TYPE(EventType)); 01125 01126 tickstart = HAL_GetTick(); 01127 01128 /* Check selected event flag */ 01129 while(__HAL_ADC_GET_FLAG(hadc, EventType) == RESET) 01130 { 01131 /* Check if timeout is disabled (set to infinite wait) */ 01132 if(Timeout != HAL_MAX_DELAY) 01133 { 01134 if((Timeout == 0) || ((HAL_GetTick()-tickstart) > Timeout)) 01135 { 01136 /* Update ADC state machine to timeout */ 01137 SET_BIT(hadc->State, HAL_ADC_STATE_TIMEOUT); 01138 01139 /* Process unlocked */ 01140 __HAL_UNLOCK(hadc); 01141 01142 return HAL_TIMEOUT; 01143 } 01144 } 01145 } 01146 01147 01148 switch(EventType) 01149 { 01150 /* End Of Sampling event */ 01151 case ADC_EOSMP_EVENT: 01152 /* Change ADC state */ 01153 SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOSMP); 01154 01155 /* Clear the End Of Sampling flag */ 01156 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOSMP); 01157 01158 break; 01159 01160 /* Analog watchdog (level out of window) event */ 01161 /* Note: In case of several analog watchdog enabled, if needed to know */ 01162 /* which one triggered and on which ADCx, test ADC state of Analog Watchdog */ 01163 /* flags HAL_ADC_STATE_AWD/2/3 function. */ 01164 /* For example: "if (HAL_ADC_GetState(hadc1) == HAL_ADC_STATE_AWD) " */ 01165 /* "if (HAL_ADC_GetState(hadc1) == HAL_ADC_STATE_AWD2)" */ 01166 /* "if (HAL_ADC_GetState(hadc1) == HAL_ADC_STATE_AWD3)" */ 01167 case ADC_AWD_EVENT: 01168 /* Change ADC state */ 01169 SET_BIT(hadc->State, HAL_ADC_STATE_AWD1); 01170 01171 /* Clear ADC analog watchdog flag */ 01172 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD1); 01173 01174 break; 01175 01176 /* Check analog watchdog 2 flag */ 01177 case ADC_AWD2_EVENT: 01178 /* Change ADC state */ 01179 SET_BIT(hadc->State, HAL_ADC_STATE_AWD2); 01180 01181 /* Clear ADC analog watchdog flag */ 01182 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD2); 01183 01184 break; 01185 01186 /* Check analog watchdog 3 flag */ 01187 case ADC_AWD3_EVENT: 01188 /* Change ADC state */ 01189 SET_BIT(hadc->State, HAL_ADC_STATE_AWD3); 01190 01191 /* Clear ADC analog watchdog flag */ 01192 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD3); 01193 01194 break; 01195 01196 /* Injected context queue overflow event */ 01197 case ADC_JQOVF_EVENT: 01198 /* Change ADC state */ 01199 SET_BIT(hadc->State, HAL_ADC_STATE_INJ_JQOVF); 01200 01201 /* Set ADC error code to Injected context queue overflow */ 01202 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_JQOVF); 01203 01204 /* Clear ADC Injected context queue overflow flag */ 01205 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JQOVF); 01206 01207 break; 01208 01209 /* Overrun event */ 01210 default: /* Case ADC_OVR_EVENT */ 01211 /* If overrun is set to overwrite previous data, overrun event is not */ 01212 /* considered as an error. */ 01213 /* (cf ref manual "Managing conversions without using the DMA and without */ 01214 /* overrun ") */ 01215 if (hadc->Init.Overrun == ADC_OVR_DATA_PRESERVED) 01216 { 01217 /* Change ADC state */ 01218 SET_BIT(hadc->State, HAL_ADC_STATE_REG_OVR); 01219 01220 /* Set ADC error code to overrun */ 01221 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_OVR); 01222 } 01223 else 01224 { 01225 /* Clear ADC Overrun flag only if Overrun is set to ADC_OVR_DATA_OVERWRITTEN 01226 otherwise, DR is potentially overwritten by new converted data as soon 01227 as OVR is cleared. */ 01228 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR); 01229 } 01230 break; 01231 } 01232 01233 /* Return API HAL status */ 01234 return HAL_OK; 01235 } 01236 01237 01238 /** 01239 * @brief Enable ADC, start conversion of regular group with interruption. 01240 * @note Interruptions enabled in this function according to initialization 01241 * setting : EOC (end of conversion), EOS (end of sequence), 01242 * OVR overrun. 01243 * Each of these interruptions has its dedicated callback function. 01244 * @note Case of multimode enabled (when multimode feature is available): 01245 * HAL_ADC_Start_IT() must be called for ADC Slave first, then for 01246 * ADC Master. 01247 * For ADC Slave, ADC is enabled only (conversion is not started). 01248 * For ADC Master, ADC is enabled and multimode conversion is started. 01249 * @note To guarantee a proper reset of all interruptions once all the needed 01250 * conversions are obtained, HAL_ADC_Stop_IT() must be called to ensure 01251 * a correct stop of the IT-based conversions. 01252 * @note By default, HAL_ADC_Start_IT() doesn't enable the End Of Sampling 01253 * interruption. If required (e.g. in case of oversampling with trigger 01254 * mode), the user must 01255 * 1. first clear the EOSMP flag if set with macro __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOSMP) 01256 * 2. then enable the EOSMP interrupt with macro __HAL_ADC_ENABLE_IT(hadc, ADC_IT_EOSMP) 01257 * before calling HAL_ADC_Start_IT(). 01258 * @param hadc: ADC handle 01259 * @retval HAL status 01260 */ 01261 HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc) 01262 { 01263 HAL_StatusTypeDef tmp_status = HAL_OK; 01264 ADC_TypeDef *tmpADC_Master; 01265 01266 /* Check the parameters */ 01267 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); 01268 01269 /* if a regular conversion is already on-going (i.e. ADSTART is set), 01270 don't restart the conversion. */ 01271 if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc)) 01272 { 01273 return HAL_BUSY; 01274 } 01275 else 01276 { 01277 /* Process locked */ 01278 __HAL_LOCK(hadc); 01279 01280 /* Enable the ADC peripheral */ 01281 tmp_status = ADC_Enable(hadc); 01282 01283 /* Start conversion if ADC is effectively enabled */ 01284 if (tmp_status == HAL_OK) 01285 { 01286 /* State machine update: Check if an injected conversion is ongoing */ 01287 if (HAL_IS_BIT_SET(hadc->State, HAL_ADC_STATE_INJ_BUSY)) 01288 { 01289 /* Reset ADC error code fields related to regular conversions only */ 01290 CLEAR_BIT(hadc->ErrorCode, (HAL_ADC_ERROR_OVR|HAL_ADC_ERROR_DMA)); 01291 } 01292 else 01293 { 01294 /* Set ADC error code to none */ 01295 ADC_CLEAR_ERRORCODE(hadc); 01296 } 01297 /* Clear HAL_ADC_STATE_READY and regular conversion results bits, set HAL_ADC_STATE_REG_BUSY bit */ 01298 ADC_STATE_CLR_SET(hadc->State, (HAL_ADC_STATE_READY|HAL_ADC_STATE_REG_EOC|HAL_ADC_STATE_REG_OVR|HAL_ADC_STATE_REG_EOSMP), HAL_ADC_STATE_REG_BUSY); 01299 01300 /* Reset HAL_ADC_STATE_MULTIMODE_SLAVE bit 01301 - by default if ADC is Master or Independent or if multimode feature is not available 01302 - if MultiMode setting is set to independent mode (no dual regular or injected conversions are configured) */ 01303 if (ADC_NONMULTIMODE_OR_MULTIMODEMASTER(hadc)) 01304 { 01305 CLEAR_BIT(hadc->State, HAL_ADC_STATE_MULTIMODE_SLAVE); 01306 } 01307 01308 /* Clear regular group conversion flag and overrun flag */ 01309 /* (To ensure of no unknown state from potential previous ADC operations) */ 01310 __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS | ADC_FLAG_OVR)); 01311 01312 /* By default, disable all interruptions before enabling the desired ones */ 01313 __HAL_ADC_DISABLE_IT(hadc, (ADC_IT_EOC | ADC_IT_EOS | ADC_IT_OVR)); 01314 01315 /* Enable required interruptions */ 01316 switch(hadc->Init.EOCSelection) 01317 { 01318 case ADC_EOC_SEQ_CONV: 01319 __HAL_ADC_ENABLE_IT(hadc, ADC_IT_EOS); 01320 break; 01321 /* case ADC_EOC_SINGLE_CONV */ 01322 default: 01323 __HAL_ADC_ENABLE_IT(hadc, ADC_IT_EOC); 01324 break; 01325 } 01326 01327 /* If hadc->Init.Overrun is set to ADC_OVR_DATA_PRESERVED, only then is 01328 ADC_IT_OVR enabled; otherwise data overwrite is considered as normal 01329 behavior and no CPU time is lost for a non-processed interruption */ 01330 if (hadc->Init.Overrun == ADC_OVR_DATA_PRESERVED) 01331 { 01332 __HAL_ADC_ENABLE_IT(hadc, ADC_IT_OVR); 01333 } 01334 01335 /* Enable conversion of regular group. */ 01336 /* If software start has been selected, conversion starts immediately. */ 01337 /* If external trigger has been selected, conversion starts at next */ 01338 /* trigger event. */ 01339 /* Case of multimode enabled (when multimode feature is available): */ 01340 /* - if ADC is slave and dual regular conversions are enabled, ADC is */ 01341 /* enabled only (conversion is not started), */ 01342 /* - if ADC is master, ADC is enabled and conversion is started. */ 01343 if (ADC_INDEPENDENT_OR_NONMULTIMODEREGULAR_SLAVE(hadc) ) 01344 { 01345 /* Multimode feature is not available or ADC Instance is Independent or Master, 01346 or is not Slave ADC with dual regular conversions enabled. 01347 Then set HAL_ADC_STATE_INJ_BUSY and reset HAL_ADC_STATE_INJ_EOC if JAUTO is set. */ 01348 if (READ_BIT(hadc->Instance->CFGR, ADC_CFGR_JAUTO) != RESET) 01349 { 01350 ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_INJ_EOC, HAL_ADC_STATE_INJ_BUSY); 01351 01352 /* Enable as well injected interruptions in case 01353 HAL_ADCEx_InjectedStart_IT() has not been called beforehand. This 01354 allows to start regular and injected conversions when JAUTO is 01355 set with a single call to HAL_ADC_Start_IT() */ 01356 switch(hadc->Init.EOCSelection) 01357 { 01358 case ADC_EOC_SEQ_CONV: 01359 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_JEOC); 01360 __HAL_ADC_ENABLE_IT(hadc, ADC_IT_JEOS); 01361 break; 01362 /* case ADC_EOC_SINGLE_CONV */ 01363 default: 01364 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_JEOS); 01365 __HAL_ADC_ENABLE_IT(hadc, ADC_IT_JEOC); 01366 break; 01367 } 01368 } /* if (READ_BIT(hadc->Instance->CFGR, ADC_CFGR_JAUTO) != RESET) */ 01369 /* Process unlocked */ 01370 __HAL_UNLOCK(hadc); 01371 /* Start ADC */ 01372 SET_BIT(hadc->Instance->CR, ADC_CR_ADSTART); 01373 } 01374 else 01375 { 01376 /* hadc is the handle of a Slave ADC with dual regular conversions 01377 enabled. Therefore, ADC_CR_ADSTART is NOT set */ 01378 SET_BIT(hadc->State, HAL_ADC_STATE_MULTIMODE_SLAVE); 01379 /* if Master ADC JAUTO bit is set, Slave injected interruptions 01380 are enabled nevertheless (for same reason as above) */ 01381 tmpADC_Master = ADC_MASTER_REGISTER(hadc); 01382 if (READ_BIT(tmpADC_Master->CFGR, ADC_CFGR_JAUTO) != RESET) 01383 { 01384 /* First, update Slave State in setting HAL_ADC_STATE_INJ_BUSY bit 01385 and in resetting HAL_ADC_STATE_INJ_EOC bit */ 01386 ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_INJ_EOC, HAL_ADC_STATE_INJ_BUSY); 01387 /* Next, set Slave injected interruptions */ 01388 switch(hadc->Init.EOCSelection) 01389 { 01390 case ADC_EOC_SEQ_CONV: 01391 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_JEOC); 01392 __HAL_ADC_ENABLE_IT(hadc, ADC_IT_JEOS); 01393 break; 01394 /* case ADC_EOC_SINGLE_CONV */ 01395 default: 01396 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_JEOS); 01397 __HAL_ADC_ENABLE_IT(hadc, ADC_IT_JEOC); 01398 break; 01399 } 01400 } /* if (READ_BIT(tmpADC_Master->CFGR, ADC_CFGR_JAUTO) != RESET) */ 01401 /* Process unlocked */ 01402 __HAL_UNLOCK(hadc); 01403 } /* if (ADC_INDEPENDENT_OR_NONMULTIMODEREGULAR_SLAVE(hadc) ) */ 01404 } /* if (tmp_status == HAL_OK) */ 01405 else 01406 { 01407 /* Process unlocked */ 01408 __HAL_UNLOCK(hadc); 01409 } 01410 01411 /* Return function status */ 01412 return tmp_status; 01413 01414 } 01415 } 01416 01417 01418 01419 /** 01420 * @brief Stop ADC conversion of regular groups when interruptions are enabled. 01421 * @note Stop as well injected conversions and disable ADC peripheral. 01422 * @param hadc: ADC handle 01423 * @retval HAL status. 01424 */ 01425 HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc) 01426 { 01427 HAL_StatusTypeDef tmp_status = HAL_OK; 01428 01429 /* Check the parameters */ 01430 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); 01431 01432 /* Process locked */ 01433 __HAL_LOCK(hadc); 01434 01435 /* 1. Stop potential regular and injected on-going conversions */ 01436 tmp_status = ADC_ConversionStop(hadc, ADC_REGULAR_INJECTED_GROUP); 01437 01438 /* Disable ADC peripheral if conversions are effectively stopped */ 01439 if (tmp_status == HAL_OK) 01440 { 01441 /* Disable all interrupts */ 01442 __HAL_ADC_DISABLE_IT(hadc, (ADC_IT_EOC | ADC_IT_EOS | ADC_IT_OVR)); 01443 01444 /* 2. Disable the ADC peripheral */ 01445 tmp_status = ADC_Disable(hadc); 01446 01447 /* Check if ADC is effectively disabled */ 01448 if (tmp_status == HAL_OK) 01449 { 01450 /* Change ADC state */ 01451 /* Clear HAL_ADC_STATE_REG_BUSY and HAL_ADC_STATE_INJ_BUSY bits, set HAL_ADC_STATE_READY bit */ 01452 ADC_STATE_CLR_SET(hadc->State, (HAL_ADC_STATE_REG_BUSY|HAL_ADC_STATE_INJ_BUSY), HAL_ADC_STATE_READY); 01453 } 01454 } 01455 01456 /* Process unlocked */ 01457 __HAL_UNLOCK(hadc); 01458 01459 /* Return function status */ 01460 return tmp_status; 01461 } 01462 01463 01464 /** 01465 * @brief Enable ADC, start conversion of regular group and transfer result through DMA. 01466 * @note Interruptions enabled in this function: 01467 * overrun (if applicable), DMA half transfer, DMA transfer complete. 01468 * Each of these interruptions has its dedicated callback function. 01469 * @note Case of multimode enabled (when multimode feature is available): HAL_ADC_Start_DMA() 01470 * is designed for single-ADC mode only. For multimode, the dedicated 01471 * HAL_ADCEx_MultiModeStart_DMA() function must be used. 01472 * @param hadc: ADC handle 01473 * @param pData: Destination Buffer address. 01474 * @param Length: Length of data to be transferred from ADC peripheral to memory (in bytes) 01475 * @retval None 01476 */ 01477 HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length) 01478 { 01479 HAL_StatusTypeDef tmp_status = HAL_OK; 01480 01481 /* Check the parameters */ 01482 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); 01483 01484 if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc)) 01485 { 01486 return HAL_BUSY; 01487 } 01488 else 01489 { 01490 01491 /* Process locked */ 01492 __HAL_LOCK(hadc); 01493 01494 /* Ensure that dual regular conversions are not enabled or unavailable. */ 01495 /* Otherwise, dedicated API HAL_ADCEx_MultiModeStart_DMA() must be used. */ 01496 if (ADC_IS_DUAL_REGULAR_CONVERSION_ENABLE(hadc) == RESET) 01497 { 01498 /* Enable the ADC peripheral */ 01499 tmp_status = ADC_Enable(hadc); 01500 01501 /* Start conversion if ADC is effectively enabled */ 01502 if (tmp_status == HAL_OK) 01503 { 01504 /* State machine update: Check if an injected conversion is ongoing */ 01505 if (HAL_IS_BIT_SET(hadc->State, HAL_ADC_STATE_INJ_BUSY)) 01506 { 01507 /* Reset ADC error code fields related to regular conversions only */ 01508 CLEAR_BIT(hadc->ErrorCode, (HAL_ADC_ERROR_OVR|HAL_ADC_ERROR_DMA)); 01509 } 01510 else 01511 { 01512 /* Set ADC error code to none */ 01513 ADC_CLEAR_ERRORCODE(hadc); 01514 } 01515 /* Clear HAL_ADC_STATE_READY and regular conversion results bits, set HAL_ADC_STATE_REG_BUSY bit */ 01516 ADC_STATE_CLR_SET(hadc->State, (HAL_ADC_STATE_READY|HAL_ADC_STATE_REG_EOC|HAL_ADC_STATE_REG_OVR|HAL_ADC_STATE_REG_EOSMP), HAL_ADC_STATE_REG_BUSY); 01517 01518 /* Reset HAL_ADC_STATE_MULTIMODE_SLAVE bit 01519 - by default if ADC is Master or Independent or if multimode feature is not available 01520 - if multimode setting is set to independent mode (no dual regular or injected conversions are configured) */ 01521 if (ADC_NONMULTIMODE_OR_MULTIMODEMASTER(hadc)) 01522 { 01523 CLEAR_BIT(hadc->State, HAL_ADC_STATE_MULTIMODE_SLAVE); 01524 } 01525 01526 /* Set the DMA transfer complete callback */ 01527 hadc->DMA_Handle->XferCpltCallback = ADC_DMAConvCplt; 01528 01529 /* Set the DMA half transfer complete callback */ 01530 hadc->DMA_Handle->XferHalfCpltCallback = ADC_DMAHalfConvCplt; 01531 01532 /* Set the DMA error callback */ 01533 hadc->DMA_Handle->XferErrorCallback = ADC_DMAError; 01534 01535 01536 /* Manage ADC and DMA start: ADC overrun interruption, DMA start, */ 01537 /* ADC start (in case of SW start): */ 01538 01539 /* Clear regular group conversion flag and overrun flag */ 01540 /* (To ensure of no unknown state from potential previous ADC */ 01541 /* operations) */ 01542 __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS | ADC_FLAG_OVR)); 01543 01544 /* With DMA, overrun event is always considered as an error even if 01545 hadc->Init.Overrun is set to ADC_OVR_DATA_OVERWRITTEN. Therefore, 01546 ADC_IT_OVR is enabled. */ 01547 __HAL_ADC_ENABLE_IT(hadc, ADC_IT_OVR); 01548 01549 01550 /* Enable ADC DMA mode */ 01551 SET_BIT(hadc->Instance->CFGR, ADC_CFGR_DMAEN); 01552 01553 /* Start the DMA channel */ 01554 HAL_DMA_Start_IT(hadc->DMA_Handle, (uint32_t)&hadc->Instance->DR, (uint32_t)pData, Length); 01555 01556 /* Enable conversion of regular group. */ 01557 /* Process unlocked */ 01558 __HAL_UNLOCK(hadc); 01559 /* If software start has been selected, conversion starts immediately. */ 01560 /* If external trigger has been selected, conversion will start at next */ 01561 /* trigger event. */ 01562 SET_BIT(hadc->Instance->CR, ADC_CR_ADSTART); 01563 01564 } 01565 else 01566 { 01567 /* Process unlocked */ 01568 __HAL_UNLOCK(hadc); 01569 } /* if (tmp_status == HAL_OK) */ 01570 } 01571 else 01572 { 01573 tmp_status = HAL_ERROR; 01574 /* Process unlocked */ 01575 __HAL_UNLOCK(hadc); 01576 } /* if (ADC_IS_DUAL_REGULAR_CONVERSION_ENABLE(hadc) == RESET) */ 01577 01578 01579 01580 /* Return function status */ 01581 return tmp_status; 01582 } /* if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc)) */ 01583 } 01584 01585 01586 /** 01587 * @brief Stop ADC conversion of regular groups and disable ADC DMA transfer. 01588 * @note Stop as well injected conversions and disable ADC peripheral. 01589 * @note Case of multimode enabled (when multimode feature is available): 01590 * HAL_ADC_Stop_DMA() function is dedicated to single-ADC mode only. 01591 * For multimode, the dedicated HAL_ADCEx_MultiModeStop_DMA() API must be used. 01592 * @param hadc: ADC handle 01593 * @retval HAL status. 01594 */ 01595 HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc) 01596 { 01597 HAL_StatusTypeDef tmp_status = HAL_OK; 01598 01599 /* Check the parameters */ 01600 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); 01601 01602 /* Process locked */ 01603 __HAL_LOCK(hadc); 01604 01605 /* 1. Stop potential regular conversion on going */ 01606 tmp_status = ADC_ConversionStop(hadc, ADC_REGULAR_INJECTED_GROUP); 01607 01608 /* Disable ADC peripheral if conversions are effectively stopped */ 01609 if (tmp_status == HAL_OK) 01610 { 01611 /* Disable ADC DMA (ADC DMA configuration ADC_CFGR_DMACFG is kept) */ 01612 CLEAR_BIT(hadc->Instance->CFGR, ADC_CFGR_DMAEN); 01613 01614 /* Disable the DMA channel (in case of DMA in circular mode or stop while */ 01615 /* while DMA transfer is on going) */ 01616 tmp_status = HAL_DMA_Abort(hadc->DMA_Handle); 01617 01618 /* Check if DMA channel effectively disabled */ 01619 if (tmp_status != HAL_OK) 01620 { 01621 /* Update ADC state machine to error */ 01622 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL); 01623 } 01624 01625 /* Disable ADC overrun interrupt */ 01626 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_OVR); 01627 01628 /* 2. Disable the ADC peripheral */ 01629 /* Update "tmp_status" only if DMA channel disabling passed, to keep in */ 01630 /* memory a potential failing status. */ 01631 if (tmp_status == HAL_OK) 01632 { 01633 tmp_status = ADC_Disable(hadc); 01634 } 01635 else 01636 { 01637 ADC_Disable(hadc); 01638 } 01639 01640 /* Check if ADC is effectively disabled */ 01641 if (tmp_status == HAL_OK) 01642 { 01643 /* Change ADC state */ 01644 /* Clear HAL_ADC_STATE_REG_BUSY and HAL_ADC_STATE_INJ_BUSY bits, set HAL_ADC_STATE_READY bit */ 01645 ADC_STATE_CLR_SET(hadc->State, (HAL_ADC_STATE_REG_BUSY|HAL_ADC_STATE_INJ_BUSY), HAL_ADC_STATE_READY); 01646 } 01647 01648 } 01649 01650 /* Process unlocked */ 01651 __HAL_UNLOCK(hadc); 01652 01653 /* Return function status */ 01654 return tmp_status; 01655 } 01656 01657 01658 /** 01659 * @brief Get ADC regular group conversion result. 01660 * @param hadc: ADC handle 01661 * @note Reading DR register automatically clears EOC flag. To reset EOS flag, 01662 * the user must resort to the macro 01663 * __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOS) 01664 * @retval Converted value 01665 */ 01666 uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc) 01667 { 01668 /* Check the parameters */ 01669 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); 01670 01671 /* Return ADC converted value */ 01672 return hadc->Instance->DR; 01673 } 01674 01675 01676 /** 01677 * @brief Handle ADC interrupt request. 01678 * @param hadc: ADC handle 01679 * @retval None 01680 */ 01681 void HAL_ADC_IRQHandler(ADC_HandleTypeDef* hadc) 01682 { 01683 uint32_t overrun_error = 0; /* flag set if overrun occurrence has to be considered as an error */ 01684 ADC_TypeDef *tmpADC_Master; 01685 uint32_t tmp_isr = hadc->Instance->ISR; 01686 uint32_t tmp_ier = hadc->Instance->IER; 01687 uint32_t tmp_cfgr = 0x0; 01688 uint32_t tmp_cfgr_jqm = 0x0; 01689 01690 01691 /* Check the parameters */ 01692 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); 01693 assert_param(IS_ADC_EOC_SELECTION(hadc->Init.EOCSelection)); 01694 01695 01696 /* ====== Check End of Sampling flag for regular group ===== */ 01697 if (((tmp_isr & ADC_FLAG_EOSMP) == ADC_FLAG_EOSMP) && ((tmp_ier & ADC_IT_EOSMP) == ADC_IT_EOSMP)) 01698 { 01699 /* Update state machine on end of sampling status if not in error state */ 01700 if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL)) 01701 { 01702 /* Change ADC state */ 01703 SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOSMP); 01704 } 01705 01706 /* End Of Sampling callback */ 01707 HAL_ADCEx_EndOfSamplingCallback(hadc); 01708 01709 /* Clear regular group conversion flag */ 01710 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOSMP ); 01711 } 01712 01713 /* ====== Check End of Conversion or Sequence flags for regular group ===== */ 01714 if( (((tmp_isr & ADC_FLAG_EOC) == ADC_FLAG_EOC) && ((tmp_ier & ADC_IT_EOC) == ADC_IT_EOC)) || 01715 (((tmp_isr & ADC_FLAG_EOS) == ADC_FLAG_EOS) && ((tmp_ier & ADC_IT_EOS) == ADC_IT_EOS)) ) 01716 { 01717 /* Update state machine on conversion status if not in error state */ 01718 if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL)) 01719 { 01720 /* Change ADC state */ 01721 SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC); 01722 } 01723 01724 /* Disable interruption if no further conversion upcoming by regular */ 01725 /* external trigger or by continuous mode, */ 01726 /* and if scan sequence if completed. */ 01727 if(ADC_IS_SOFTWARE_START_REGULAR(hadc)) 01728 { 01729 if (ADC_INDEPENDENT_OR_NONMULTIMODEREGULAR_SLAVE(hadc)) 01730 { 01731 /* check CONT bit directly in handle ADC CFGR register */ 01732 tmp_cfgr = READ_REG(hadc->Instance->CFGR); 01733 } 01734 else 01735 { 01736 /* else need to check Master ADC CONT bit */ 01737 tmpADC_Master = ADC_MASTER_REGISTER(hadc); 01738 tmp_cfgr = READ_REG(tmpADC_Master->CFGR); 01739 } 01740 01741 /* Carry on if continuous mode is disabled */ 01742 if (READ_BIT (tmp_cfgr, ADC_CFGR_CONT) != ADC_CFGR_CONT) 01743 { 01744 /* If End of Sequence is reached, disable interrupts */ 01745 if( __HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOS) ) 01746 { 01747 /* Allowed to modify bits ADC_IT_EOC/ADC_IT_EOS only if bit */ 01748 /* ADSTART==0 (no conversion on going) */ 01749 if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) == RESET) 01750 { 01751 /* Disable ADC end of sequence conversion interrupt */ 01752 /* Note: if Overrun interrupt was enabled with EOC or EOS interrupt */ 01753 /* in HAL_Start_IT(), it isn't disabled here because it can be used */ 01754 /* by overrun IRQ process below. */ 01755 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC | ADC_IT_EOS); 01756 /* Clear HAL_ADC_STATE_REG_BUSY bit */ 01757 CLEAR_BIT(hadc->State, HAL_ADC_STATE_REG_BUSY); 01758 /* If no injected conversion on-going, set HAL_ADC_STATE_READY bit */ 01759 if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_INJ_BUSY)) 01760 { 01761 SET_BIT(hadc->State, HAL_ADC_STATE_READY); 01762 } 01763 } 01764 else 01765 { 01766 /* Change ADC state to error state */ 01767 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL); 01768 01769 /* Set ADC error code to ADC IP internal error */ 01770 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL); 01771 } 01772 } 01773 } /* if (READ_BIT (tmp_cfgr, ADC_CFGR_CONT) != ADC_CFGR_CONT) */ 01774 } /* if(ADC_IS_SOFTWARE_START_REGULAR(hadc) */ 01775 01776 /* Conversion complete callback */ 01777 /* Note: HAL_ADC_ConvCpltCallback can resort to 01778 if( __HAL_ADC_GET_FLAG(&hadc, ADC_FLAG_EOS)) or 01779 if( __HAL_ADC_GET_FLAG(&hadc, ADC_FLAG_EOC)) to determine whether 01780 interruption has been triggered by end of conversion or end of 01781 sequence. */ 01782 HAL_ADC_ConvCpltCallback(hadc); 01783 01784 01785 /* Clear regular group conversion flag */ 01786 __HAL_ADC_CLEAR_FLAG(hadc, (ADC_FLAG_EOC | ADC_FLAG_EOS) ); 01787 } 01788 01789 01790 /* ========== Check End of Conversion flag for injected group ========== */ 01791 if( (((tmp_isr & ADC_FLAG_JEOC) == ADC_FLAG_JEOC) && ((tmp_ier & ADC_IT_JEOC) == ADC_IT_JEOC)) || 01792 (((tmp_isr & ADC_FLAG_JEOS) == ADC_FLAG_JEOS) && ((tmp_ier & ADC_IT_JEOS) == ADC_IT_JEOS)) ) 01793 { 01794 /* Update state machine on conversion status if not in error state */ 01795 if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL)) 01796 { 01797 /* Change ADC state */ 01798 SET_BIT(hadc->State, HAL_ADC_STATE_INJ_EOC); 01799 } 01800 01801 01802 /* Check whether interruptions can be disabled only if 01803 - injected conversions are software-triggered when injected queue management is disabled 01804 OR 01805 - auto-injection is enabled, continuous mode is disabled (CONT = 0) 01806 and regular conversions are software-triggered */ 01807 /* If End of Sequence is reached, disable interrupts */ 01808 if( __HAL_ADC_GET_FLAG(hadc, ADC_FLAG_JEOS)) 01809 { 01810 01811 /* First, retrieve proper registers to check */ 01812 /* 1a. Are injected conversions that of a dual Slave ? */ 01813 if (ADC_INDEPENDENT_OR_NONMULTIMODEINJECTED_SLAVE(hadc)) 01814 { 01815 /* hadc is not the handle of a Slave ADC with dual injected conversions enabled: 01816 check JQM bit directly in ADC CFGR register */ 01817 tmp_cfgr_jqm = READ_REG(hadc->Instance->CFGR); 01818 } 01819 else 01820 { 01821 /* hadc is the handle of a Slave ADC with dual injected conversions enabled: 01822 need to check JQM bit of Master ADC CFGR register */ 01823 tmpADC_Master = ADC_MASTER_REGISTER(hadc); 01824 tmp_cfgr_jqm = READ_REG(tmpADC_Master->CFGR); 01825 } 01826 /* 1b. Is hadc the handle of a Slave ADC with regular conversions enabled? */ 01827 if (ADC_INDEPENDENT_OR_NONMULTIMODEREGULAR_SLAVE(hadc)) 01828 { 01829 /* hadc is not the handle of a Slave ADC with dual regular conversions enabled: 01830 check JAUTO and CONT bits directly in ADC CFGR register */ 01831 tmp_cfgr = READ_REG(hadc->Instance->CFGR); 01832 } 01833 else 01834 { 01835 /* hadc is not the handle of a Slave ADC with dual regular conversions enabled: 01836 check JAUTO and CONT bits of Master ADC CFGR register */ 01837 tmpADC_Master = ADC_MASTER_REGISTER(hadc); 01838 tmp_cfgr = READ_REG(tmpADC_Master->CFGR); 01839 } 01840 01841 /* Secondly, check whether JEOC and JEOS interruptions can be disabled */ 01842 if ((ADC_IS_SOFTWARE_START_INJECTED(hadc) && (READ_BIT(tmp_cfgr_jqm, ADC_CFGR_JQM) != ADC_CFGR_JQM)) 01843 && (!((READ_BIT(tmp_cfgr, (ADC_CFGR_JAUTO|ADC_CFGR_CONT)) == (ADC_CFGR_JAUTO|ADC_CFGR_CONT)) && 01844 (ADC_IS_SOFTWARE_START_REGULAR(hadc)))) ) 01845 { 01846 /* Allowed to modify bits ADC_IT_JEOC/ADC_IT_JEOS only if bit */ 01847 /* JADSTART==0 (no conversion on going) */ 01848 if (ADC_IS_CONVERSION_ONGOING_INJECTED(hadc) == RESET) 01849 { 01850 /* Disable ADC end of sequence conversion interrupt */ 01851 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_JEOC | ADC_IT_JEOS); 01852 /* Clear HAL_ADC_STATE_INJ_BUSY bit */ 01853 CLEAR_BIT(hadc->State, HAL_ADC_STATE_INJ_BUSY); 01854 /* If no regular conversion on-going, set HAL_ADC_STATE_READY bit */ 01855 if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_REG_BUSY)) 01856 { 01857 SET_BIT(hadc->State, HAL_ADC_STATE_READY); 01858 } 01859 } 01860 else 01861 { 01862 /* Change ADC state to error state */ 01863 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL); 01864 01865 /* Set ADC error code to ADC IP internal error */ 01866 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL); 01867 } 01868 } 01869 } /* if( __HAL_ADC_GET_FLAG(hadc, ADC_FLAG_JEOS)) */ 01870 01871 /* Injected Conversion complete callback */ 01872 /* Note: HAL_ADCEx_InjectedConvCpltCallback can resort to 01873 if( __HAL_ADC_GET_FLAG(&hadc, ADC_FLAG_JEOS)) or 01874 if( __HAL_ADC_GET_FLAG(&hadc, ADC_FLAG_JEOC)) to determine whether 01875 interruption has been triggered by end of conversion or end of 01876 sequence. */ 01877 HAL_ADCEx_InjectedConvCpltCallback(hadc); 01878 01879 /* Clear injected group conversion flag */ 01880 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JEOC | ADC_FLAG_JEOS); 01881 } 01882 01883 01884 /* ========== Check Analog watchdog flags =================================================== */ 01885 01886 /* ========== Check Analog watchdog 1 flags ========== */ 01887 if (((tmp_isr & ADC_FLAG_AWD1) == ADC_FLAG_AWD1) && ((tmp_ier & ADC_IT_AWD1) == ADC_IT_AWD1)) 01888 { 01889 /* Change ADC state */ 01890 SET_BIT(hadc->State, HAL_ADC_STATE_AWD1); 01891 01892 /* Level out of window 1 callback */ 01893 HAL_ADC_LevelOutOfWindowCallback(hadc); 01894 /* Clear ADC Analog watchdog flag */ 01895 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD1); 01896 } 01897 01898 /* ========== Check Analog watchdog 2 flags ========== */ 01899 if (((tmp_isr & ADC_FLAG_AWD2) == ADC_FLAG_AWD2) && ((tmp_ier & ADC_IT_AWD2) == ADC_IT_AWD2)) 01900 { 01901 /* Change ADC state */ 01902 SET_BIT(hadc->State, HAL_ADC_STATE_AWD2); 01903 01904 /* Level out of window 2 callback */ 01905 HAL_ADCEx_LevelOutOfWindow2Callback(hadc); 01906 /* Clear ADC Analog watchdog flag */ 01907 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD2); 01908 } 01909 01910 /* ========== Check Analog watchdog 3 flags ========== */ 01911 if (((tmp_isr & ADC_FLAG_AWD3) == ADC_FLAG_AWD3) && ((tmp_ier & ADC_IT_AWD3) == ADC_IT_AWD3)) 01912 { 01913 /* Change ADC state */ 01914 SET_BIT(hadc->State, HAL_ADC_STATE_AWD3); 01915 01916 /* Level out of window 3 callback */ 01917 HAL_ADCEx_LevelOutOfWindow3Callback(hadc); 01918 /* Clear ADC Analog watchdog flag */ 01919 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_AWD3); 01920 } 01921 01922 01923 /* ========== Check Overrun flag ========== */ 01924 if (((tmp_isr & ADC_FLAG_OVR) == ADC_FLAG_OVR) && ((tmp_ier & ADC_IT_OVR) == ADC_IT_OVR)) 01925 { 01926 /* If overrun is set to overwrite previous data (default setting), */ 01927 /* overrun event is not considered as an error. */ 01928 /* (cf ref manual "Managing conversions without using the DMA and without */ 01929 /* overrun ") */ 01930 /* Exception for usage with DMA overrun event always considered as an */ 01931 /* error. */ 01932 01933 if (hadc->Init.Overrun == ADC_OVR_DATA_PRESERVED) 01934 { 01935 overrun_error = 1; 01936 } 01937 else 01938 { 01939 /* check DMA configuration, depending on multimode set or not, 01940 or whether or not multimode feature is available */ 01941 if (ADC_IS_DUAL_CONVERSION_ENABLE(hadc) == RESET) 01942 { 01943 /* Multimode not set or feature not available or ADC independent */ 01944 if (HAL_IS_BIT_SET(hadc->Instance->CFGR, ADC_CFGR_DMAEN)) 01945 { 01946 overrun_error = 1; 01947 } 01948 } 01949 else 01950 { 01951 /* Multimode (when feature is available) is enabled, 01952 Common Control Register MDMA bits must be checked. */ 01953 if (ADC_MULTIMODE_DMA_ENABLED()) 01954 { 01955 overrun_error = 1; 01956 } 01957 } 01958 } 01959 01960 if (overrun_error == 1) 01961 { 01962 /* Change ADC state to error state */ 01963 SET_BIT(hadc->State, HAL_ADC_STATE_REG_OVR); 01964 01965 /* Set ADC error code to overrun */ 01966 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_OVR); 01967 01968 /* Error callback */ 01969 HAL_ADC_ErrorCallback(hadc); 01970 } 01971 01972 /* Clear the Overrun flag, to be done AFTER HAL_ADC_ErrorCallback() since 01973 old data is preserved until OVR is reset */ 01974 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_OVR); 01975 01976 } 01977 01978 01979 /* ========== Check Injected context queue overflow flag ========== */ 01980 if (((tmp_isr & ADC_FLAG_JQOVF) == ADC_FLAG_JQOVF) && ((tmp_ier & ADC_IT_JQOVF) == ADC_IT_JQOVF)) 01981 { 01982 /* Change ADC state to overrun state */ 01983 SET_BIT(hadc->State, HAL_ADC_STATE_INJ_JQOVF); 01984 01985 /* Set ADC error code to Injected context queue overflow */ 01986 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_JQOVF); 01987 01988 /* Clear the Injected context queue overflow flag */ 01989 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JQOVF); 01990 01991 /* Error callback */ 01992 HAL_ADCEx_InjectedQueueOverflowCallback(hadc); 01993 } 01994 01995 } 01996 01997 /** 01998 * @brief Conversion complete callback in non-blocking mode. 01999 * @param hadc: ADC handle 02000 * @retval None 02001 */ 02002 __weak void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) 02003 { 02004 /* Prevent unused argument(s) compilation warning */ 02005 UNUSED(hadc); 02006 02007 /* NOTE : This function should not be modified. When the callback is needed, 02008 function HAL_ADC_ConvCpltCallback must be implemented in the user file. 02009 */ 02010 } 02011 02012 /** 02013 * @brief Conversion DMA half-transfer callback in non-blocking mode. 02014 * @param hadc: ADC handle 02015 * @retval None 02016 */ 02017 __weak void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc) 02018 { 02019 /* Prevent unused argument(s) compilation warning */ 02020 UNUSED(hadc); 02021 02022 /* NOTE : This function should not be modified. When the callback is needed, 02023 function HAL_ADC_ConvHalfCpltCallback must be implemented in the user file. 02024 */ 02025 } 02026 02027 /** 02028 * @brief Analog watchdog 1 callback in non-blocking mode. 02029 * @param hadc: ADC handle 02030 * @retval None 02031 */ 02032 __weak void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef* hadc) 02033 { 02034 /* Prevent unused argument(s) compilation warning */ 02035 UNUSED(hadc); 02036 02037 /* NOTE : This function should not be modified. When the callback is needed, 02038 function HAL_ADC_LevelOutOfWindowCallback must be implemented in the user file. 02039 */ 02040 } 02041 02042 /** 02043 * @brief ADC error callback in non-blocking mode 02044 * (ADC conversion with interruption or transfer by DMA). 02045 * @param hadc: ADC handle 02046 * @retval None 02047 */ 02048 __weak void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc) 02049 { 02050 /* Prevent unused argument(s) compilation warning */ 02051 UNUSED(hadc); 02052 02053 /* NOTE : This function should not be modified. When the callback is needed, 02054 function HAL_ADC_ErrorCallback must be implemented in the user file. 02055 */ 02056 } 02057 02058 /** 02059 * @} 02060 */ 02061 02062 /** @defgroup ADC_Exported_Functions_Group3 Peripheral Control functions 02063 * @brief Peripheral Control functions 02064 * 02065 @verbatim 02066 =============================================================================== 02067 ##### Peripheral Control functions ##### 02068 =============================================================================== 02069 [..] This section provides functions allowing to: 02070 (+) Configure channels on regular group 02071 (+) Configure the analog watchdog 02072 02073 @endverbatim 02074 * @{ 02075 */ 02076 02077 02078 /** 02079 * @brief Configure the selected channel to be linked to the regular group. 02080 * @note In case of usage of internal measurement channels (Vbat / VrefInt / 02081 * TempSensor), the recommended sampling time is provided by the 02082 * datasheet. 02083 * These internal paths can be disabled using function 02084 * HAL_ADC_DeInit(). 02085 * @note Possibility to update parameters on the fly: 02086 * HAL_ADC_ConfigChannel() initializes channel into regular group, 02087 * consecutive calls to this function can be used to reconfigure some 02088 * parameters of structure "ADC_ChannelConfTypeDef" on the fly, without 02089 * resetting the ADC. 02090 * The setting of these parameters is conditioned to ADC state. 02091 * For parameters constraints, see comments of structure 02092 * "ADC_ChannelConfTypeDef". 02093 * @param hadc: ADC handle 02094 * @param sConfig: Structure ADC channel for regular group. 02095 * @retval HAL status 02096 */ 02097 HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef* hadc, ADC_ChannelConfTypeDef* sConfig) 02098 { 02099 HAL_StatusTypeDef tmp_status = HAL_OK; 02100 02101 ADC_Common_TypeDef *tmpADC_Common; 02102 uint32_t tmpOffsetShifted; 02103 __IO uint32_t wait_loop_index = 0; 02104 02105 /* Check the parameters */ 02106 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); 02107 assert_param(IS_ADC_REGULAR_RANK(sConfig->Rank)); 02108 assert_param(IS_ADC_SAMPLE_TIME(sConfig->SamplingTime)); 02109 assert_param(IS_ADC_SINGLE_DIFFERENTIAL(sConfig->SingleDiff)); 02110 assert_param(IS_ADC_OFFSET_NUMBER(sConfig->OffsetNumber)); 02111 assert_param(IS_ADC_RANGE(ADC_GET_RESOLUTION(hadc), sConfig->Offset)); 02112 02113 /* if ROVSE is set, the value of the OFFSETy_EN bit in ADCx_OFRy register is 02114 ignored (considered as reset) */ 02115 assert_param(!((sConfig->OffsetNumber != ADC_OFFSET_NONE) && (hadc->Init.OversamplingMode == ENABLE))); 02116 02117 /* Verification of channel number */ 02118 if (sConfig->SingleDiff != ADC_DIFFERENTIAL_ENDED) 02119 { 02120 assert_param(IS_ADC_CHANNEL(hadc, sConfig->Channel)); 02121 } 02122 else 02123 { 02124 assert_param(IS_ADC_DIFF_CHANNEL(hadc, sConfig->Channel)); 02125 } 02126 02127 /* Process locked */ 02128 __HAL_LOCK(hadc); 02129 02130 02131 /* Parameters update conditioned to ADC state: */ 02132 /* Parameters that can be updated when ADC is disabled or enabled without */ 02133 /* conversion on going on regular group: */ 02134 /* - Channel number */ 02135 /* - Channel rank */ 02136 if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) == RESET) 02137 { 02138 02139 /* Regular sequence configuration */ 02140 /* Clear the old SQx bits then set the new ones for the selected rank */ 02141 /* For Rank 1 to 4 */ 02142 if (sConfig->Rank < 5) 02143 { 02144 MODIFY_REG(hadc->Instance->SQR1, 02145 ADC_SQR1_RK(ADC_SQR2_SQ5, sConfig->Rank), 02146 ADC_SQR1_RK(sConfig->Channel, sConfig->Rank)); 02147 } 02148 /* For Rank 5 to 9 */ 02149 else if (sConfig->Rank < 10) 02150 { 02151 MODIFY_REG(hadc->Instance->SQR2, 02152 ADC_SQR2_RK(ADC_SQR2_SQ5, sConfig->Rank), 02153 ADC_SQR2_RK(sConfig->Channel, sConfig->Rank)); 02154 } 02155 /* For Rank 10 to 14 */ 02156 else if (sConfig->Rank < 15) 02157 { 02158 MODIFY_REG(hadc->Instance->SQR3, 02159 ADC_SQR3_RK(ADC_SQR3_SQ10, sConfig->Rank), 02160 ADC_SQR3_RK(sConfig->Channel, sConfig->Rank)); 02161 } 02162 /* For Rank 15 to 16 */ 02163 else 02164 { 02165 MODIFY_REG(hadc->Instance->SQR4, 02166 ADC_SQR4_RK(ADC_SQR4_SQ15, sConfig->Rank), 02167 ADC_SQR4_RK(sConfig->Channel, sConfig->Rank)); 02168 } 02169 02170 02171 /* Parameters update conditioned to ADC state: */ 02172 /* Parameters that can be updated when ADC is disabled or enabled without */ 02173 /* conversion on going on regular group: */ 02174 /* - Channel sampling time */ 02175 /* - Channel offset */ 02176 if (ADC_IS_CONVERSION_ONGOING_REGULAR_INJECTED(hadc) == RESET) 02177 { 02178 02179 /* Channel sampling time configuration */ 02180 /* Clear the old sample time then set the new one for the selected channel */ 02181 /* For channels 10 to 18 */ 02182 if (sConfig->Channel >= ADC_CHANNEL_10) 02183 { 02184 ADC_SMPR2_SETTING(hadc, sConfig->SamplingTime, sConfig->Channel); 02185 } 02186 else /* For channels 0 to 9 */ 02187 { 02188 ADC_SMPR1_SETTING(hadc, sConfig->SamplingTime, sConfig->Channel); 02189 } 02190 02191 02192 /* Configure the offset: offset enable/disable, channel, offset value */ 02193 02194 /* Shift the offset with respect to the selected ADC resolution. */ 02195 /* Offset has to be left-aligned on bit 11, the LSB (right bits) are set to 0 */ 02196 tmpOffsetShifted = ADC_OFFSET_SHIFT_RESOLUTION(hadc, sConfig->Offset); 02197 02198 switch (sConfig->OffsetNumber) 02199 { 02200 /* Configure offset register i when applicable: */ 02201 /* - Enable offset */ 02202 /* - Set channel number */ 02203 /* - Set offset value */ 02204 case ADC_OFFSET_1: 02205 MODIFY_REG(hadc->Instance->OFR1, 02206 ADC_OFR_FIELDS, 02207 ADC_OFR1_OFFSET1_EN | ADC_OFR_CHANNEL(sConfig->Channel) | tmpOffsetShifted); 02208 break; 02209 02210 case ADC_OFFSET_2: 02211 MODIFY_REG(hadc->Instance->OFR2, 02212 ADC_OFR_FIELDS, 02213 ADC_OFR2_OFFSET2_EN | ADC_OFR_CHANNEL(sConfig->Channel) | tmpOffsetShifted); 02214 break; 02215 02216 case ADC_OFFSET_3: 02217 MODIFY_REG(hadc->Instance->OFR3, 02218 ADC_OFR_FIELDS, 02219 ADC_OFR3_OFFSET3_EN | ADC_OFR_CHANNEL(sConfig->Channel) | tmpOffsetShifted); 02220 break; 02221 02222 case ADC_OFFSET_4: 02223 MODIFY_REG(hadc->Instance->OFR4, 02224 ADC_OFR_FIELDS, 02225 ADC_OFR4_OFFSET4_EN | ADC_OFR_CHANNEL(sConfig->Channel) | tmpOffsetShifted); 02226 break; 02227 02228 /* Case ADC_OFFSET_NONE */ 02229 default : 02230 /* Scan OFR1, OFR2, OFR3, OFR4 to check if the selected channel is enabled. 02231 If this is the case, offset OFRx is disabled since 02232 sConfig->OffsetNumber = ADC_OFFSET_NONE. */ 02233 if (((hadc->Instance->OFR1) & ADC_OFR1_OFFSET1_CH) == ADC_OFR_CHANNEL(sConfig->Channel)) 02234 { 02235 CLEAR_BIT(hadc->Instance->OFR1, ADC_OFR1_OFFSET1_EN); 02236 } 02237 if (((hadc->Instance->OFR2) & ADC_OFR2_OFFSET2_CH) == ADC_OFR_CHANNEL(sConfig->Channel)) 02238 { 02239 CLEAR_BIT(hadc->Instance->OFR2, ADC_OFR2_OFFSET2_EN); 02240 } 02241 if (((hadc->Instance->OFR3) & ADC_OFR3_OFFSET3_CH) == ADC_OFR_CHANNEL(sConfig->Channel)) 02242 { 02243 CLEAR_BIT(hadc->Instance->OFR3, ADC_OFR3_OFFSET3_EN); 02244 } 02245 if (((hadc->Instance->OFR4) & ADC_OFR4_OFFSET4_CH) == ADC_OFR_CHANNEL(sConfig->Channel)) 02246 { 02247 CLEAR_BIT(hadc->Instance->OFR4, ADC_OFR4_OFFSET4_EN); 02248 } 02249 break; 02250 } /* switch (sConfig->OffsetNumber) */ 02251 02252 } /* if (ADC_IS_CONVERSION_ONGOING_REGULAR_INJECTED(hadc) == RESET) */ 02253 02254 02255 02256 /* Parameters update conditioned to ADC state: */ 02257 /* Parameters that can be updated only when ADC is disabled: */ 02258 /* - Single or differential mode */ 02259 /* - Internal measurement channels: Vbat/VrefInt/TempSensor */ 02260 if (ADC_IS_ENABLE(hadc) == RESET) 02261 { 02262 /* Configuration of differential mode */ 02263 if (sConfig->SingleDiff != ADC_DIFFERENTIAL_ENDED) 02264 { 02265 /* Disable differential mode (default mode: single-ended) */ 02266 CLEAR_BIT(hadc->Instance->DIFSEL, ADC_DIFSEL_CHANNEL(sConfig->Channel)); 02267 } 02268 else 02269 { 02270 /* Enable differential mode */ 02271 SET_BIT(hadc->Instance->DIFSEL, ADC_DIFSEL_CHANNEL(sConfig->Channel)); 02272 02273 /* Sampling time configuration of channel ADC_IN+1 (negative input) */ 02274 /* Clear the old sample time then set the new one for the selected */ 02275 /* channel. */ 02276 /* Starting from channel 9, SMPR2 register must be configured */ 02277 if (sConfig->Channel >= ADC_CHANNEL_9) 02278 { 02279 ADC_SMPR2_SETTING(hadc, sConfig->SamplingTime, sConfig->Channel+1); 02280 } 02281 else /* For channels 0 to 8, SMPR1 must be configured */ 02282 { 02283 ADC_SMPR1_SETTING(hadc, sConfig->SamplingTime, sConfig->Channel+1); 02284 } 02285 } 02286 02287 02288 02289 /* Management of internal measurement channels: Vbat/VrefInt/TempSensor. */ 02290 /* If internal channel selected, enable dedicated internal buffers and */ 02291 /* paths. */ 02292 /* Note: these internal measurement paths can be disabled using */ 02293 /* HAL_ADC_DeInit(). */ 02294 02295 /* Configuration of common ADC parameters */ 02296 tmpADC_Common = ADC_COMMON_REGISTER(hadc); 02297 02298 02299 /* If the requested internal measurement path has already been enabled, */ 02300 /* bypass the configuration processing. */ 02301 if (( (sConfig->Channel == ADC_CHANNEL_TEMPSENSOR) && 02302 (HAL_IS_BIT_CLR(tmpADC_Common->CCR, ADC_CCR_TSEN)) ) || 02303 ( (sConfig->Channel == ADC_CHANNEL_VBAT) && 02304 (HAL_IS_BIT_CLR(tmpADC_Common->CCR, ADC_CCR_VBATEN)) ) || 02305 ( (sConfig->Channel == ADC_CHANNEL_VREFINT) && 02306 (HAL_IS_BIT_CLR(tmpADC_Common->CCR, ADC_CCR_VREFEN))) 02307 ) 02308 { 02309 /* Configuration of common ADC parameters (continuation) */ 02310 02311 /* Software is allowed to change common parameters only when all ADCs */ 02312 /* of the common group are disabled. */ 02313 if ((ADC_IS_ENABLE(hadc) == RESET) && 02314 (ADC_ANY_OTHER_ENABLED(hadc) == RESET) ) 02315 { 02316 if (sConfig->Channel == ADC_CHANNEL_TEMPSENSOR) 02317 { 02318 if (ADC_TEMPERATURE_SENSOR_INSTANCE(hadc)) 02319 { 02320 SET_BIT(tmpADC_Common->CCR, ADC_CCR_TSEN); 02321 02322 /* Delay for temperature sensor stabilization time */ 02323 /* Wait loop initialization and execution */ 02324 /* Note: Variable divided by 2 to compensate partially */ 02325 /* CPU processing cycles. */ 02326 wait_loop_index = (ADC_TEMPSENSOR_DELAY_US * (SystemCoreClock / (1000000 * 2))); 02327 while(wait_loop_index != 0) 02328 { 02329 wait_loop_index--; 02330 } 02331 } 02332 } 02333 else if (sConfig->Channel == ADC_CHANNEL_VBAT) 02334 { 02335 if (ADC_BATTERY_VOLTAGE_INSTANCE(hadc)) 02336 { 02337 SET_BIT(tmpADC_Common->CCR, ADC_CCR_VBATEN); 02338 } 02339 } 02340 else if (sConfig->Channel == ADC_CHANNEL_VREFINT) 02341 { 02342 if (ADC_VREFINT_INSTANCE(hadc)) 02343 { 02344 SET_BIT(tmpADC_Common->CCR, ADC_CCR_VREFEN); 02345 } 02346 } 02347 } 02348 /* If the requested internal measurement path has already been */ 02349 /* enabled and other ADC of the common group are enabled, internal */ 02350 /* measurement paths cannot be enabled. */ 02351 else 02352 { 02353 /* Update ADC state machine to error */ 02354 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG); 02355 02356 tmp_status = HAL_ERROR; 02357 } 02358 } 02359 02360 } /* if (ADC_IS_ENABLE(hadc) == RESET) */ 02361 02362 } /* if (ADC_IS_CONVERSION_ONGOING_REGULAR(hadc) == RESET) */ 02363 02364 /* If a conversion is on going on regular group, no update on regular */ 02365 /* channel could be done on neither of the channel configuration structure */ 02366 /* parameters. */ 02367 else 02368 { 02369 /* Update ADC state machine to error */ 02370 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG); 02371 02372 tmp_status = HAL_ERROR; 02373 } 02374 02375 /* Process unlocked */ 02376 __HAL_UNLOCK(hadc); 02377 02378 /* Return function status */ 02379 return tmp_status; 02380 } 02381 02382 02383 02384 /** 02385 * @brief Configure the analog watchdog. 02386 * @note Possibility to update parameters on the fly: 02387 * This function initializes the selected analog watchdog, successive 02388 * calls to this function can be used to reconfigure some parameters 02389 * of structure "ADC_AnalogWDGConfTypeDef" on the fly, without resetting 02390 * the ADC, e.g. to set several channels to monitor simultaneously. 02391 * The setting of these parameters is conditioned to ADC state. 02392 * For parameters constraints, see comments of structure 02393 * "ADC_AnalogWDGConfTypeDef". 02394 * @param hadc: ADC handle 02395 * @param AnalogWDGConfig: Structure of ADC analog watchdog configuration 02396 * @retval HAL status 02397 */ 02398 HAL_StatusTypeDef HAL_ADC_AnalogWDGConfig(ADC_HandleTypeDef* hadc, ADC_AnalogWDGConfTypeDef* AnalogWDGConfig) 02399 { 02400 HAL_StatusTypeDef tmp_status = HAL_OK; 02401 02402 02403 uint32_t tmpAWDHighThresholdShifted; 02404 uint32_t tmpAWDLowThresholdShifted; 02405 02406 uint32_t tmpADCFlagAWD2orAWD3; 02407 uint32_t tmpADCITAWD2orAWD3; 02408 02409 /* Check the parameters */ 02410 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); 02411 assert_param(IS_ADC_ANALOG_WATCHDOG_NUMBER(AnalogWDGConfig->WatchdogNumber)); 02412 assert_param(IS_ADC_ANALOG_WATCHDOG_MODE(AnalogWDGConfig->WatchdogMode)); 02413 assert_param(IS_FUNCTIONAL_STATE(AnalogWDGConfig->ITMode)); 02414 02415 if((AnalogWDGConfig->WatchdogMode == ADC_ANALOGWATCHDOG_SINGLE_REG) || 02416 (AnalogWDGConfig->WatchdogMode == ADC_ANALOGWATCHDOG_SINGLE_INJEC) || 02417 (AnalogWDGConfig->WatchdogMode == ADC_ANALOGWATCHDOG_SINGLE_REGINJEC) ) 02418 { 02419 assert_param(IS_ADC_CHANNEL(hadc, AnalogWDGConfig->Channel)); 02420 } 02421 02422 02423 /* Verify if threshold is within the selected ADC resolution */ 02424 assert_param(IS_ADC_RANGE(ADC_GET_RESOLUTION(hadc), AnalogWDGConfig->HighThreshold)); 02425 assert_param(IS_ADC_RANGE(ADC_GET_RESOLUTION(hadc), AnalogWDGConfig->LowThreshold)); 02426 02427 /* Process locked */ 02428 __HAL_LOCK(hadc); 02429 02430 /* Parameters update conditioned to ADC state: */ 02431 /* Parameters that can be updated when ADC is disabled or enabled without */ 02432 /* conversion on going on regular and injected groups: */ 02433 /* - Analog watchdog channels */ 02434 /* - Analog watchdog thresholds */ 02435 if (ADC_IS_CONVERSION_ONGOING_REGULAR_INJECTED(hadc) == RESET) 02436 { 02437 02438 /* Analog watchdogs configuration */ 02439 if(AnalogWDGConfig->WatchdogNumber == ADC_ANALOGWATCHDOG_1) 02440 { 02441 /* Configuration of analog watchdog: */ 02442 /* - Set the analog watchdog enable mode: regular and/or injected */ 02443 /* groups, one or overall group of channels. */ 02444 /* - Set the Analog watchdog channel (is not used if watchdog */ 02445 /* mode "all channels": ADC_CFGR_AWD1SGL=0). */ 02446 02447 MODIFY_REG(hadc->Instance->CFGR, ADC_CFGR_WD_FIELDS, 02448 AnalogWDGConfig->WatchdogMode | ADC_CFGR_SET_AWD1CH(AnalogWDGConfig->Channel) ); 02449 02450 /* Shift the offset with respect to the selected ADC resolution: */ 02451 /* Thresholds have to be left-aligned on bit 11, the LSB (right bits) */ 02452 /* are set to 0 */ 02453 tmpAWDHighThresholdShifted = ADC_AWD1THRESHOLD_SHIFT_RESOLUTION(hadc, AnalogWDGConfig->HighThreshold); 02454 tmpAWDLowThresholdShifted = ADC_AWD1THRESHOLD_SHIFT_RESOLUTION(hadc, AnalogWDGConfig->LowThreshold); 02455 02456 /* Set the high and low thresholds */ 02457 MODIFY_REG(hadc->Instance->TR1, ADC_TR1_HT1 | ADC_TR1_LT1, 02458 ADC_TRX_HIGHTHRESHOLD (tmpAWDHighThresholdShifted) | tmpAWDLowThresholdShifted ); 02459 02460 /* Clear the ADC Analog watchdog flag (in case left enabled by */ 02461 /* previous ADC operations) to be ready to use for HAL_ADC_IRQHandler() */ 02462 /* or HAL_ADC_PollForEvent(). */ 02463 __HAL_ADC_CLEAR_FLAG(hadc, ADC_IT_AWD1); 02464 02465 /* Configure ADC Analog watchdog interrupt */ 02466 if(AnalogWDGConfig->ITMode == ENABLE) 02467 { 02468 /* Enable the ADC Analog watchdog interrupt */ 02469 __HAL_ADC_ENABLE_IT(hadc, ADC_IT_AWD1); 02470 } 02471 else 02472 { 02473 /* Disable the ADC Analog watchdog interrupt */ 02474 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_AWD1); 02475 } 02476 02477 /* Update state, clear previous result related to AWD1 */ 02478 CLEAR_BIT(hadc->State, HAL_ADC_STATE_AWD1); 02479 } 02480 /* Case of ADC_ANALOGWATCHDOG_2 and ADC_ANALOGWATCHDOG_3 */ 02481 else 02482 { 02483 /* Shift the threshold with respect to the selected ADC resolution */ 02484 /* have to be left-aligned on bit 7, the LSB (right bits) are set to 0 */ 02485 tmpAWDHighThresholdShifted = ADC_AWD23THRESHOLD_SHIFT_RESOLUTION(hadc, AnalogWDGConfig->HighThreshold); 02486 tmpAWDLowThresholdShifted = ADC_AWD23THRESHOLD_SHIFT_RESOLUTION(hadc, AnalogWDGConfig->LowThreshold); 02487 02488 if (AnalogWDGConfig->WatchdogNumber == ADC_ANALOGWATCHDOG_2) 02489 { 02490 /* Set the Analog watchdog channel or group of channels. This also */ 02491 /* enables the watchdog. */ 02492 /* Note: Conditional register reset, because several channels can be */ 02493 /* set by successive calls of this function. */ 02494 if (AnalogWDGConfig->WatchdogMode != ADC_ANALOGWATCHDOG_NONE) 02495 { 02496 SET_BIT(hadc->Instance->AWD2CR, ADC_CFGR_SET_AWD23CR(AnalogWDGConfig->Channel)); 02497 } 02498 else 02499 { 02500 CLEAR_BIT(hadc->Instance->AWD2CR, ADC_AWD2CR_AWD2CH); 02501 } 02502 02503 /* Set the high and low thresholds */ 02504 MODIFY_REG(hadc->Instance->TR2, ADC_TR2_HT2 | ADC_TR2_LT2, 02505 ADC_TRX_HIGHTHRESHOLD (tmpAWDHighThresholdShifted) | tmpAWDLowThresholdShifted ); 02506 02507 /* Set temporary variable to flag and IT of AWD2 or AWD3 for further */ 02508 /* settings. */ 02509 tmpADCFlagAWD2orAWD3 = ADC_FLAG_AWD2; 02510 tmpADCITAWD2orAWD3 = ADC_IT_AWD2; 02511 02512 /* Update state, clear previous result related to AWD2 */ 02513 CLEAR_BIT(hadc->State, HAL_ADC_STATE_AWD2); 02514 } 02515 /* (AnalogWDGConfig->WatchdogNumber == ADC_ANALOGWATCHDOG_3) */ 02516 else 02517 { 02518 /* Set the Analog watchdog channel or group of channels. This also */ 02519 /* enables the watchdog. */ 02520 /* Note: Conditional register reset, because several channels can be */ 02521 /* set by successive calls of this function. */ 02522 if (AnalogWDGConfig->WatchdogMode != ADC_ANALOGWATCHDOG_NONE) 02523 { 02524 SET_BIT(hadc->Instance->AWD3CR, ADC_CFGR_SET_AWD23CR(AnalogWDGConfig->Channel)); 02525 } 02526 else 02527 { 02528 CLEAR_BIT(hadc->Instance->AWD3CR, ADC_AWD3CR_AWD3CH); 02529 } 02530 02531 /* Set the high and low thresholds */ 02532 MODIFY_REG(hadc->Instance->TR3, ADC_TR3_HT3 | ADC_TR3_LT3, 02533 ADC_TRX_HIGHTHRESHOLD (tmpAWDHighThresholdShifted) | tmpAWDLowThresholdShifted ); 02534 02535 /* Set temporary variable to flag and IT of AWD2 or AWD3 for further */ 02536 /* settings. */ 02537 tmpADCFlagAWD2orAWD3 = ADC_FLAG_AWD3; 02538 tmpADCITAWD2orAWD3 = ADC_IT_AWD3; 02539 02540 /* Update state, clear previous result related to AWD3 */ 02541 CLEAR_BIT(hadc->State, HAL_ADC_STATE_AWD3); 02542 } 02543 02544 /* Clear the ADC Analog watchdog flag (in case left enabled by */ 02545 /* previous ADC operations) to be ready to use for HAL_ADC_IRQHandler() */ 02546 /* or HAL_ADC_PollForEvent(). */ 02547 __HAL_ADC_CLEAR_FLAG(hadc, tmpADCFlagAWD2orAWD3); 02548 02549 /* Configure ADC Analog watchdog interrupt */ 02550 if(AnalogWDGConfig->ITMode == ENABLE) 02551 { 02552 __HAL_ADC_ENABLE_IT(hadc, tmpADCITAWD2orAWD3); 02553 } 02554 else 02555 { 02556 __HAL_ADC_DISABLE_IT(hadc, tmpADCITAWD2orAWD3); 02557 } 02558 } 02559 02560 } 02561 /* If a conversion is on going on regular or injected groups, no update */ 02562 /* could be done on neither of the AWD configuration structure parameters. */ 02563 else 02564 { 02565 /* Update ADC state machine to error */ 02566 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG); 02567 02568 tmp_status = HAL_ERROR; 02569 } 02570 02571 02572 /* Process unlocked */ 02573 __HAL_UNLOCK(hadc); 02574 02575 02576 /* Return function status */ 02577 return tmp_status; 02578 } 02579 02580 02581 /** 02582 * @} 02583 */ 02584 02585 /** @defgroup ADC_Exported_Functions_Group4 Peripheral State functions 02586 * @brief ADC Peripheral State functions 02587 * 02588 @verbatim 02589 =============================================================================== 02590 ##### Peripheral state and errors functions ##### 02591 =============================================================================== 02592 [..] 02593 This subsection provides functions to get in run-time the status of the 02594 peripheral. 02595 (+) Check the ADC state 02596 (+) Check the ADC error code 02597 02598 @endverbatim 02599 * @{ 02600 */ 02601 02602 /** 02603 * @brief Return the ADC handle state. 02604 * @param hadc: ADC handle 02605 * @retval HAL state (uint32_t bit-map) 02606 */ 02607 uint32_t HAL_ADC_GetState(ADC_HandleTypeDef* hadc) 02608 { 02609 /* Check the parameters */ 02610 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); 02611 02612 /* Return ADC handle state */ 02613 return hadc->State; 02614 } 02615 02616 02617 /** 02618 * @brief Return the ADC error code. 02619 * @param hadc: ADC handle 02620 * @retval ADC Error Code (uint32_t bit-map) 02621 */ 02622 uint32_t HAL_ADC_GetError(ADC_HandleTypeDef *hadc) 02623 { 02624 /* Check the parameters */ 02625 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); 02626 02627 return hadc->ErrorCode; 02628 } 02629 02630 /** 02631 * @} 02632 */ 02633 02634 /** 02635 * @} 02636 */ 02637 02638 02639 02640 /** @defgroup ADC_Private_Functions ADC Private Functions 02641 * @{ 02642 */ 02643 02644 /** 02645 * @brief Stop ADC conversion. 02646 * @param hadc: ADC handle 02647 * @param ConversionGroup: ADC group regular and/or injected. 02648 * This parameter can be one of the following values: 02649 * @arg @ref ADC_REGULAR_GROUP ADC regular conversion type. 02650 * @arg @ref ADC_INJECTED_GROUP ADC injected conversion type. 02651 * @arg @ref ADC_REGULAR_INJECTED_GROUP ADC regular and injected conversion type. 02652 * @retval HAL status. 02653 */ 02654 HAL_StatusTypeDef ADC_ConversionStop(ADC_HandleTypeDef* hadc, uint32_t ConversionGroup) 02655 { 02656 uint32_t tmp_ADC_CR_ADSTART_JADSTART = 0; 02657 uint32_t tickstart = 0; 02658 uint32_t Conversion_Timeout_CPU_cycles = 0; 02659 02660 /* Check the parameters */ 02661 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance)); 02662 assert_param(IS_ADC_CONVERSION_GROUP(ConversionGroup)); 02663 02664 /* Verification if ADC is not already stopped (on regular and injected */ 02665 /* groups) to bypass this function if not needed. */ 02666 if (ADC_IS_CONVERSION_ONGOING_REGULAR_INJECTED(hadc)) 02667 { 02668 /* Particular case of continuous auto-injection mode combined with */ 02669 /* auto-delay mode. */ 02670 /* In auto-injection mode, regular group stop ADC_CR_ADSTP is used (not */ 02671 /* injected group stop ADC_CR_JADSTP). */ 02672 /* Procedure to be followed: Wait until JEOS=1, clear JEOS, set ADSTP=1 */ 02673 /* (see reference manual). */ 02674 if ((HAL_IS_BIT_SET(hadc->Instance->CFGR, ADC_CFGR_JAUTO)) 02675 && (hadc->Init.ContinuousConvMode==ENABLE) 02676 && (hadc->Init.LowPowerAutoWait==ENABLE)) 02677 { 02678 /* Use stop of regular group */ 02679 ConversionGroup = ADC_REGULAR_GROUP; 02680 02681 /* Wait until JEOS=1 (maximum Timeout: 4 injected conversions) */ 02682 while(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_JEOS) == RESET) 02683 { 02684 if (Conversion_Timeout_CPU_cycles >= (ADC_CONVERSION_TIME_MAX_CPU_CYCLES *4)) 02685 { 02686 /* Update ADC state machine to error */ 02687 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL); 02688 02689 /* Set ADC error code to ADC IP internal error */ 02690 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL); 02691 02692 return HAL_ERROR; 02693 } 02694 Conversion_Timeout_CPU_cycles ++; 02695 } 02696 02697 /* Clear JEOS */ 02698 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JEOS); 02699 } 02700 02701 /* Stop potential conversion on going on regular group */ 02702 if (ConversionGroup != ADC_INJECTED_GROUP) 02703 { 02704 /* Software is allowed to set ADSTP only when ADSTART=1 and ADDIS=0 */ 02705 if (HAL_IS_BIT_SET(hadc->Instance->CR, ADC_CR_ADSTART) && 02706 HAL_IS_BIT_CLR(hadc->Instance->CR, ADC_CR_ADDIS) ) 02707 { 02708 /* Stop conversions on regular group */ 02709 SET_BIT(hadc->Instance->CR, ADC_CR_ADSTP); 02710 } 02711 } 02712 02713 /* Stop potential conversion on going on injected group */ 02714 if (ConversionGroup != ADC_REGULAR_GROUP) 02715 { 02716 /* Software is allowed to set JADSTP only when JADSTART=1 and ADDIS=0 */ 02717 if (HAL_IS_BIT_SET(hadc->Instance->CR, ADC_CR_JADSTART) && 02718 HAL_IS_BIT_CLR(hadc->Instance->CR, ADC_CR_ADDIS) ) 02719 { 02720 /* Stop conversions on injected group */ 02721 SET_BIT(hadc->Instance->CR, ADC_CR_JADSTP); 02722 } 02723 } 02724 02725 /* Selection of start and stop bits with respect to the regular or injected group */ 02726 switch(ConversionGroup) 02727 { 02728 case ADC_REGULAR_INJECTED_GROUP: 02729 tmp_ADC_CR_ADSTART_JADSTART = (ADC_CR_ADSTART | ADC_CR_JADSTART); 02730 break; 02731 case ADC_INJECTED_GROUP: 02732 tmp_ADC_CR_ADSTART_JADSTART = ADC_CR_JADSTART; 02733 break; 02734 /* Case ADC_REGULAR_GROUP only*/ 02735 default: 02736 tmp_ADC_CR_ADSTART_JADSTART = ADC_CR_ADSTART; 02737 break; 02738 } 02739 02740 /* Wait for conversion effectively stopped */ 02741 02742 02743 tickstart = HAL_GetTick(); 02744 02745 while((hadc->Instance->CR & tmp_ADC_CR_ADSTART_JADSTART) != RESET) 02746 { 02747 if((HAL_GetTick()-tickstart) > ADC_STOP_CONVERSION_TIMEOUT) 02748 { 02749 /* Update ADC state machine to error */ 02750 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL); 02751 02752 /* Set ADC error code to ADC IP internal error */ 02753 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL); 02754 02755 return HAL_ERROR; 02756 } 02757 } 02758 02759 } /* if (ADC_IS_CONVERSION_ONGOING_REGULAR_INJECTED(hadc)) */ 02760 02761 /* Return HAL status */ 02762 return HAL_OK; 02763 } 02764 02765 02766 02767 /** 02768 * @brief Enable the selected ADC. 02769 * @note Prerequisite condition to use this function: ADC must be disabled 02770 * and voltage regulator must be enabled (done into HAL_ADC_Init()). 02771 * @param hadc: ADC handle 02772 * @retval HAL status. 02773 */ 02774 HAL_StatusTypeDef ADC_Enable(ADC_HandleTypeDef* hadc) 02775 { 02776 uint32_t tickstart = 0; 02777 02778 /* ADC enable and wait for ADC ready (in case of ADC is disabled or */ 02779 /* enabling phase not yet completed: flag ADC ready not set yet). */ 02780 /* Timeout implemented not to be stuck if ADC cannot be enabled (possible */ 02781 /* causes: ADC clock not running, ...). */ 02782 if (ADC_IS_ENABLE(hadc) == RESET) 02783 { 02784 /* Check if conditions to enable the ADC are fulfilled */ 02785 if (ADC_ENABLING_CONDITIONS(hadc) == RESET) 02786 { 02787 /* Update ADC state machine to error */ 02788 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL); 02789 02790 /* Set ADC error code to ADC IP internal error */ 02791 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL); 02792 02793 return HAL_ERROR; 02794 } 02795 02796 /* Enable the ADC peripheral */ 02797 ADC_ENABLE(hadc); 02798 02799 02800 /* Wait for ADC effectively enabled */ 02801 tickstart = HAL_GetTick(); 02802 02803 while(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_RDY) == RESET) 02804 { 02805 /* If ADEN bit is set less than 4 ADC clock cycles after the ADCAL bit 02806 has been cleared (after a calibration), ADEN bit is reset by the 02807 calibration logic. 02808 The workaround is to continue setting ADEN until ADRDY is becomes 1. 02809 Additionally, ADC_ENABLE_TIMEOUT is defined to encompass this 02810 4 ADC clock cycle duration */ 02811 ADC_ENABLE(hadc); 02812 02813 if((HAL_GetTick()-tickstart) > ADC_ENABLE_TIMEOUT) 02814 { 02815 /* Update ADC state machine to error */ 02816 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL); 02817 02818 /* Set ADC error code to ADC IP internal error */ 02819 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL); 02820 02821 return HAL_ERROR; 02822 } 02823 } 02824 } 02825 02826 /* Return HAL status */ 02827 return HAL_OK; 02828 } 02829 02830 /** 02831 * @brief Disable the selected ADC. 02832 * @note Prerequisite condition to use this function: ADC conversions must be 02833 * stopped. 02834 * @param hadc: ADC handle 02835 * @retval HAL status. 02836 */ 02837 HAL_StatusTypeDef ADC_Disable(ADC_HandleTypeDef* hadc) 02838 { 02839 uint32_t tickstart = 0; 02840 02841 /* Verification if ADC is not already disabled: */ 02842 /* Note: forbidden to disable ADC (set bit ADC_CR_ADDIS) if ADC is already */ 02843 /* disabled. */ 02844 if (ADC_IS_ENABLE(hadc) != RESET ) 02845 { 02846 /* Check if conditions to disable the ADC are fulfilled */ 02847 if (ADC_DISABLING_CONDITIONS(hadc) != RESET) 02848 { 02849 /* Disable the ADC peripheral */ 02850 ADC_DISABLE(hadc); 02851 } 02852 else 02853 { 02854 /* Update ADC state machine to error */ 02855 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL); 02856 02857 /* Set ADC error code to ADC IP internal error */ 02858 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL); 02859 02860 return HAL_ERROR; 02861 } 02862 02863 /* Wait for ADC effectively disabled */ 02864 tickstart = HAL_GetTick(); 02865 02866 while(HAL_IS_BIT_SET(hadc->Instance->CR, ADC_CR_ADEN)) 02867 { 02868 if((HAL_GetTick()-tickstart) > ADC_DISABLE_TIMEOUT) 02869 { 02870 /* Update ADC state machine to error */ 02871 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL); 02872 02873 /* Set ADC error code to ADC IP internal error */ 02874 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_INTERNAL); 02875 02876 return HAL_ERROR; 02877 } 02878 } 02879 } 02880 02881 /* Return HAL status */ 02882 return HAL_OK; 02883 } 02884 02885 02886 /** 02887 * @brief DMA transfer complete callback. 02888 * @param hdma: pointer to DMA handle. 02889 * @retval None 02890 */ 02891 void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma) 02892 { 02893 /* Retrieve ADC handle corresponding to current DMA handle */ 02894 ADC_HandleTypeDef* hadc = ( ADC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; 02895 02896 /* Update state machine on conversion status if not in error state */ 02897 if (HAL_IS_BIT_CLR(hadc->State, (HAL_ADC_STATE_ERROR_INTERNAL|HAL_ADC_STATE_ERROR_DMA))) 02898 { 02899 /* Update ADC state machine */ 02900 SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC); 02901 /* Is it the end of the regular sequence ? */ 02902 if (HAL_IS_BIT_SET(hadc->Instance->ISR, ADC_FLAG_EOS)) 02903 { 02904 /* Are conversions software-triggered ? */ 02905 if(ADC_IS_SOFTWARE_START_REGULAR(hadc)) 02906 { 02907 /* Is CONT bit set ? */ 02908 if (READ_BIT(hadc->Instance->CFGR, ADC_CFGR_CONT) == RESET) 02909 { 02910 /* CONT bit is not set, no more conversions expected */ 02911 CLEAR_BIT(hadc->State, HAL_ADC_STATE_REG_BUSY); 02912 if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_INJ_BUSY)) 02913 { 02914 SET_BIT(hadc->State, HAL_ADC_STATE_READY); 02915 } 02916 } 02917 } 02918 } 02919 else 02920 { 02921 /* DMA End of Transfer interrupt was triggered but conversions sequence 02922 is not over. If DMACFG is set to 0, conversions are stopped. */ 02923 if (READ_BIT(hadc->Instance->CFGR, ADC_CFGR_DMACFG) == RESET) 02924 { 02925 /* DMACFG bit is not set, conversions are stopped. */ 02926 CLEAR_BIT(hadc->State, HAL_ADC_STATE_REG_BUSY); 02927 if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_INJ_BUSY)) 02928 { 02929 SET_BIT(hadc->State, HAL_ADC_STATE_READY); 02930 } 02931 } 02932 } 02933 02934 /* Conversion complete callback */ 02935 HAL_ADC_ConvCpltCallback(hadc); 02936 } 02937 else /* DMA or internal error occurred (or both) */ 02938 { 02939 /* In case of internal error, */ 02940 if (HAL_IS_BIT_SET(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL)) 02941 { 02942 /* call Error Callback function */ 02943 HAL_ADC_ErrorCallback(hadc); 02944 } 02945 02946 } 02947 02948 02949 } 02950 02951 /** 02952 * @brief DMA half transfer complete callback. 02953 * @param hdma: pointer to DMA handle. 02954 * @retval None 02955 */ 02956 void ADC_DMAHalfConvCplt(DMA_HandleTypeDef *hdma) 02957 { 02958 /* Retrieve ADC handle corresponding to current DMA handle */ 02959 ADC_HandleTypeDef* hadc = ( ADC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; 02960 02961 /* Half conversion callback */ 02962 HAL_ADC_ConvHalfCpltCallback(hadc); 02963 } 02964 02965 /** 02966 * @brief DMA error callback. 02967 * @param hdma: pointer to DMA handle. 02968 * @retval None 02969 */ 02970 void ADC_DMAError(DMA_HandleTypeDef *hdma) 02971 { 02972 /* Retrieve ADC handle corresponding to current DMA handle */ 02973 ADC_HandleTypeDef* hadc = ( ADC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; 02974 02975 /* Change ADC state */ 02976 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_DMA); 02977 02978 /* Set ADC error code to DMA error */ 02979 SET_BIT(hadc->ErrorCode, HAL_ADC_ERROR_DMA); 02980 02981 /* Error callback */ 02982 HAL_ADC_ErrorCallback(hadc); 02983 } 02984 02985 02986 /** 02987 * @} 02988 */ 02989 02990 02991 #endif /* HAL_ADC_MODULE_ENABLED */ 02992 /** 02993 * @} 02994 */ 02995 02996 /** 02997 * @} 02998 */ 02999 03000 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Generated on Tue Jul 12 2022 10:59:57 by
