mbed library sources

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Fri Nov 07 15:45:07 2014 +0000
Revision:
394:83f921546702
Parent:
targets/cmsis/TARGET_STM/TARGET_NUCLEO_L152RE/stm32l1xx_hal_adc_ex.c@354:e67efb2aab0e
Synchronized with git revision aab52cb7ec5a665869e507dd988bbfd55b7e087e

Full URL: https://github.com/mbedmicro/mbed/commit/aab52cb7ec5a665869e507dd988bbfd55b7e087e/

Tests: Fix cpputest testrunner

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 354:e67efb2aab0e 1 /**
mbed_official 354:e67efb2aab0e 2 ******************************************************************************
mbed_official 354:e67efb2aab0e 3 * @file stm32l1xx_hal_adc_ex.c
mbed_official 354:e67efb2aab0e 4 * @author MCD Application Team
mbed_official 354:e67efb2aab0e 5 * @version V1.0.0
mbed_official 354:e67efb2aab0e 6 * @date 5-September-2014
mbed_official 354:e67efb2aab0e 7 * @brief This file provides firmware functions to manage the following
mbed_official 354:e67efb2aab0e 8 * functionalities of the Analog to Digital Convertor (ADC)
mbed_official 354:e67efb2aab0e 9 * peripheral:
mbed_official 354:e67efb2aab0e 10 * + Initialization and de-initialization functions
mbed_official 354:e67efb2aab0e 11 * ++ Initialization and Configuration of ADC
mbed_official 354:e67efb2aab0e 12 * + Operation functions
mbed_official 354:e67efb2aab0e 13 * ++ Start, stop, get result of conversions of regular
mbed_official 354:e67efb2aab0e 14 * group, using 3 possible modes: polling, interruption or DMA.
mbed_official 354:e67efb2aab0e 15 * + Control functions
mbed_official 354:e67efb2aab0e 16 * ++ Analog Watchdog configuration
mbed_official 354:e67efb2aab0e 17 * ++ Channels configuration on regular group
mbed_official 354:e67efb2aab0e 18 * + State functions
mbed_official 354:e67efb2aab0e 19 * ++ ADC state machine management
mbed_official 354:e67efb2aab0e 20 * ++ Interrupts and flags management
mbed_official 354:e67efb2aab0e 21 * Other functions (generic functions) are available in file
mbed_official 354:e67efb2aab0e 22 * "stm32l1xx_hal_adc.c".
mbed_official 354:e67efb2aab0e 23 *
mbed_official 354:e67efb2aab0e 24 @verbatim
mbed_official 354:e67efb2aab0e 25 ==============================================================================
mbed_official 354:e67efb2aab0e 26 ##### How to use this driver #####
mbed_official 354:e67efb2aab0e 27 ==============================================================================
mbed_official 354:e67efb2aab0e 28 [..]
mbed_official 354:e67efb2aab0e 29
mbed_official 354:e67efb2aab0e 30 (#) Activate the ADC peripheral using one of the start functions:
mbed_official 354:e67efb2aab0e 31 HAL_ADCEx_InjectedStart(), HAL_ADCEx_InjectedStart_IT().
mbed_official 354:e67efb2aab0e 32
mbed_official 354:e67efb2aab0e 33 *** Channels configuration to injected group ***
mbed_official 354:e67efb2aab0e 34 ================================================
mbed_official 354:e67efb2aab0e 35 [..]
mbed_official 354:e67efb2aab0e 36 (+) To configure the ADC Injected channels group features, use
mbed_official 354:e67efb2aab0e 37 HAL_ADCEx_InjectedConfigChannel() functions.
mbed_official 354:e67efb2aab0e 38 (+) To activate the continuous mode, use the HAL_ADC_Init() function.
mbed_official 354:e67efb2aab0e 39 (+) To read the ADC converted values, use the HAL_ADCEx_InjectedGetValue()
mbed_official 354:e67efb2aab0e 40 function.
mbed_official 354:e67efb2aab0e 41
mbed_official 354:e67efb2aab0e 42 @endverbatim
mbed_official 354:e67efb2aab0e 43 ******************************************************************************
mbed_official 354:e67efb2aab0e 44 * @attention
mbed_official 354:e67efb2aab0e 45 *
mbed_official 354:e67efb2aab0e 46 * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
mbed_official 354:e67efb2aab0e 47 *
mbed_official 354:e67efb2aab0e 48 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 354:e67efb2aab0e 49 * are permitted provided that the following conditions are met:
mbed_official 354:e67efb2aab0e 50 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 354:e67efb2aab0e 51 * this list of conditions and the following disclaimer.
mbed_official 354:e67efb2aab0e 52 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 354:e67efb2aab0e 53 * this list of conditions and the following disclaimer in the documentation
mbed_official 354:e67efb2aab0e 54 * and/or other materials provided with the distribution.
mbed_official 354:e67efb2aab0e 55 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 354:e67efb2aab0e 56 * may be used to endorse or promote products derived from this software
mbed_official 354:e67efb2aab0e 57 * without specific prior written permission.
mbed_official 354:e67efb2aab0e 58 *
mbed_official 354:e67efb2aab0e 59 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 354:e67efb2aab0e 60 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 354:e67efb2aab0e 61 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 354:e67efb2aab0e 62 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 354:e67efb2aab0e 63 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 354:e67efb2aab0e 64 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 354:e67efb2aab0e 65 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 354:e67efb2aab0e 66 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 354:e67efb2aab0e 67 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 354:e67efb2aab0e 68 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 354:e67efb2aab0e 69 *
mbed_official 354:e67efb2aab0e 70 ******************************************************************************
mbed_official 354:e67efb2aab0e 71 */
mbed_official 354:e67efb2aab0e 72
mbed_official 354:e67efb2aab0e 73 /* Includes ------------------------------------------------------------------*/
mbed_official 354:e67efb2aab0e 74 #include "stm32l1xx_hal.h"
mbed_official 354:e67efb2aab0e 75
mbed_official 354:e67efb2aab0e 76 /** @addtogroup STM32L1xx_HAL_Driver
mbed_official 354:e67efb2aab0e 77 * @{
mbed_official 354:e67efb2aab0e 78 */
mbed_official 354:e67efb2aab0e 79
mbed_official 354:e67efb2aab0e 80 /** @defgroup ADCEx ADCEx
mbed_official 354:e67efb2aab0e 81 * @brief ADC HAL module driver
mbed_official 354:e67efb2aab0e 82 * @{
mbed_official 354:e67efb2aab0e 83 */
mbed_official 354:e67efb2aab0e 84
mbed_official 354:e67efb2aab0e 85 #ifdef HAL_ADC_MODULE_ENABLED
mbed_official 354:e67efb2aab0e 86
mbed_official 354:e67efb2aab0e 87 /* Private typedef -----------------------------------------------------------*/
mbed_official 354:e67efb2aab0e 88 /* Private define ------------------------------------------------------------*/
mbed_official 354:e67efb2aab0e 89 /** @defgroup ADCEx_Private_Constants ADCEx Private Constants
mbed_official 354:e67efb2aab0e 90 * @{
mbed_official 354:e67efb2aab0e 91 */
mbed_official 354:e67efb2aab0e 92
mbed_official 354:e67efb2aab0e 93 /* ADC conversion cycles (unit: ADC clock cycles) */
mbed_official 354:e67efb2aab0e 94 /* (selected sampling time + conversion time of 12 ADC clock cycles, with */
mbed_official 354:e67efb2aab0e 95 /* resolution 12 bits) */
mbed_official 354:e67efb2aab0e 96 #define ADC_CONVERSIONCLOCKCYCLES_SAMPLETIME_4CYCLE5 ((uint32_t) 16)
mbed_official 354:e67efb2aab0e 97 #define ADC_CONVERSIONCLOCKCYCLES_SAMPLETIME_9CYCLES ((uint32_t) 21)
mbed_official 354:e67efb2aab0e 98 #define ADC_CONVERSIONCLOCKCYCLES_SAMPLETIME_16CYCLES ((uint32_t) 28)
mbed_official 354:e67efb2aab0e 99 #define ADC_CONVERSIONCLOCKCYCLES_SAMPLETIME_24CYCLES ((uint32_t) 36)
mbed_official 354:e67efb2aab0e 100 #define ADC_CONVERSIONCLOCKCYCLES_SAMPLETIME_48CYCLES ((uint32_t) 60)
mbed_official 354:e67efb2aab0e 101 #define ADC_CONVERSIONCLOCKCYCLES_SAMPLETIME_96CYCLES ((uint32_t)108)
mbed_official 354:e67efb2aab0e 102 #define ADC_CONVERSIONCLOCKCYCLES_SAMPLETIME_192CYCLES ((uint32_t)204)
mbed_official 354:e67efb2aab0e 103 #define ADC_CONVERSIONCLOCKCYCLES_SAMPLETIME_384CYCLES ((uint32_t)396)
mbed_official 354:e67efb2aab0e 104 /**
mbed_official 354:e67efb2aab0e 105 * @}
mbed_official 354:e67efb2aab0e 106 */
mbed_official 354:e67efb2aab0e 107
mbed_official 354:e67efb2aab0e 108 /* Private macro -------------------------------------------------------------*/
mbed_official 354:e67efb2aab0e 109 /* Private variables ---------------------------------------------------------*/
mbed_official 354:e67efb2aab0e 110 /* Private function prototypes -----------------------------------------------*/
mbed_official 354:e67efb2aab0e 111 /* Private functions ---------------------------------------------------------*/
mbed_official 354:e67efb2aab0e 112
mbed_official 354:e67efb2aab0e 113 /** @defgroup ADCEx_Exported_Functions ADCEx Exported Functions
mbed_official 354:e67efb2aab0e 114 * @{
mbed_official 354:e67efb2aab0e 115 */
mbed_official 354:e67efb2aab0e 116
mbed_official 354:e67efb2aab0e 117 /** @defgroup ADCEx_Exported_Functions_Group1 Extended Initialization/de-initialization functions
mbed_official 354:e67efb2aab0e 118 * @brief Extended Initialization and Configuration functions
mbed_official 354:e67efb2aab0e 119 *
mbed_official 354:e67efb2aab0e 120 @verbatim
mbed_official 354:e67efb2aab0e 121 ===============================================================================
mbed_official 354:e67efb2aab0e 122 ##### IO operation functions #####
mbed_official 354:e67efb2aab0e 123 ===============================================================================
mbed_official 354:e67efb2aab0e 124 [..] This section provides functions allowing to:
mbed_official 354:e67efb2aab0e 125 (+) Start conversion of injected group.
mbed_official 354:e67efb2aab0e 126 (+) Stop conversion of injected group.
mbed_official 354:e67efb2aab0e 127 (+) Poll for conversion complete on injected group.
mbed_official 354:e67efb2aab0e 128 (+) Get result of injected channel conversion.
mbed_official 354:e67efb2aab0e 129 (+) Start conversion of injected group and enable interruptions.
mbed_official 354:e67efb2aab0e 130 (+) Stop conversion of injected group and disable interruptions.
mbed_official 354:e67efb2aab0e 131
mbed_official 354:e67efb2aab0e 132 @endverbatim
mbed_official 354:e67efb2aab0e 133 * @{
mbed_official 354:e67efb2aab0e 134 */
mbed_official 354:e67efb2aab0e 135
mbed_official 354:e67efb2aab0e 136 /**
mbed_official 354:e67efb2aab0e 137 * @brief Enables ADC, starts conversion of injected group.
mbed_official 354:e67efb2aab0e 138 * Interruptions enabled in this function: None.
mbed_official 354:e67efb2aab0e 139 * @param hadc: ADC handle
mbed_official 354:e67efb2aab0e 140 * @retval HAL status
mbed_official 354:e67efb2aab0e 141 */
mbed_official 354:e67efb2aab0e 142 HAL_StatusTypeDef HAL_ADCEx_InjectedStart(ADC_HandleTypeDef* hadc)
mbed_official 354:e67efb2aab0e 143 {
mbed_official 354:e67efb2aab0e 144 HAL_StatusTypeDef tmpHALStatus = HAL_OK;
mbed_official 354:e67efb2aab0e 145
mbed_official 354:e67efb2aab0e 146 /* Check the parameters */
mbed_official 354:e67efb2aab0e 147 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 354:e67efb2aab0e 148
mbed_official 354:e67efb2aab0e 149 /* Process locked */
mbed_official 354:e67efb2aab0e 150 __HAL_LOCK(hadc);
mbed_official 354:e67efb2aab0e 151
mbed_official 354:e67efb2aab0e 152 /* Enable the ADC peripheral */
mbed_official 354:e67efb2aab0e 153 tmpHALStatus = ADC_Enable(hadc);
mbed_official 354:e67efb2aab0e 154
mbed_official 354:e67efb2aab0e 155 /* Start conversion if ADC is effectively enabled */
mbed_official 354:e67efb2aab0e 156 if (tmpHALStatus != HAL_ERROR)
mbed_official 354:e67efb2aab0e 157 {
mbed_official 354:e67efb2aab0e 158 /* Check if a regular conversion is ongoing */
mbed_official 354:e67efb2aab0e 159 if(hadc->State == HAL_ADC_STATE_BUSY_REG)
mbed_official 354:e67efb2aab0e 160 {
mbed_official 354:e67efb2aab0e 161 /* Change ADC state */
mbed_official 354:e67efb2aab0e 162 hadc->State = HAL_ADC_STATE_BUSY_INJ_REG;
mbed_official 354:e67efb2aab0e 163 }
mbed_official 354:e67efb2aab0e 164 else
mbed_official 354:e67efb2aab0e 165 {
mbed_official 354:e67efb2aab0e 166 /* Change ADC state */
mbed_official 354:e67efb2aab0e 167 hadc->State = HAL_ADC_STATE_BUSY_INJ;
mbed_official 354:e67efb2aab0e 168 }
mbed_official 354:e67efb2aab0e 169
mbed_official 354:e67efb2aab0e 170 /* Set ADC error code to none */
mbed_official 354:e67efb2aab0e 171 __HAL_ADC_CLEAR_ERRORCODE(hadc);
mbed_official 354:e67efb2aab0e 172
mbed_official 354:e67efb2aab0e 173 /* Clear injected group conversion flag */
mbed_official 354:e67efb2aab0e 174 /* (To ensure of no unknown state from potential previous ADC operations) */
mbed_official 354:e67efb2aab0e 175 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JEOC);
mbed_official 354:e67efb2aab0e 176
mbed_official 354:e67efb2aab0e 177 /* Start conversion of injected group if software start has been selected */
mbed_official 354:e67efb2aab0e 178 /* and if automatic injected conversion is disabled. */
mbed_official 354:e67efb2aab0e 179 /* If external trigger has been selected, conversion will start at next */
mbed_official 354:e67efb2aab0e 180 /* trigger event. */
mbed_official 354:e67efb2aab0e 181 /* If automatic injected conversion is enabled, conversion will start */
mbed_official 354:e67efb2aab0e 182 /* after next regular group conversion. */
mbed_official 354:e67efb2aab0e 183 if (__HAL_ADC_IS_SOFTWARE_START_INJECTED(hadc) &&
mbed_official 354:e67efb2aab0e 184 HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO) )
mbed_official 354:e67efb2aab0e 185 {
mbed_official 354:e67efb2aab0e 186 /* Enable ADC software conversion for injected channels */
mbed_official 354:e67efb2aab0e 187 SET_BIT(hadc->Instance->CR2, ADC_CR2_JSWSTART);
mbed_official 354:e67efb2aab0e 188 }
mbed_official 354:e67efb2aab0e 189 }
mbed_official 354:e67efb2aab0e 190
mbed_official 354:e67efb2aab0e 191 /* Process unlocked */
mbed_official 354:e67efb2aab0e 192 __HAL_UNLOCK(hadc);
mbed_official 354:e67efb2aab0e 193
mbed_official 354:e67efb2aab0e 194 /* Return function status */
mbed_official 354:e67efb2aab0e 195 return tmpHALStatus;
mbed_official 354:e67efb2aab0e 196 }
mbed_official 354:e67efb2aab0e 197
mbed_official 354:e67efb2aab0e 198 /**
mbed_official 354:e67efb2aab0e 199 * @brief Stop conversion of injected channels. Disable ADC peripheral if
mbed_official 354:e67efb2aab0e 200 * no regular conversion is on going.
mbed_official 354:e67efb2aab0e 201 * @note If ADC must be disabled with this function and if regular conversion
mbed_official 354:e67efb2aab0e 202 * is on going, function HAL_ADC_Stop must be used preliminarily.
mbed_official 354:e67efb2aab0e 203 * @note In case of auto-injection mode, HAL_ADC_Stop must be used.
mbed_official 354:e67efb2aab0e 204 * @param hadc: ADC handle
mbed_official 354:e67efb2aab0e 205 * @retval None
mbed_official 354:e67efb2aab0e 206 */
mbed_official 354:e67efb2aab0e 207 HAL_StatusTypeDef HAL_ADCEx_InjectedStop(ADC_HandleTypeDef* hadc)
mbed_official 354:e67efb2aab0e 208 {
mbed_official 354:e67efb2aab0e 209 HAL_StatusTypeDef tmpHALStatus = HAL_OK;
mbed_official 354:e67efb2aab0e 210
mbed_official 354:e67efb2aab0e 211 /* Check the parameters */
mbed_official 354:e67efb2aab0e 212 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 354:e67efb2aab0e 213
mbed_official 354:e67efb2aab0e 214 /* Process locked */
mbed_official 354:e67efb2aab0e 215 __HAL_LOCK(hadc);
mbed_official 354:e67efb2aab0e 216
mbed_official 354:e67efb2aab0e 217 /* Stop potential conversion and disable ADC peripheral */
mbed_official 354:e67efb2aab0e 218 /* Conditioned to: */
mbed_official 354:e67efb2aab0e 219 /* - No conversion on the other group (regular group) is intended to */
mbed_official 354:e67efb2aab0e 220 /* continue (injected and regular groups stop conversion and ADC disable */
mbed_official 354:e67efb2aab0e 221 /* are common) */
mbed_official 354:e67efb2aab0e 222 /* - In case of auto-injection mode, HAL_ADC_Stop must be used. */
mbed_official 354:e67efb2aab0e 223 if((hadc->State != HAL_ADC_STATE_BUSY_REG) &&
mbed_official 354:e67efb2aab0e 224 (hadc->State != HAL_ADC_STATE_BUSY_INJ_REG) &&
mbed_official 354:e67efb2aab0e 225 HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO) )
mbed_official 354:e67efb2aab0e 226 {
mbed_official 354:e67efb2aab0e 227 /* Stop potential conversion on going, on regular and injected groups */
mbed_official 354:e67efb2aab0e 228 /* Disable ADC peripheral */
mbed_official 354:e67efb2aab0e 229 tmpHALStatus = ADC_ConversionStop_Disable(hadc);
mbed_official 354:e67efb2aab0e 230
mbed_official 354:e67efb2aab0e 231 /* Check if ADC is effectively disabled */
mbed_official 354:e67efb2aab0e 232 if (tmpHALStatus != HAL_ERROR)
mbed_official 354:e67efb2aab0e 233 {
mbed_official 354:e67efb2aab0e 234 /* Change ADC state */
mbed_official 354:e67efb2aab0e 235 hadc->State = HAL_ADC_STATE_READY;
mbed_official 354:e67efb2aab0e 236 }
mbed_official 354:e67efb2aab0e 237 }
mbed_official 354:e67efb2aab0e 238 else
mbed_official 354:e67efb2aab0e 239 {
mbed_official 354:e67efb2aab0e 240 /* Update ADC state machine to error */
mbed_official 354:e67efb2aab0e 241 hadc->State = HAL_ADC_STATE_ERROR;
mbed_official 354:e67efb2aab0e 242
mbed_official 354:e67efb2aab0e 243 tmpHALStatus = HAL_ERROR;
mbed_official 354:e67efb2aab0e 244 }
mbed_official 354:e67efb2aab0e 245
mbed_official 354:e67efb2aab0e 246 /* Process unlocked */
mbed_official 354:e67efb2aab0e 247 __HAL_UNLOCK(hadc);
mbed_official 354:e67efb2aab0e 248
mbed_official 354:e67efb2aab0e 249 /* Return function status */
mbed_official 354:e67efb2aab0e 250 return tmpHALStatus;
mbed_official 354:e67efb2aab0e 251 }
mbed_official 354:e67efb2aab0e 252
mbed_official 354:e67efb2aab0e 253 /**
mbed_official 354:e67efb2aab0e 254 * @brief Wait for injected group conversion to be completed.
mbed_official 354:e67efb2aab0e 255 * @param hadc: ADC handle
mbed_official 354:e67efb2aab0e 256 * @param Timeout: Timeout value in millisecond.
mbed_official 354:e67efb2aab0e 257 * @retval HAL status
mbed_official 354:e67efb2aab0e 258 */
mbed_official 354:e67efb2aab0e 259 HAL_StatusTypeDef HAL_ADCEx_InjectedPollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout)
mbed_official 354:e67efb2aab0e 260 {
mbed_official 354:e67efb2aab0e 261 uint32_t tickstart;
mbed_official 354:e67efb2aab0e 262
mbed_official 354:e67efb2aab0e 263 /* Variables for polling in case of scan mode enabled and polling for each */
mbed_official 354:e67efb2aab0e 264 /* conversion. */
mbed_official 354:e67efb2aab0e 265 /* Note: Variable "conversion_timeout_cpu_cycles" set to offset 28 CPU */
mbed_official 354:e67efb2aab0e 266 /* cycles to compensate number of CPU cycles for processing of variable */
mbed_official 354:e67efb2aab0e 267 /* "conversion_timeout_cpu_cycles_max" */
mbed_official 354:e67efb2aab0e 268 uint32_t conversion_timeout_cpu_cycles = 28;
mbed_official 354:e67efb2aab0e 269 uint32_t conversion_timeout_cpu_cycles_max = 0;
mbed_official 354:e67efb2aab0e 270
mbed_official 354:e67efb2aab0e 271 /* Check the parameters */
mbed_official 354:e67efb2aab0e 272 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 354:e67efb2aab0e 273
mbed_official 354:e67efb2aab0e 274 /* Get timeout */
mbed_official 354:e67efb2aab0e 275 tickstart = HAL_GetTick();
mbed_official 354:e67efb2aab0e 276
mbed_official 354:e67efb2aab0e 277 /* Polling for end of conversion: differentiation if single/sequence */
mbed_official 354:e67efb2aab0e 278 /* conversion. */
mbed_official 354:e67efb2aab0e 279 /* For injected group, flag JEOC is set only at the end of the sequence, */
mbed_official 354:e67efb2aab0e 280 /* not for each conversion within the sequence. */
mbed_official 354:e67efb2aab0e 281 /* If setting "EOCSelection" is set to poll for each single conversion, */
mbed_official 354:e67efb2aab0e 282 /* management of polling depends on setting of injected group sequencer: */
mbed_official 354:e67efb2aab0e 283 /* - If single conversion for injected group (scan mode disabled or */
mbed_official 354:e67efb2aab0e 284 /* InjectedNbrOfConversion ==1), flag JEOC is used to determine the */
mbed_official 354:e67efb2aab0e 285 /* conversion completion. */
mbed_official 354:e67efb2aab0e 286 /* - If sequence conversion for injected group (scan mode enabled and */
mbed_official 354:e67efb2aab0e 287 /* InjectedNbrOfConversion >=2), flag JEOC is set only at the end of the */
mbed_official 354:e67efb2aab0e 288 /* sequence. */
mbed_official 354:e67efb2aab0e 289 /* To poll for each conversion, the maximum conversion time is computed */
mbed_official 354:e67efb2aab0e 290 /* from ADC conversion time (selected sampling time + conversion time of */
mbed_official 354:e67efb2aab0e 291 /* 12 ADC clock cycles) and APB2/ADC clock prescalers (depending on */
mbed_official 354:e67efb2aab0e 292 /* settings, conversion time range can vary from 8 to several thousands */
mbed_official 354:e67efb2aab0e 293 /* of CPU cycles). */
mbed_official 354:e67efb2aab0e 294
mbed_official 354:e67efb2aab0e 295 /* Note: On STM32L1, setting "EOCSelection" is related to regular group */
mbed_official 354:e67efb2aab0e 296 /* only, by hardware. For compatibility with other STM32 devices, */
mbed_official 354:e67efb2aab0e 297 /* this setting is related also to injected group by software. */
mbed_official 354:e67efb2aab0e 298 if (((hadc->Instance->JSQR & ADC_JSQR_JL) == RESET) ||
mbed_official 354:e67efb2aab0e 299 (hadc->Init.EOCSelection != EOC_SINGLE_CONV) )
mbed_official 354:e67efb2aab0e 300 {
mbed_official 354:e67efb2aab0e 301 /* Wait until End of Conversion flag is raised */
mbed_official 354:e67efb2aab0e 302 while(HAL_IS_BIT_CLR(hadc->Instance->SR, ADC_FLAG_JEOC))
mbed_official 354:e67efb2aab0e 303 {
mbed_official 354:e67efb2aab0e 304 /* Check if timeout is disabled (set to infinite wait) */
mbed_official 354:e67efb2aab0e 305 if(Timeout != HAL_MAX_DELAY)
mbed_official 354:e67efb2aab0e 306 {
mbed_official 354:e67efb2aab0e 307 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
mbed_official 354:e67efb2aab0e 308 {
mbed_official 354:e67efb2aab0e 309 /* Update ADC state machine to timeout */
mbed_official 354:e67efb2aab0e 310 hadc->State = HAL_ADC_STATE_TIMEOUT;
mbed_official 354:e67efb2aab0e 311
mbed_official 354:e67efb2aab0e 312 /* Process unlocked */
mbed_official 354:e67efb2aab0e 313 __HAL_UNLOCK(hadc);
mbed_official 354:e67efb2aab0e 314
mbed_official 354:e67efb2aab0e 315 return HAL_ERROR;
mbed_official 354:e67efb2aab0e 316 }
mbed_official 354:e67efb2aab0e 317 }
mbed_official 354:e67efb2aab0e 318 }
mbed_official 354:e67efb2aab0e 319 }
mbed_official 354:e67efb2aab0e 320 else
mbed_official 354:e67efb2aab0e 321 {
mbed_official 354:e67efb2aab0e 322 /* Computation of CPU cycles corresponding to ADC conversion cycles. */
mbed_official 354:e67efb2aab0e 323 /* Retrieve ADC clock prescaler and ADC maximum conversion cycles on all */
mbed_official 354:e67efb2aab0e 324 /* channels. */
mbed_official 354:e67efb2aab0e 325 conversion_timeout_cpu_cycles_max = __ADC_GET_CLOCK_PRESCALER_DECIMAL(hadc);
mbed_official 354:e67efb2aab0e 326 conversion_timeout_cpu_cycles_max *= __ADC_CONVCYCLES_MAX_RANGE(hadc);
mbed_official 354:e67efb2aab0e 327
mbed_official 354:e67efb2aab0e 328 /* Poll with maximum conversion time */
mbed_official 354:e67efb2aab0e 329 while(conversion_timeout_cpu_cycles < conversion_timeout_cpu_cycles_max)
mbed_official 354:e67efb2aab0e 330 {
mbed_official 354:e67efb2aab0e 331 /* Check if timeout is disabled (set to infinite wait) */
mbed_official 354:e67efb2aab0e 332 if(Timeout != HAL_MAX_DELAY)
mbed_official 354:e67efb2aab0e 333 {
mbed_official 354:e67efb2aab0e 334 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
mbed_official 354:e67efb2aab0e 335 {
mbed_official 354:e67efb2aab0e 336 /* Update ADC state machine to timeout */
mbed_official 354:e67efb2aab0e 337 hadc->State = HAL_ADC_STATE_TIMEOUT;
mbed_official 354:e67efb2aab0e 338
mbed_official 354:e67efb2aab0e 339 /* Process unlocked */
mbed_official 354:e67efb2aab0e 340 __HAL_UNLOCK(hadc);
mbed_official 354:e67efb2aab0e 341
mbed_official 354:e67efb2aab0e 342 return HAL_ERROR;
mbed_official 354:e67efb2aab0e 343 }
mbed_official 354:e67efb2aab0e 344 }
mbed_official 354:e67efb2aab0e 345 conversion_timeout_cpu_cycles ++;
mbed_official 354:e67efb2aab0e 346 }
mbed_official 354:e67efb2aab0e 347 }
mbed_official 354:e67efb2aab0e 348
mbed_official 354:e67efb2aab0e 349 /* Clear end of conversion flag of injected group if low power feature */
mbed_official 354:e67efb2aab0e 350 /* "Auto Wait" is disabled, to not interfere with this feature until data */
mbed_official 354:e67efb2aab0e 351 /* register is read using function HAL_ADCEx_InjectedGetValue(). */
mbed_official 354:e67efb2aab0e 352 if (hadc->Init.LowPowerAutoWait == DISABLE)
mbed_official 354:e67efb2aab0e 353 {
mbed_official 354:e67efb2aab0e 354 /* Clear injected group conversion flag */
mbed_official 354:e67efb2aab0e 355 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JSTRT | ADC_FLAG_JEOC);
mbed_official 354:e67efb2aab0e 356 }
mbed_official 354:e67efb2aab0e 357
mbed_official 354:e67efb2aab0e 358 /* Update state machine on conversion status if not in error state */
mbed_official 354:e67efb2aab0e 359 if(hadc->State != HAL_ADC_STATE_ERROR)
mbed_official 354:e67efb2aab0e 360 {
mbed_official 354:e67efb2aab0e 361 /* Update ADC state machine */
mbed_official 354:e67efb2aab0e 362 if(hadc->State != HAL_ADC_STATE_EOC_INJ_REG)
mbed_official 354:e67efb2aab0e 363 {
mbed_official 354:e67efb2aab0e 364
mbed_official 354:e67efb2aab0e 365 if(hadc->State == HAL_ADC_STATE_EOC_REG)
mbed_official 354:e67efb2aab0e 366 {
mbed_official 354:e67efb2aab0e 367 /* Change ADC state */
mbed_official 354:e67efb2aab0e 368 hadc->State = HAL_ADC_STATE_EOC_INJ_REG;
mbed_official 354:e67efb2aab0e 369 }
mbed_official 354:e67efb2aab0e 370 else
mbed_official 354:e67efb2aab0e 371 {
mbed_official 354:e67efb2aab0e 372 /* Change ADC state */
mbed_official 354:e67efb2aab0e 373 hadc->State = HAL_ADC_STATE_EOC_INJ;
mbed_official 354:e67efb2aab0e 374 }
mbed_official 354:e67efb2aab0e 375 }
mbed_official 354:e67efb2aab0e 376 }
mbed_official 354:e67efb2aab0e 377
mbed_official 354:e67efb2aab0e 378 /* Return ADC state */
mbed_official 354:e67efb2aab0e 379 return HAL_OK;
mbed_official 354:e67efb2aab0e 380 }
mbed_official 354:e67efb2aab0e 381
mbed_official 354:e67efb2aab0e 382 /**
mbed_official 354:e67efb2aab0e 383 * @brief Enables ADC, starts conversion of injected group with interruption.
mbed_official 354:e67efb2aab0e 384 * Interruptions enabled in this function: JEOC (end of conversion).
mbed_official 354:e67efb2aab0e 385 * Each of these interruptions has its dedicated callback function.
mbed_official 354:e67efb2aab0e 386 * @param hadc: ADC handle
mbed_official 354:e67efb2aab0e 387 * @retval HAL status.
mbed_official 354:e67efb2aab0e 388 */
mbed_official 354:e67efb2aab0e 389 HAL_StatusTypeDef HAL_ADCEx_InjectedStart_IT(ADC_HandleTypeDef* hadc)
mbed_official 354:e67efb2aab0e 390 {
mbed_official 354:e67efb2aab0e 391 HAL_StatusTypeDef tmpHALStatus = HAL_OK;
mbed_official 354:e67efb2aab0e 392
mbed_official 354:e67efb2aab0e 393 /* Check the parameters */
mbed_official 354:e67efb2aab0e 394 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 354:e67efb2aab0e 395
mbed_official 354:e67efb2aab0e 396 /* Process locked */
mbed_official 354:e67efb2aab0e 397 __HAL_LOCK(hadc);
mbed_official 354:e67efb2aab0e 398
mbed_official 354:e67efb2aab0e 399 /* Enable the ADC peripheral */
mbed_official 354:e67efb2aab0e 400 tmpHALStatus = ADC_Enable(hadc);
mbed_official 354:e67efb2aab0e 401
mbed_official 354:e67efb2aab0e 402 /* Start conversion if ADC is effectively enabled */
mbed_official 354:e67efb2aab0e 403 if (tmpHALStatus != HAL_ERROR)
mbed_official 354:e67efb2aab0e 404 {
mbed_official 354:e67efb2aab0e 405 /* Check if a regular conversion is ongoing */
mbed_official 354:e67efb2aab0e 406 if(hadc->State == HAL_ADC_STATE_BUSY_REG)
mbed_official 354:e67efb2aab0e 407 {
mbed_official 354:e67efb2aab0e 408 /* Change ADC state */
mbed_official 354:e67efb2aab0e 409 hadc->State = HAL_ADC_STATE_BUSY_INJ_REG;
mbed_official 354:e67efb2aab0e 410 }
mbed_official 354:e67efb2aab0e 411 else
mbed_official 354:e67efb2aab0e 412 {
mbed_official 354:e67efb2aab0e 413 /* Change ADC state */
mbed_official 354:e67efb2aab0e 414 hadc->State = HAL_ADC_STATE_BUSY_INJ;
mbed_official 354:e67efb2aab0e 415 }
mbed_official 354:e67efb2aab0e 416
mbed_official 354:e67efb2aab0e 417 /* Set ADC error code to none */
mbed_official 354:e67efb2aab0e 418 __HAL_ADC_CLEAR_ERRORCODE(hadc);
mbed_official 354:e67efb2aab0e 419
mbed_official 354:e67efb2aab0e 420 /* Clear injected group conversion flag */
mbed_official 354:e67efb2aab0e 421 /* (To ensure of no unknown state from potential previous ADC operations) */
mbed_official 354:e67efb2aab0e 422 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JEOC);
mbed_official 354:e67efb2aab0e 423
mbed_official 354:e67efb2aab0e 424 /* Enable end of conversion interrupt for injected channels */
mbed_official 354:e67efb2aab0e 425 __HAL_ADC_ENABLE_IT(hadc, ADC_IT_JEOC);
mbed_official 354:e67efb2aab0e 426
mbed_official 354:e67efb2aab0e 427 /* Start conversion of injected group if software start has been selected */
mbed_official 354:e67efb2aab0e 428 /* and if automatic injected conversion is disabled. */
mbed_official 354:e67efb2aab0e 429 /* If external trigger has been selected, conversion will start at next */
mbed_official 354:e67efb2aab0e 430 /* trigger event. */
mbed_official 354:e67efb2aab0e 431 /* If automatic injected conversion is enabled, conversion will start */
mbed_official 354:e67efb2aab0e 432 /* after next regular group conversion. */
mbed_official 354:e67efb2aab0e 433 if (__HAL_ADC_IS_SOFTWARE_START_INJECTED(hadc) &&
mbed_official 354:e67efb2aab0e 434 HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO) )
mbed_official 354:e67efb2aab0e 435 {
mbed_official 354:e67efb2aab0e 436 /* Enable ADC software conversion for injected channels */
mbed_official 354:e67efb2aab0e 437 SET_BIT(hadc->Instance->CR2, ADC_CR2_JSWSTART);
mbed_official 354:e67efb2aab0e 438 }
mbed_official 354:e67efb2aab0e 439 }
mbed_official 354:e67efb2aab0e 440
mbed_official 354:e67efb2aab0e 441 /* Process unlocked */
mbed_official 354:e67efb2aab0e 442 __HAL_UNLOCK(hadc);
mbed_official 354:e67efb2aab0e 443
mbed_official 354:e67efb2aab0e 444 /* Return function status */
mbed_official 354:e67efb2aab0e 445 return tmpHALStatus;
mbed_official 354:e67efb2aab0e 446 }
mbed_official 354:e67efb2aab0e 447
mbed_official 354:e67efb2aab0e 448 /**
mbed_official 354:e67efb2aab0e 449 * @brief Stop conversion of injected channels, disable interruption of
mbed_official 354:e67efb2aab0e 450 * end-of-conversion. Disable ADC peripheral if no regular conversion
mbed_official 354:e67efb2aab0e 451 * is on going.
mbed_official 354:e67efb2aab0e 452 * @note If ADC must be disabled with this function and if regular conversion
mbed_official 354:e67efb2aab0e 453 * is on going, function HAL_ADC_Stop must be used preliminarily.
mbed_official 354:e67efb2aab0e 454 * @param hadc: ADC handle
mbed_official 354:e67efb2aab0e 455 * @retval None
mbed_official 354:e67efb2aab0e 456 */
mbed_official 354:e67efb2aab0e 457 HAL_StatusTypeDef HAL_ADCEx_InjectedStop_IT(ADC_HandleTypeDef* hadc)
mbed_official 354:e67efb2aab0e 458 {
mbed_official 354:e67efb2aab0e 459 HAL_StatusTypeDef tmpHALStatus = HAL_OK;
mbed_official 354:e67efb2aab0e 460
mbed_official 354:e67efb2aab0e 461 /* Check the parameters */
mbed_official 354:e67efb2aab0e 462 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 354:e67efb2aab0e 463
mbed_official 354:e67efb2aab0e 464 /* Process locked */
mbed_official 354:e67efb2aab0e 465 __HAL_LOCK(hadc);
mbed_official 354:e67efb2aab0e 466
mbed_official 354:e67efb2aab0e 467 /* Stop potential conversion and disable ADC peripheral */
mbed_official 354:e67efb2aab0e 468 /* Conditioned to: */
mbed_official 354:e67efb2aab0e 469 /* - No conversion on the other group (regular group) is intended to */
mbed_official 354:e67efb2aab0e 470 /* continue (injected and regular groups stop conversion and ADC disable */
mbed_official 354:e67efb2aab0e 471 /* are common) */
mbed_official 354:e67efb2aab0e 472 /* - In case of auto-injection mode, HAL_ADC_Stop must be used. */
mbed_official 354:e67efb2aab0e 473 if((hadc->State != HAL_ADC_STATE_BUSY_REG) &&
mbed_official 354:e67efb2aab0e 474 (hadc->State != HAL_ADC_STATE_BUSY_INJ_REG) &&
mbed_official 354:e67efb2aab0e 475 HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO) )
mbed_official 354:e67efb2aab0e 476 {
mbed_official 354:e67efb2aab0e 477 /* Stop potential conversion on going, on regular and injected groups */
mbed_official 354:e67efb2aab0e 478 /* Disable ADC peripheral */
mbed_official 354:e67efb2aab0e 479 tmpHALStatus = ADC_ConversionStop_Disable(hadc);
mbed_official 354:e67efb2aab0e 480
mbed_official 354:e67efb2aab0e 481 /* Check if ADC is effectively disabled */
mbed_official 354:e67efb2aab0e 482 if (tmpHALStatus != HAL_ERROR)
mbed_official 354:e67efb2aab0e 483 {
mbed_official 354:e67efb2aab0e 484 /* Disable ADC end of conversion interrupt for injected channels */
mbed_official 354:e67efb2aab0e 485 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_JEOC);
mbed_official 354:e67efb2aab0e 486
mbed_official 354:e67efb2aab0e 487 /* Change ADC state */
mbed_official 354:e67efb2aab0e 488 hadc->State = HAL_ADC_STATE_READY;
mbed_official 354:e67efb2aab0e 489 }
mbed_official 354:e67efb2aab0e 490 }
mbed_official 354:e67efb2aab0e 491 else
mbed_official 354:e67efb2aab0e 492 {
mbed_official 354:e67efb2aab0e 493 /* Update ADC state machine to error */
mbed_official 354:e67efb2aab0e 494 hadc->State = HAL_ADC_STATE_ERROR;
mbed_official 354:e67efb2aab0e 495
mbed_official 354:e67efb2aab0e 496 tmpHALStatus = HAL_ERROR;
mbed_official 354:e67efb2aab0e 497 }
mbed_official 354:e67efb2aab0e 498
mbed_official 354:e67efb2aab0e 499 /* Process unlocked */
mbed_official 354:e67efb2aab0e 500 __HAL_UNLOCK(hadc);
mbed_official 354:e67efb2aab0e 501
mbed_official 354:e67efb2aab0e 502 /* Return function status */
mbed_official 354:e67efb2aab0e 503 return tmpHALStatus;
mbed_official 354:e67efb2aab0e 504 }
mbed_official 354:e67efb2aab0e 505
mbed_official 354:e67efb2aab0e 506 /**
mbed_official 354:e67efb2aab0e 507 * @brief Get ADC injected group conversion result.
mbed_official 354:e67efb2aab0e 508 * @param hadc: ADC handle
mbed_official 354:e67efb2aab0e 509 * @param InjectedRank: the converted ADC injected rank.
mbed_official 354:e67efb2aab0e 510 * This parameter can be one of the following values:
mbed_official 354:e67efb2aab0e 511 * @arg ADC_INJECTED_RANK_1: Injected Channel1 selected
mbed_official 354:e67efb2aab0e 512 * @arg ADC_INJECTED_RANK_2: Injected Channel2 selected
mbed_official 354:e67efb2aab0e 513 * @arg ADC_INJECTED_RANK_3: Injected Channel3 selected
mbed_official 354:e67efb2aab0e 514 * @arg ADC_INJECTED_RANK_4: Injected Channel4 selected
mbed_official 354:e67efb2aab0e 515 * @retval None
mbed_official 354:e67efb2aab0e 516 */
mbed_official 354:e67efb2aab0e 517 uint32_t HAL_ADCEx_InjectedGetValue(ADC_HandleTypeDef* hadc, uint32_t InjectedRank)
mbed_official 354:e67efb2aab0e 518 {
mbed_official 354:e67efb2aab0e 519 uint32_t tmp_jdr = 0;
mbed_official 354:e67efb2aab0e 520
mbed_official 354:e67efb2aab0e 521 /* Check the parameters */
mbed_official 354:e67efb2aab0e 522 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 354:e67efb2aab0e 523 assert_param(IS_ADC_INJECTED_RANK(InjectedRank));
mbed_official 354:e67efb2aab0e 524
mbed_official 354:e67efb2aab0e 525 /* Clear injected group conversion flag to have similar behaviour as */
mbed_official 354:e67efb2aab0e 526 /* regular group: reading data register also clears end of conversion flag. */
mbed_official 354:e67efb2aab0e 527 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JEOC);
mbed_official 354:e67efb2aab0e 528
mbed_official 354:e67efb2aab0e 529 /* Get ADC converted value */
mbed_official 354:e67efb2aab0e 530 switch(InjectedRank)
mbed_official 354:e67efb2aab0e 531 {
mbed_official 354:e67efb2aab0e 532 case ADC_INJECTED_RANK_4:
mbed_official 354:e67efb2aab0e 533 tmp_jdr = hadc->Instance->JDR4;
mbed_official 354:e67efb2aab0e 534 break;
mbed_official 354:e67efb2aab0e 535 case ADC_INJECTED_RANK_3:
mbed_official 354:e67efb2aab0e 536 tmp_jdr = hadc->Instance->JDR3;
mbed_official 354:e67efb2aab0e 537 break;
mbed_official 354:e67efb2aab0e 538 case ADC_INJECTED_RANK_2:
mbed_official 354:e67efb2aab0e 539 tmp_jdr = hadc->Instance->JDR2;
mbed_official 354:e67efb2aab0e 540 break;
mbed_official 354:e67efb2aab0e 541 case ADC_INJECTED_RANK_1:
mbed_official 354:e67efb2aab0e 542 default:
mbed_official 354:e67efb2aab0e 543 tmp_jdr = hadc->Instance->JDR1;
mbed_official 354:e67efb2aab0e 544 break;
mbed_official 354:e67efb2aab0e 545 }
mbed_official 354:e67efb2aab0e 546
mbed_official 354:e67efb2aab0e 547 /* Return ADC converted value */
mbed_official 354:e67efb2aab0e 548 return tmp_jdr;
mbed_official 354:e67efb2aab0e 549 }
mbed_official 354:e67efb2aab0e 550
mbed_official 354:e67efb2aab0e 551 /**
mbed_official 354:e67efb2aab0e 552 * @brief Injected conversion complete callback in non blocking mode
mbed_official 354:e67efb2aab0e 553 * @param hadc: ADC handle
mbed_official 354:e67efb2aab0e 554 * @retval None
mbed_official 354:e67efb2aab0e 555 */
mbed_official 354:e67efb2aab0e 556 __weak void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef* hadc)
mbed_official 354:e67efb2aab0e 557 {
mbed_official 354:e67efb2aab0e 558 /* NOTE : This function Should not be modified, when the callback is needed,
mbed_official 354:e67efb2aab0e 559 the HAL_ADCEx_InjectedConvCpltCallback could be implemented in the user file
mbed_official 354:e67efb2aab0e 560 */
mbed_official 354:e67efb2aab0e 561 }
mbed_official 354:e67efb2aab0e 562
mbed_official 354:e67efb2aab0e 563 /**
mbed_official 354:e67efb2aab0e 564 * @}
mbed_official 354:e67efb2aab0e 565 */
mbed_official 354:e67efb2aab0e 566
mbed_official 354:e67efb2aab0e 567 /** @defgroup ADCEx_Exported_Functions_Group2 Extended Peripheral Control functions
mbed_official 354:e67efb2aab0e 568 * @brief Extended Peripheral Control functions
mbed_official 354:e67efb2aab0e 569 *
mbed_official 354:e67efb2aab0e 570 @verbatim
mbed_official 354:e67efb2aab0e 571 ===============================================================================
mbed_official 354:e67efb2aab0e 572 ##### Peripheral Control functions #####
mbed_official 354:e67efb2aab0e 573 ===============================================================================
mbed_official 354:e67efb2aab0e 574 [..] This section provides functions allowing to:
mbed_official 354:e67efb2aab0e 575 (+) Configure channels on injected group
mbed_official 354:e67efb2aab0e 576
mbed_official 354:e67efb2aab0e 577 @endverbatim
mbed_official 354:e67efb2aab0e 578 * @{
mbed_official 354:e67efb2aab0e 579 */
mbed_official 354:e67efb2aab0e 580
mbed_official 354:e67efb2aab0e 581 /**
mbed_official 354:e67efb2aab0e 582 * @brief Configures the ADC injected group and the selected channel to be
mbed_official 354:e67efb2aab0e 583 * linked to the injected group.
mbed_official 354:e67efb2aab0e 584 * @note Possibility to update parameters on the fly:
mbed_official 354:e67efb2aab0e 585 * This function initializes injected group, following calls to this
mbed_official 354:e67efb2aab0e 586 * function can be used to reconfigure some parameters of structure
mbed_official 354:e67efb2aab0e 587 * "ADC_InjectionConfTypeDef" on the fly, without reseting the ADC.
mbed_official 354:e67efb2aab0e 588 * The setting of these parameters is conditioned to ADC state:
mbed_official 354:e67efb2aab0e 589 * this function must be called when ADC is not under conversion.
mbed_official 354:e67efb2aab0e 590 * @param hadc: ADC handle
mbed_official 354:e67efb2aab0e 591 * @param sConfigInjected: Structure of ADC injected group and ADC channel for
mbed_official 354:e67efb2aab0e 592 * injected group.
mbed_official 354:e67efb2aab0e 593 * @retval None
mbed_official 354:e67efb2aab0e 594 */
mbed_official 354:e67efb2aab0e 595 HAL_StatusTypeDef HAL_ADCEx_InjectedConfigChannel(ADC_HandleTypeDef* hadc, ADC_InjectionConfTypeDef* sConfigInjected)
mbed_official 354:e67efb2aab0e 596 {
mbed_official 354:e67efb2aab0e 597 HAL_StatusTypeDef tmpHALStatus = HAL_OK;
mbed_official 354:e67efb2aab0e 598
mbed_official 354:e67efb2aab0e 599 /* Check the parameters */
mbed_official 354:e67efb2aab0e 600 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
mbed_official 354:e67efb2aab0e 601 assert_param(IS_ADC_CHANNEL(sConfigInjected->InjectedChannel));
mbed_official 354:e67efb2aab0e 602 assert_param(IS_ADC_SAMPLE_TIME(sConfigInjected->InjectedSamplingTime));
mbed_official 354:e67efb2aab0e 603 assert_param(IS_FUNCTIONAL_STATE(sConfigInjected->AutoInjectedConv));
mbed_official 354:e67efb2aab0e 604 assert_param(IS_ADC_EXTTRIGINJEC(sConfigInjected->ExternalTrigInjecConv));
mbed_official 354:e67efb2aab0e 605 assert_param(IS_ADC_RANGE(sConfigInjected->InjectedOffset));
mbed_official 354:e67efb2aab0e 606
mbed_official 354:e67efb2aab0e 607 if(hadc->Init.ScanConvMode != ADC_SCAN_DISABLE)
mbed_official 354:e67efb2aab0e 608 {
mbed_official 354:e67efb2aab0e 609 assert_param(IS_ADC_INJECTED_RANK(sConfigInjected->InjectedRank));
mbed_official 354:e67efb2aab0e 610 assert_param(IS_ADC_INJECTED_NB_CONV(sConfigInjected->InjectedNbrOfConversion));
mbed_official 354:e67efb2aab0e 611 assert_param(IS_FUNCTIONAL_STATE(sConfigInjected->InjectedDiscontinuousConvMode));
mbed_official 354:e67efb2aab0e 612 }
mbed_official 354:e67efb2aab0e 613
mbed_official 354:e67efb2aab0e 614 if(sConfigInjected->ExternalTrigInjecConvEdge != ADC_INJECTED_SOFTWARE_START)
mbed_official 354:e67efb2aab0e 615 {
mbed_official 354:e67efb2aab0e 616 assert_param(IS_ADC_EXTTRIGINJEC_EDGE(sConfigInjected->ExternalTrigInjecConvEdge));
mbed_official 354:e67efb2aab0e 617 }
mbed_official 354:e67efb2aab0e 618
mbed_official 354:e67efb2aab0e 619 /* Process locked */
mbed_official 354:e67efb2aab0e 620 __HAL_LOCK(hadc);
mbed_official 354:e67efb2aab0e 621
mbed_official 354:e67efb2aab0e 622 /* Configuration of injected group sequencer: */
mbed_official 354:e67efb2aab0e 623 /* - if scan mode is disabled, injected channels sequence length is set to */
mbed_official 354:e67efb2aab0e 624 /* 0x00: 1 channel converted (channel on regular rank 1) */
mbed_official 354:e67efb2aab0e 625 /* Parameter "InjectedNbrOfConversion" is discarded. */
mbed_official 354:e67efb2aab0e 626 /* Note: Scan mode is present by hardware on this device and, if */
mbed_official 354:e67efb2aab0e 627 /* disabled, discards automatically nb of conversions. Anyway, nb of */
mbed_official 354:e67efb2aab0e 628 /* conversions is forced to 0x00 for alignment over all STM32 devices. */
mbed_official 354:e67efb2aab0e 629 /* - if scan mode is enabled, injected channels sequence length is set to */
mbed_official 354:e67efb2aab0e 630 /* parameter ""InjectedNbrOfConversion". */
mbed_official 354:e67efb2aab0e 631 if (hadc->Init.ScanConvMode == ADC_SCAN_DISABLE)
mbed_official 354:e67efb2aab0e 632 {
mbed_official 354:e67efb2aab0e 633 if (sConfigInjected->InjectedRank == ADC_INJECTED_RANK_1)
mbed_official 354:e67efb2aab0e 634 {
mbed_official 354:e67efb2aab0e 635 /* Clear the old SQx bits for all injected ranks */
mbed_official 354:e67efb2aab0e 636 MODIFY_REG(hadc->Instance->JSQR ,
mbed_official 354:e67efb2aab0e 637 ADC_JSQR_JL |
mbed_official 354:e67efb2aab0e 638 ADC_JSQR_JSQ4 |
mbed_official 354:e67efb2aab0e 639 ADC_JSQR_JSQ3 |
mbed_official 354:e67efb2aab0e 640 ADC_JSQR_JSQ2 |
mbed_official 354:e67efb2aab0e 641 ADC_JSQR_JSQ1 ,
mbed_official 354:e67efb2aab0e 642 __ADC_JSQR_RK(sConfigInjected->InjectedChannel,
mbed_official 354:e67efb2aab0e 643 ADC_INJECTED_RANK_1,
mbed_official 354:e67efb2aab0e 644 0x01) );
mbed_official 354:e67efb2aab0e 645 }
mbed_official 354:e67efb2aab0e 646 /* If another injected rank than rank1 was intended to be set, and could */
mbed_official 354:e67efb2aab0e 647 /* not due to ScanConvMode disabled, error is reported. */
mbed_official 354:e67efb2aab0e 648 else
mbed_official 354:e67efb2aab0e 649 {
mbed_official 354:e67efb2aab0e 650 /* Update ADC state machine to error */
mbed_official 354:e67efb2aab0e 651 hadc->State = HAL_ADC_STATE_ERROR;
mbed_official 354:e67efb2aab0e 652
mbed_official 354:e67efb2aab0e 653 tmpHALStatus = HAL_ERROR;
mbed_official 354:e67efb2aab0e 654 }
mbed_official 354:e67efb2aab0e 655 }
mbed_official 354:e67efb2aab0e 656 else
mbed_official 354:e67efb2aab0e 657 {
mbed_official 354:e67efb2aab0e 658 /* Since injected channels rank conv. order depends on total number of */
mbed_official 354:e67efb2aab0e 659 /* injected conversions, selected rank must be below or equal to total */
mbed_official 354:e67efb2aab0e 660 /* number of injected conversions to be updated. */
mbed_official 354:e67efb2aab0e 661 if (sConfigInjected->InjectedRank <= sConfigInjected->InjectedNbrOfConversion)
mbed_official 354:e67efb2aab0e 662 {
mbed_official 354:e67efb2aab0e 663 /* Clear the old SQx bits for the selected rank */
mbed_official 354:e67efb2aab0e 664 /* Set the SQx bits for the selected rank */
mbed_official 354:e67efb2aab0e 665 MODIFY_REG(hadc->Instance->JSQR ,
mbed_official 354:e67efb2aab0e 666
mbed_official 354:e67efb2aab0e 667 ADC_JSQR_JL |
mbed_official 354:e67efb2aab0e 668 __ADC_JSQR_RK(ADC_JSQR_JSQ1,
mbed_official 354:e67efb2aab0e 669 sConfigInjected->InjectedRank,
mbed_official 354:e67efb2aab0e 670 sConfigInjected->InjectedNbrOfConversion) ,
mbed_official 354:e67efb2aab0e 671
mbed_official 354:e67efb2aab0e 672 __ADC_JSQR_JL(sConfigInjected->InjectedNbrOfConversion) |
mbed_official 354:e67efb2aab0e 673 __ADC_JSQR_RK(sConfigInjected->InjectedChannel,
mbed_official 354:e67efb2aab0e 674 sConfigInjected->InjectedRank,
mbed_official 354:e67efb2aab0e 675 sConfigInjected->InjectedNbrOfConversion) );
mbed_official 354:e67efb2aab0e 676 }
mbed_official 354:e67efb2aab0e 677 else
mbed_official 354:e67efb2aab0e 678 {
mbed_official 354:e67efb2aab0e 679 /* Clear the old SQx bits for the selected rank */
mbed_official 354:e67efb2aab0e 680 MODIFY_REG(hadc->Instance->JSQR ,
mbed_official 354:e67efb2aab0e 681
mbed_official 354:e67efb2aab0e 682 ADC_JSQR_JL |
mbed_official 354:e67efb2aab0e 683 __ADC_JSQR_RK(ADC_JSQR_JSQ1,
mbed_official 354:e67efb2aab0e 684 sConfigInjected->InjectedRank,
mbed_official 354:e67efb2aab0e 685 sConfigInjected->InjectedNbrOfConversion) ,
mbed_official 354:e67efb2aab0e 686
mbed_official 354:e67efb2aab0e 687 0x00000000 );
mbed_official 354:e67efb2aab0e 688 }
mbed_official 354:e67efb2aab0e 689 }
mbed_official 354:e67efb2aab0e 690
mbed_official 354:e67efb2aab0e 691 /* Enable external trigger if trigger selection is different of software */
mbed_official 354:e67efb2aab0e 692 /* start. */
mbed_official 354:e67efb2aab0e 693 /* Note: This configuration keeps the hardware feature of parameter */
mbed_official 354:e67efb2aab0e 694 /* ExternalTrigConvEdge "trigger edge none" equivalent to */
mbed_official 354:e67efb2aab0e 695 /* software start. */
mbed_official 354:e67efb2aab0e 696
mbed_official 354:e67efb2aab0e 697 if (sConfigInjected->ExternalTrigInjecConv != ADC_INJECTED_SOFTWARE_START)
mbed_official 354:e67efb2aab0e 698 {
mbed_official 354:e67efb2aab0e 699 MODIFY_REG(hadc->Instance->CR2 ,
mbed_official 354:e67efb2aab0e 700 ADC_CR2_JEXTEN |
mbed_official 354:e67efb2aab0e 701 ADC_CR2_JEXTSEL ,
mbed_official 354:e67efb2aab0e 702 sConfigInjected->ExternalTrigInjecConv |
mbed_official 354:e67efb2aab0e 703 sConfigInjected->ExternalTrigInjecConvEdge );
mbed_official 354:e67efb2aab0e 704 }
mbed_official 354:e67efb2aab0e 705 else
mbed_official 354:e67efb2aab0e 706 {
mbed_official 354:e67efb2aab0e 707 MODIFY_REG(hadc->Instance->CR2,
mbed_official 354:e67efb2aab0e 708 ADC_CR2_JEXTEN |
mbed_official 354:e67efb2aab0e 709 ADC_CR2_JEXTSEL ,
mbed_official 354:e67efb2aab0e 710 0x00000000 );
mbed_official 354:e67efb2aab0e 711 }
mbed_official 354:e67efb2aab0e 712
mbed_official 354:e67efb2aab0e 713 /* Configuration of injected group */
mbed_official 354:e67efb2aab0e 714 /* Parameters update conditioned to ADC state: */
mbed_official 354:e67efb2aab0e 715 /* Parameters that can be updated only when ADC is disabled: */
mbed_official 354:e67efb2aab0e 716 /* - Automatic injected conversion */
mbed_official 354:e67efb2aab0e 717 /* - Injected discontinuous mode */
mbed_official 354:e67efb2aab0e 718 if ((__HAL_ADC_IS_ENABLED(hadc) == RESET))
mbed_official 354:e67efb2aab0e 719 {
mbed_official 354:e67efb2aab0e 720 hadc->Instance->CR1 &= ~(ADC_CR1_JAUTO |
mbed_official 354:e67efb2aab0e 721 ADC_CR1_JDISCEN );
mbed_official 354:e67efb2aab0e 722
mbed_official 354:e67efb2aab0e 723 /* Automatic injected conversion can be enabled if injected group */
mbed_official 354:e67efb2aab0e 724 /* external triggers are disabled. */
mbed_official 354:e67efb2aab0e 725 if (sConfigInjected->AutoInjectedConv == ENABLE)
mbed_official 354:e67efb2aab0e 726 {
mbed_official 354:e67efb2aab0e 727 if (sConfigInjected->ExternalTrigInjecConv == ADC_INJECTED_SOFTWARE_START)
mbed_official 354:e67efb2aab0e 728 {
mbed_official 354:e67efb2aab0e 729 SET_BIT(hadc->Instance->CR1, ADC_CR1_JAUTO);
mbed_official 354:e67efb2aab0e 730 }
mbed_official 354:e67efb2aab0e 731 else
mbed_official 354:e67efb2aab0e 732 {
mbed_official 354:e67efb2aab0e 733 /* Update ADC state machine to error */
mbed_official 354:e67efb2aab0e 734 hadc->State = HAL_ADC_STATE_ERROR;
mbed_official 354:e67efb2aab0e 735
mbed_official 354:e67efb2aab0e 736 tmpHALStatus = HAL_ERROR;
mbed_official 354:e67efb2aab0e 737 }
mbed_official 354:e67efb2aab0e 738 }
mbed_official 354:e67efb2aab0e 739
mbed_official 354:e67efb2aab0e 740 /* Injected discontinuous can be enabled only if auto-injected mode is */
mbed_official 354:e67efb2aab0e 741 /* disabled. */
mbed_official 354:e67efb2aab0e 742 if (sConfigInjected->InjectedDiscontinuousConvMode == ENABLE)
mbed_official 354:e67efb2aab0e 743 {
mbed_official 354:e67efb2aab0e 744 if (sConfigInjected->AutoInjectedConv == DISABLE)
mbed_official 354:e67efb2aab0e 745 {
mbed_official 354:e67efb2aab0e 746 SET_BIT(hadc->Instance->CR1, ADC_CR1_JDISCEN);
mbed_official 354:e67efb2aab0e 747 }
mbed_official 354:e67efb2aab0e 748 else
mbed_official 354:e67efb2aab0e 749 {
mbed_official 354:e67efb2aab0e 750 /* Update ADC state machine to error */
mbed_official 354:e67efb2aab0e 751 hadc->State = HAL_ADC_STATE_ERROR;
mbed_official 354:e67efb2aab0e 752
mbed_official 354:e67efb2aab0e 753 tmpHALStatus = HAL_ERROR;
mbed_official 354:e67efb2aab0e 754 }
mbed_official 354:e67efb2aab0e 755 }
mbed_official 354:e67efb2aab0e 756 }
mbed_official 354:e67efb2aab0e 757
mbed_official 354:e67efb2aab0e 758 /* InjectedChannel sampling time configuration */
mbed_official 354:e67efb2aab0e 759 /* For InjectedChannels 0 to 9 */
mbed_official 354:e67efb2aab0e 760 if (sConfigInjected->InjectedChannel < ADC_CHANNEL_10)
mbed_official 354:e67efb2aab0e 761 {
mbed_official 354:e67efb2aab0e 762 MODIFY_REG(hadc->Instance->SMPR3,
mbed_official 354:e67efb2aab0e 763 __ADC_SMPR3(ADC_SMPR3_SMP0, sConfigInjected->InjectedChannel),
mbed_official 354:e67efb2aab0e 764 __ADC_SMPR3(sConfigInjected->InjectedSamplingTime, sConfigInjected->InjectedChannel) );
mbed_official 354:e67efb2aab0e 765 }
mbed_official 354:e67efb2aab0e 766 /* For InjectedChannels 10 to 19 */
mbed_official 354:e67efb2aab0e 767 else if (sConfigInjected->InjectedChannel < ADC_CHANNEL_20)
mbed_official 354:e67efb2aab0e 768 {
mbed_official 354:e67efb2aab0e 769 MODIFY_REG(hadc->Instance->SMPR2,
mbed_official 354:e67efb2aab0e 770 __ADC_SMPR2(ADC_SMPR2_SMP10, sConfigInjected->InjectedChannel),
mbed_official 354:e67efb2aab0e 771 __ADC_SMPR2(sConfigInjected->InjectedSamplingTime, sConfigInjected->InjectedChannel) );
mbed_official 354:e67efb2aab0e 772 }
mbed_official 354:e67efb2aab0e 773 /* For InjectedChannels 20 to 26 for devices Cat.1, Cat.2, Cat.3 */
mbed_official 354:e67efb2aab0e 774 /* For InjectedChannels 20 to 29 for devices Cat4, Cat.5 */
mbed_official 354:e67efb2aab0e 775 else if (sConfigInjected->InjectedChannel <= ADC_SMPR1_CHANNEL_MAX)
mbed_official 354:e67efb2aab0e 776 {
mbed_official 354:e67efb2aab0e 777 MODIFY_REG(hadc->Instance->SMPR1,
mbed_official 354:e67efb2aab0e 778 __ADC_SMPR1(ADC_SMPR1_SMP20, sConfigInjected->InjectedChannel),
mbed_official 354:e67efb2aab0e 779 __ADC_SMPR1(sConfigInjected->InjectedSamplingTime, sConfigInjected->InjectedChannel) );
mbed_official 354:e67efb2aab0e 780 }
mbed_official 354:e67efb2aab0e 781 /* For InjectedChannels 30 to 31 for devices Cat4, Cat.5 */
mbed_official 354:e67efb2aab0e 782 else
mbed_official 354:e67efb2aab0e 783 {
mbed_official 354:e67efb2aab0e 784 __ADC_SMPR0_CHANNEL_SET(hadc, sConfigInjected->InjectedSamplingTime, sConfigInjected->InjectedChannel);
mbed_official 354:e67efb2aab0e 785 }
mbed_official 354:e67efb2aab0e 786
mbed_official 354:e67efb2aab0e 787
mbed_official 354:e67efb2aab0e 788 /* Configure the offset: offset enable/disable, InjectedChannel, offset value */
mbed_official 354:e67efb2aab0e 789 switch(sConfigInjected->InjectedRank)
mbed_official 354:e67efb2aab0e 790 {
mbed_official 354:e67efb2aab0e 791 case 1:
mbed_official 354:e67efb2aab0e 792 /* Set injected channel 1 offset */
mbed_official 354:e67efb2aab0e 793 MODIFY_REG(hadc->Instance->JOFR1,
mbed_official 354:e67efb2aab0e 794 ADC_JOFR1_JOFFSET1,
mbed_official 354:e67efb2aab0e 795 sConfigInjected->InjectedOffset);
mbed_official 354:e67efb2aab0e 796 break;
mbed_official 354:e67efb2aab0e 797 case 2:
mbed_official 354:e67efb2aab0e 798 /* Set injected channel 2 offset */
mbed_official 354:e67efb2aab0e 799 MODIFY_REG(hadc->Instance->JOFR2,
mbed_official 354:e67efb2aab0e 800 ADC_JOFR2_JOFFSET2,
mbed_official 354:e67efb2aab0e 801 sConfigInjected->InjectedOffset);
mbed_official 354:e67efb2aab0e 802 break;
mbed_official 354:e67efb2aab0e 803 case 3:
mbed_official 354:e67efb2aab0e 804 /* Set injected channel 3 offset */
mbed_official 354:e67efb2aab0e 805 MODIFY_REG(hadc->Instance->JOFR3,
mbed_official 354:e67efb2aab0e 806 ADC_JOFR3_JOFFSET3,
mbed_official 354:e67efb2aab0e 807 sConfigInjected->InjectedOffset);
mbed_official 354:e67efb2aab0e 808 break;
mbed_official 354:e67efb2aab0e 809 case 4:
mbed_official 354:e67efb2aab0e 810 default:
mbed_official 354:e67efb2aab0e 811 MODIFY_REG(hadc->Instance->JOFR4,
mbed_official 354:e67efb2aab0e 812 ADC_JOFR4_JOFFSET4,
mbed_official 354:e67efb2aab0e 813 sConfigInjected->InjectedOffset);
mbed_official 354:e67efb2aab0e 814 break;
mbed_official 354:e67efb2aab0e 815 }
mbed_official 354:e67efb2aab0e 816
mbed_official 354:e67efb2aab0e 817 /* If ADC1 Channel_16 or Channel_17 is selected, enable Temperature sensor */
mbed_official 354:e67efb2aab0e 818 /* and VREFINT measurement path. */
mbed_official 354:e67efb2aab0e 819 if ((sConfigInjected->InjectedChannel == ADC_CHANNEL_TEMPSENSOR) ||
mbed_official 354:e67efb2aab0e 820 (sConfigInjected->InjectedChannel == ADC_CHANNEL_VREFINT) )
mbed_official 354:e67efb2aab0e 821 {
mbed_official 354:e67efb2aab0e 822 SET_BIT(ADC->CCR, ADC_CCR_TSVREFE);
mbed_official 354:e67efb2aab0e 823 }
mbed_official 354:e67efb2aab0e 824
mbed_official 354:e67efb2aab0e 825 /* Process unlocked */
mbed_official 354:e67efb2aab0e 826 __HAL_UNLOCK(hadc);
mbed_official 354:e67efb2aab0e 827
mbed_official 354:e67efb2aab0e 828 /* Return function status */
mbed_official 354:e67efb2aab0e 829 return tmpHALStatus;
mbed_official 354:e67efb2aab0e 830 }
mbed_official 354:e67efb2aab0e 831
mbed_official 354:e67efb2aab0e 832 /**
mbed_official 354:e67efb2aab0e 833 * @}
mbed_official 354:e67efb2aab0e 834 */
mbed_official 354:e67efb2aab0e 835
mbed_official 354:e67efb2aab0e 836 /**
mbed_official 354:e67efb2aab0e 837 * @}
mbed_official 354:e67efb2aab0e 838 */
mbed_official 354:e67efb2aab0e 839
mbed_official 354:e67efb2aab0e 840 #endif /* HAL_ADC_MODULE_ENABLED */
mbed_official 354:e67efb2aab0e 841 /**
mbed_official 354:e67efb2aab0e 842 * @}
mbed_official 354:e67efb2aab0e 843 */
mbed_official 354:e67efb2aab0e 844
mbed_official 354:e67efb2aab0e 845 /**
mbed_official 354:e67efb2aab0e 846 * @}
mbed_official 354:e67efb2aab0e 847 */
mbed_official 354:e67efb2aab0e 848
mbed_official 354:e67efb2aab0e 849 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/