SPKT

Dependencies:   F746_GUI SD_PlayerSkeleton F746_SAI_IO

Committer:
phungductung
Date:
Tue Jun 04 21:37:21 2019 +0000
Revision:
0:8ede47d38d10
SPKT

Who changed what in which revision?

UserRevisionLine numberNew contents of line
phungductung 0:8ede47d38d10 1 /**
phungductung 0:8ede47d38d10 2 ******************************************************************************
phungductung 0:8ede47d38d10 3 * @file stm32f7xx_hal_adc_ex.c
phungductung 0:8ede47d38d10 4 * @author MCD Application Team
phungductung 0:8ede47d38d10 5 * @version V1.0.4
phungductung 0:8ede47d38d10 6 * @date 09-December-2015
phungductung 0:8ede47d38d10 7 * @brief This file provides firmware functions to manage the following
phungductung 0:8ede47d38d10 8 * functionalities of the ADC extension peripheral:
phungductung 0:8ede47d38d10 9 * + Extended features functions
phungductung 0:8ede47d38d10 10 *
phungductung 0:8ede47d38d10 11 @verbatim
phungductung 0:8ede47d38d10 12 ==============================================================================
phungductung 0:8ede47d38d10 13 ##### How to use this driver #####
phungductung 0:8ede47d38d10 14 ==============================================================================
phungductung 0:8ede47d38d10 15 [..]
phungductung 0:8ede47d38d10 16 (#)Initialize the ADC low level resources by implementing the HAL_ADC_MspInit():
phungductung 0:8ede47d38d10 17 (##) Enable the ADC interface clock using __HAL_RCC_ADC_CLK_ENABLE()
phungductung 0:8ede47d38d10 18 (##) ADC pins configuration
phungductung 0:8ede47d38d10 19 (+++) Enable the clock for the ADC GPIOs using the following function:
phungductung 0:8ede47d38d10 20 __HAL_RCC_GPIOx_CLK_ENABLE()
phungductung 0:8ede47d38d10 21 (+++) Configure these ADC pins in analog mode using HAL_GPIO_Init()
phungductung 0:8ede47d38d10 22 (##) In case of using interrupts (e.g. HAL_ADC_Start_IT())
phungductung 0:8ede47d38d10 23 (+++) Configure the ADC interrupt priority using HAL_NVIC_SetPriority()
phungductung 0:8ede47d38d10 24 (+++) Enable the ADC IRQ handler using HAL_NVIC_EnableIRQ()
phungductung 0:8ede47d38d10 25 (+++) In ADC IRQ handler, call HAL_ADC_IRQHandler()
phungductung 0:8ede47d38d10 26 (##) In case of using DMA to control data transfer (e.g. HAL_ADC_Start_DMA())
phungductung 0:8ede47d38d10 27 (+++) Enable the DMAx interface clock using __HAL_RCC_DMAx_CLK_ENABLE()
phungductung 0:8ede47d38d10 28 (+++) Configure and enable two DMA streams stream for managing data
phungductung 0:8ede47d38d10 29 transfer from peripheral to memory (output stream)
phungductung 0:8ede47d38d10 30 (+++) Associate the initialized DMA handle to the ADC DMA handle
phungductung 0:8ede47d38d10 31 using __HAL_LINKDMA()
phungductung 0:8ede47d38d10 32 (+++) Configure the priority and enable the NVIC for the transfer complete
phungductung 0:8ede47d38d10 33 interrupt on the two DMA Streams. The output stream should have higher
phungductung 0:8ede47d38d10 34 priority than the input stream.
phungductung 0:8ede47d38d10 35 (#) Configure the ADC Prescaler, conversion resolution and data alignment
phungductung 0:8ede47d38d10 36 using the HAL_ADC_Init() function.
phungductung 0:8ede47d38d10 37
phungductung 0:8ede47d38d10 38 (#) Configure the ADC Injected channels group features, use HAL_ADC_Init()
phungductung 0:8ede47d38d10 39 and HAL_ADC_ConfigChannel() functions.
phungductung 0:8ede47d38d10 40
phungductung 0:8ede47d38d10 41 (#) Three operation modes are available within this driver :
phungductung 0:8ede47d38d10 42
phungductung 0:8ede47d38d10 43 *** Polling mode IO operation ***
phungductung 0:8ede47d38d10 44 =================================
phungductung 0:8ede47d38d10 45 [..]
phungductung 0:8ede47d38d10 46 (+) Start the ADC peripheral using HAL_ADCEx_InjectedStart()
phungductung 0:8ede47d38d10 47 (+) Wait for end of conversion using HAL_ADC_PollForConversion(), at this stage
phungductung 0:8ede47d38d10 48 user can specify the value of timeout according to his end application
phungductung 0:8ede47d38d10 49 (+) To read the ADC converted values, use the HAL_ADCEx_InjectedGetValue() function.
phungductung 0:8ede47d38d10 50 (+) Stop the ADC peripheral using HAL_ADCEx_InjectedStop()
phungductung 0:8ede47d38d10 51
phungductung 0:8ede47d38d10 52 *** Interrupt mode IO operation ***
phungductung 0:8ede47d38d10 53 ===================================
phungductung 0:8ede47d38d10 54 [..]
phungductung 0:8ede47d38d10 55 (+) Start the ADC peripheral using HAL_ADCEx_InjectedStart_IT()
phungductung 0:8ede47d38d10 56 (+) Use HAL_ADC_IRQHandler() called under ADC_IRQHandler() Interrupt subroutine
phungductung 0:8ede47d38d10 57 (+) At ADC end of conversion HAL_ADCEx_InjectedConvCpltCallback() function is executed and user can
phungductung 0:8ede47d38d10 58 add his own code by customization of function pointer HAL_ADCEx_InjectedConvCpltCallback
phungductung 0:8ede47d38d10 59 (+) In case of ADC Error, HAL_ADCEx_InjectedErrorCallback() function is executed and user can
phungductung 0:8ede47d38d10 60 add his own code by customization of function pointer HAL_ADCEx_InjectedErrorCallback
phungductung 0:8ede47d38d10 61 (+) Stop the ADC peripheral using HAL_ADCEx_InjectedStop_IT()
phungductung 0:8ede47d38d10 62
phungductung 0:8ede47d38d10 63
phungductung 0:8ede47d38d10 64 *** DMA mode IO operation ***
phungductung 0:8ede47d38d10 65 ==============================
phungductung 0:8ede47d38d10 66 [..]
phungductung 0:8ede47d38d10 67 (+) Start the ADC peripheral using HAL_ADCEx_InjectedStart_DMA(), at this stage the user specify the length
phungductung 0:8ede47d38d10 68 of data to be transferred at each end of conversion
phungductung 0:8ede47d38d10 69 (+) At The end of data transfer ba HAL_ADCEx_InjectedConvCpltCallback() function is executed and user can
phungductung 0:8ede47d38d10 70 add his own code by customization of function pointer HAL_ADCEx_InjectedConvCpltCallback
phungductung 0:8ede47d38d10 71 (+) In case of transfer Error, HAL_ADCEx_InjectedErrorCallback() function is executed and user can
phungductung 0:8ede47d38d10 72 add his own code by customization of function pointer HAL_ADCEx_InjectedErrorCallback
phungductung 0:8ede47d38d10 73 (+) Stop the ADC peripheral using HAL_ADCEx_InjectedStop_DMA()
phungductung 0:8ede47d38d10 74
phungductung 0:8ede47d38d10 75 *** Multi mode ADCs Regular channels configuration ***
phungductung 0:8ede47d38d10 76 ======================================================
phungductung 0:8ede47d38d10 77 [..]
phungductung 0:8ede47d38d10 78 (+) Select the Multi mode ADC regular channels features (dual or triple mode)
phungductung 0:8ede47d38d10 79 and configure the DMA mode using HAL_ADCEx_MultiModeConfigChannel() functions.
phungductung 0:8ede47d38d10 80 (+) Start the ADC peripheral using HAL_ADCEx_MultiModeStart_DMA(), at this stage the user specify the length
phungductung 0:8ede47d38d10 81 of data to be transferred at each end of conversion
phungductung 0:8ede47d38d10 82 (+) Read the ADCs converted values using the HAL_ADCEx_MultiModeGetValue() function.
phungductung 0:8ede47d38d10 83
phungductung 0:8ede47d38d10 84
phungductung 0:8ede47d38d10 85 @endverbatim
phungductung 0:8ede47d38d10 86 ******************************************************************************
phungductung 0:8ede47d38d10 87 * @attention
phungductung 0:8ede47d38d10 88 *
phungductung 0:8ede47d38d10 89 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
phungductung 0:8ede47d38d10 90 *
phungductung 0:8ede47d38d10 91 * Redistribution and use in source and binary forms, with or without modification,
phungductung 0:8ede47d38d10 92 * are permitted provided that the following conditions are met:
phungductung 0:8ede47d38d10 93 * 1. Redistributions of source code must retain the above copyright notice,
phungductung 0:8ede47d38d10 94 * this list of conditions and the following disclaimer.
phungductung 0:8ede47d38d10 95 * 2. Redistributions in binary form must reproduce the above copyright notice,
phungductung 0:8ede47d38d10 96 * this list of conditions and the following disclaimer in the documentation
phungductung 0:8ede47d38d10 97 * and/or other materials provided with the distribution.
phungductung 0:8ede47d38d10 98 * 3. Neither the name of STMicroelectronics nor the names of its contributors
phungductung 0:8ede47d38d10 99 * may be used to endorse or promote products derived from this software
phungductung 0:8ede47d38d10 100 * without specific prior written permission.
phungductung 0:8ede47d38d10 101 *
phungductung 0:8ede47d38d10 102 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
phungductung 0:8ede47d38d10 103 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
phungductung 0:8ede47d38d10 104 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
phungductung 0:8ede47d38d10 105 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
phungductung 0:8ede47d38d10 106 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
phungductung 0:8ede47d38d10 107 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
phungductung 0:8ede47d38d10 108 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
phungductung 0:8ede47d38d10 109 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
phungductung 0:8ede47d38d10 110 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
phungductung 0:8ede47d38d10 111 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
phungductung 0:8ede47d38d10 112 *
phungductung 0:8ede47d38d10 113 ******************************************************************************
phungductung 0:8ede47d38d10 114 */
phungductung 0:8ede47d38d10 115
phungductung 0:8ede47d38d10 116 /* Includes ------------------------------------------------------------------*/
phungductung 0:8ede47d38d10 117 #include "stm32f7xx_hal.h"
phungductung 0:8ede47d38d10 118
phungductung 0:8ede47d38d10 119 /** @addtogroup STM32F7xx_HAL_Driver
phungductung 0:8ede47d38d10 120 * @{
phungductung 0:8ede47d38d10 121 */
phungductung 0:8ede47d38d10 122
phungductung 0:8ede47d38d10 123 /** @defgroup ADCEx ADCEx
phungductung 0:8ede47d38d10 124 * @brief ADC Extended driver modules
phungductung 0:8ede47d38d10 125 * @{
phungductung 0:8ede47d38d10 126 */
phungductung 0:8ede47d38d10 127
phungductung 0:8ede47d38d10 128 #ifdef HAL_ADC_MODULE_ENABLED
phungductung 0:8ede47d38d10 129
phungductung 0:8ede47d38d10 130 /* Private typedef -----------------------------------------------------------*/
phungductung 0:8ede47d38d10 131 /* Private define ------------------------------------------------------------*/
phungductung 0:8ede47d38d10 132 /* Private macro -------------------------------------------------------------*/
phungductung 0:8ede47d38d10 133 /* Private variables ---------------------------------------------------------*/
phungductung 0:8ede47d38d10 134 /** @addtogroup ADCEx_Private_Functions
phungductung 0:8ede47d38d10 135 * @{
phungductung 0:8ede47d38d10 136 */
phungductung 0:8ede47d38d10 137 /* Private function prototypes -----------------------------------------------*/
phungductung 0:8ede47d38d10 138 static void ADC_MultiModeDMAConvCplt(DMA_HandleTypeDef *hdma);
phungductung 0:8ede47d38d10 139 static void ADC_MultiModeDMAError(DMA_HandleTypeDef *hdma);
phungductung 0:8ede47d38d10 140 static void ADC_MultiModeDMAHalfConvCplt(DMA_HandleTypeDef *hdma);
phungductung 0:8ede47d38d10 141 /**
phungductung 0:8ede47d38d10 142 * @}
phungductung 0:8ede47d38d10 143 */
phungductung 0:8ede47d38d10 144
phungductung 0:8ede47d38d10 145 /* Exported functions --------------------------------------------------------*/
phungductung 0:8ede47d38d10 146 /** @defgroup ADCEx_Exported_Functions ADC Exported Functions
phungductung 0:8ede47d38d10 147 * @{
phungductung 0:8ede47d38d10 148 */
phungductung 0:8ede47d38d10 149
phungductung 0:8ede47d38d10 150 /** @defgroup ADCEx_Exported_Functions_Group1 Extended features functions
phungductung 0:8ede47d38d10 151 * @brief Extended features functions
phungductung 0:8ede47d38d10 152 *
phungductung 0:8ede47d38d10 153 @verbatim
phungductung 0:8ede47d38d10 154 ===============================================================================
phungductung 0:8ede47d38d10 155 ##### Extended features functions #####
phungductung 0:8ede47d38d10 156 ===============================================================================
phungductung 0:8ede47d38d10 157 [..] This section provides functions allowing to:
phungductung 0:8ede47d38d10 158 (+) Start conversion of injected channel.
phungductung 0:8ede47d38d10 159 (+) Stop conversion of injected channel.
phungductung 0:8ede47d38d10 160 (+) Start multimode and enable DMA transfer.
phungductung 0:8ede47d38d10 161 (+) Stop multimode and disable DMA transfer.
phungductung 0:8ede47d38d10 162 (+) Get result of injected channel conversion.
phungductung 0:8ede47d38d10 163 (+) Get result of multimode conversion.
phungductung 0:8ede47d38d10 164 (+) Configure injected channels.
phungductung 0:8ede47d38d10 165 (+) Configure multimode.
phungductung 0:8ede47d38d10 166
phungductung 0:8ede47d38d10 167 @endverbatim
phungductung 0:8ede47d38d10 168 * @{
phungductung 0:8ede47d38d10 169 */
phungductung 0:8ede47d38d10 170
phungductung 0:8ede47d38d10 171 /**
phungductung 0:8ede47d38d10 172 * @brief Enables the selected ADC software start conversion of the injected channels.
phungductung 0:8ede47d38d10 173 * @param hadc: pointer to a ADC_HandleTypeDef structure that contains
phungductung 0:8ede47d38d10 174 * the configuration information for the specified ADC.
phungductung 0:8ede47d38d10 175 * @retval HAL status
phungductung 0:8ede47d38d10 176 */
phungductung 0:8ede47d38d10 177 HAL_StatusTypeDef HAL_ADCEx_InjectedStart(ADC_HandleTypeDef* hadc)
phungductung 0:8ede47d38d10 178 {
phungductung 0:8ede47d38d10 179 __IO uint32_t counter = 0;
phungductung 0:8ede47d38d10 180 uint32_t tmp1 = 0, tmp2 = 0;
phungductung 0:8ede47d38d10 181
phungductung 0:8ede47d38d10 182 /* Process locked */
phungductung 0:8ede47d38d10 183 __HAL_LOCK(hadc);
phungductung 0:8ede47d38d10 184
phungductung 0:8ede47d38d10 185 /* Enable the ADC peripheral */
phungductung 0:8ede47d38d10 186
phungductung 0:8ede47d38d10 187 /* Check if ADC peripheral is disabled in order to enable it and wait during
phungductung 0:8ede47d38d10 188 Tstab time the ADC's stabilization */
phungductung 0:8ede47d38d10 189 if((hadc->Instance->CR2 & ADC_CR2_ADON) != ADC_CR2_ADON)
phungductung 0:8ede47d38d10 190 {
phungductung 0:8ede47d38d10 191 /* Enable the Peripheral */
phungductung 0:8ede47d38d10 192 __HAL_ADC_ENABLE(hadc);
phungductung 0:8ede47d38d10 193
phungductung 0:8ede47d38d10 194 /* Delay for ADC stabilization time */
phungductung 0:8ede47d38d10 195 /* Compute number of CPU cycles to wait for */
phungductung 0:8ede47d38d10 196 counter = (ADC_STAB_DELAY_US * (SystemCoreClock / 1000000));
phungductung 0:8ede47d38d10 197 while(counter != 0)
phungductung 0:8ede47d38d10 198 {
phungductung 0:8ede47d38d10 199 counter--;
phungductung 0:8ede47d38d10 200 }
phungductung 0:8ede47d38d10 201 }
phungductung 0:8ede47d38d10 202
phungductung 0:8ede47d38d10 203 /* Start conversion if ADC is effectively enabled */
phungductung 0:8ede47d38d10 204 if(HAL_IS_BIT_SET(hadc->Instance->CR2, ADC_CR2_ADON))
phungductung 0:8ede47d38d10 205 {
phungductung 0:8ede47d38d10 206 /* Set ADC state */
phungductung 0:8ede47d38d10 207 /* - Clear state bitfield related to injected group conversion results */
phungductung 0:8ede47d38d10 208 /* - Set state bitfield related to injected operation */
phungductung 0:8ede47d38d10 209 ADC_STATE_CLR_SET(hadc->State,
phungductung 0:8ede47d38d10 210 HAL_ADC_STATE_READY | HAL_ADC_STATE_INJ_EOC,
phungductung 0:8ede47d38d10 211 HAL_ADC_STATE_INJ_BUSY);
phungductung 0:8ede47d38d10 212
phungductung 0:8ede47d38d10 213 /* Check if a regular conversion is ongoing */
phungductung 0:8ede47d38d10 214 /* Note: On this device, there is no ADC error code fields related to */
phungductung 0:8ede47d38d10 215 /* conversions on group injected only. In case of conversion on */
phungductung 0:8ede47d38d10 216 /* going on group regular, no error code is reset. */
phungductung 0:8ede47d38d10 217 if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_REG_BUSY))
phungductung 0:8ede47d38d10 218 {
phungductung 0:8ede47d38d10 219 /* Reset ADC all error code fields */
phungductung 0:8ede47d38d10 220 ADC_CLEAR_ERRORCODE(hadc);
phungductung 0:8ede47d38d10 221 }
phungductung 0:8ede47d38d10 222
phungductung 0:8ede47d38d10 223 /* Process unlocked */
phungductung 0:8ede47d38d10 224 /* Unlock before starting ADC conversions: in case of potential */
phungductung 0:8ede47d38d10 225 /* interruption, to let the process to ADC IRQ Handler. */
phungductung 0:8ede47d38d10 226 __HAL_UNLOCK(hadc);
phungductung 0:8ede47d38d10 227
phungductung 0:8ede47d38d10 228 /* Clear injected group conversion flag */
phungductung 0:8ede47d38d10 229 /* (To ensure of no unknown state from potential previous ADC operations) */
phungductung 0:8ede47d38d10 230 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JEOC);
phungductung 0:8ede47d38d10 231
phungductung 0:8ede47d38d10 232 /* Check if Multimode enabled */
phungductung 0:8ede47d38d10 233 if(HAL_IS_BIT_CLR(ADC->CCR, ADC_CCR_MULTI))
phungductung 0:8ede47d38d10 234 {
phungductung 0:8ede47d38d10 235 tmp1 = HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_JEXTEN);
phungductung 0:8ede47d38d10 236 tmp2 = HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO);
phungductung 0:8ede47d38d10 237 if(tmp1 && tmp2)
phungductung 0:8ede47d38d10 238 {
phungductung 0:8ede47d38d10 239 /* Enable the selected ADC software conversion for injected group */
phungductung 0:8ede47d38d10 240 hadc->Instance->CR2 |= ADC_CR2_JSWSTART;
phungductung 0:8ede47d38d10 241 }
phungductung 0:8ede47d38d10 242 }
phungductung 0:8ede47d38d10 243 else
phungductung 0:8ede47d38d10 244 {
phungductung 0:8ede47d38d10 245 tmp1 = HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_JEXTEN);
phungductung 0:8ede47d38d10 246 tmp2 = HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO);
phungductung 0:8ede47d38d10 247 if((hadc->Instance == ADC1) && tmp1 && tmp2)
phungductung 0:8ede47d38d10 248 {
phungductung 0:8ede47d38d10 249 /* Enable the selected ADC software conversion for injected group */
phungductung 0:8ede47d38d10 250 hadc->Instance->CR2 |= ADC_CR2_JSWSTART;
phungductung 0:8ede47d38d10 251 }
phungductung 0:8ede47d38d10 252 }
phungductung 0:8ede47d38d10 253 }
phungductung 0:8ede47d38d10 254
phungductung 0:8ede47d38d10 255 /* Return function status */
phungductung 0:8ede47d38d10 256 return HAL_OK;
phungductung 0:8ede47d38d10 257 }
phungductung 0:8ede47d38d10 258
phungductung 0:8ede47d38d10 259 /**
phungductung 0:8ede47d38d10 260 * @brief Enables the interrupt and starts ADC conversion of injected channels.
phungductung 0:8ede47d38d10 261 * @param hadc: pointer to a ADC_HandleTypeDef structure that contains
phungductung 0:8ede47d38d10 262 * the configuration information for the specified ADC.
phungductung 0:8ede47d38d10 263 *
phungductung 0:8ede47d38d10 264 * @retval HAL status.
phungductung 0:8ede47d38d10 265 */
phungductung 0:8ede47d38d10 266 HAL_StatusTypeDef HAL_ADCEx_InjectedStart_IT(ADC_HandleTypeDef* hadc)
phungductung 0:8ede47d38d10 267 {
phungductung 0:8ede47d38d10 268 __IO uint32_t counter = 0;
phungductung 0:8ede47d38d10 269 uint32_t tmp1 = 0, tmp2 = 0;
phungductung 0:8ede47d38d10 270
phungductung 0:8ede47d38d10 271 /* Process locked */
phungductung 0:8ede47d38d10 272 __HAL_LOCK(hadc);
phungductung 0:8ede47d38d10 273
phungductung 0:8ede47d38d10 274 /* Enable the ADC peripheral */
phungductung 0:8ede47d38d10 275
phungductung 0:8ede47d38d10 276 /* Check if ADC peripheral is disabled in order to enable it and wait during
phungductung 0:8ede47d38d10 277 Tstab time the ADC's stabilization */
phungductung 0:8ede47d38d10 278 if((hadc->Instance->CR2 & ADC_CR2_ADON) != ADC_CR2_ADON)
phungductung 0:8ede47d38d10 279 {
phungductung 0:8ede47d38d10 280 /* Enable the Peripheral */
phungductung 0:8ede47d38d10 281 __HAL_ADC_ENABLE(hadc);
phungductung 0:8ede47d38d10 282
phungductung 0:8ede47d38d10 283 /* Delay for ADC stabilization time */
phungductung 0:8ede47d38d10 284 /* Compute number of CPU cycles to wait for */
phungductung 0:8ede47d38d10 285 counter = (ADC_STAB_DELAY_US * (SystemCoreClock / 1000000));
phungductung 0:8ede47d38d10 286 while(counter != 0)
phungductung 0:8ede47d38d10 287 {
phungductung 0:8ede47d38d10 288 counter--;
phungductung 0:8ede47d38d10 289 }
phungductung 0:8ede47d38d10 290 }
phungductung 0:8ede47d38d10 291
phungductung 0:8ede47d38d10 292 /* Start conversion if ADC is effectively enabled */
phungductung 0:8ede47d38d10 293 if(HAL_IS_BIT_SET(hadc->Instance->CR2, ADC_CR2_ADON))
phungductung 0:8ede47d38d10 294 {
phungductung 0:8ede47d38d10 295 /* Set ADC state */
phungductung 0:8ede47d38d10 296 /* - Clear state bitfield related to injected group conversion results */
phungductung 0:8ede47d38d10 297 /* - Set state bitfield related to injected operation */
phungductung 0:8ede47d38d10 298 ADC_STATE_CLR_SET(hadc->State,
phungductung 0:8ede47d38d10 299 HAL_ADC_STATE_READY | HAL_ADC_STATE_INJ_EOC,
phungductung 0:8ede47d38d10 300 HAL_ADC_STATE_INJ_BUSY);
phungductung 0:8ede47d38d10 301
phungductung 0:8ede47d38d10 302 /* Check if a regular conversion is ongoing */
phungductung 0:8ede47d38d10 303 /* Note: On this device, there is no ADC error code fields related to */
phungductung 0:8ede47d38d10 304 /* conversions on group injected only. In case of conversion on */
phungductung 0:8ede47d38d10 305 /* going on group regular, no error code is reset. */
phungductung 0:8ede47d38d10 306 if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_REG_BUSY))
phungductung 0:8ede47d38d10 307 {
phungductung 0:8ede47d38d10 308 /* Reset ADC all error code fields */
phungductung 0:8ede47d38d10 309 ADC_CLEAR_ERRORCODE(hadc);
phungductung 0:8ede47d38d10 310 }
phungductung 0:8ede47d38d10 311
phungductung 0:8ede47d38d10 312 /* Process unlocked */
phungductung 0:8ede47d38d10 313 /* Unlock before starting ADC conversions: in case of potential */
phungductung 0:8ede47d38d10 314 /* interruption, to let the process to ADC IRQ Handler. */
phungductung 0:8ede47d38d10 315 __HAL_UNLOCK(hadc);
phungductung 0:8ede47d38d10 316
phungductung 0:8ede47d38d10 317 /* Clear injected group conversion flag */
phungductung 0:8ede47d38d10 318 /* (To ensure of no unknown state from potential previous ADC operations) */
phungductung 0:8ede47d38d10 319 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JEOC);
phungductung 0:8ede47d38d10 320
phungductung 0:8ede47d38d10 321 /* Enable end of conversion interrupt for injected channels */
phungductung 0:8ede47d38d10 322 __HAL_ADC_ENABLE_IT(hadc, ADC_IT_JEOC);
phungductung 0:8ede47d38d10 323
phungductung 0:8ede47d38d10 324 /* Check if Multimode enabled */
phungductung 0:8ede47d38d10 325 if(HAL_IS_BIT_CLR(ADC->CCR, ADC_CCR_MULTI))
phungductung 0:8ede47d38d10 326 {
phungductung 0:8ede47d38d10 327 tmp1 = HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_JEXTEN);
phungductung 0:8ede47d38d10 328 tmp2 = HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO);
phungductung 0:8ede47d38d10 329 if(tmp1 && tmp2)
phungductung 0:8ede47d38d10 330 {
phungductung 0:8ede47d38d10 331 /* Enable the selected ADC software conversion for injected group */
phungductung 0:8ede47d38d10 332 hadc->Instance->CR2 |= ADC_CR2_JSWSTART;
phungductung 0:8ede47d38d10 333 }
phungductung 0:8ede47d38d10 334 }
phungductung 0:8ede47d38d10 335 else
phungductung 0:8ede47d38d10 336 {
phungductung 0:8ede47d38d10 337 tmp1 = HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_JEXTEN);
phungductung 0:8ede47d38d10 338 tmp2 = HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO);
phungductung 0:8ede47d38d10 339 if((hadc->Instance == ADC1) && tmp1 && tmp2)
phungductung 0:8ede47d38d10 340 {
phungductung 0:8ede47d38d10 341 /* Enable the selected ADC software conversion for injected group */
phungductung 0:8ede47d38d10 342 hadc->Instance->CR2 |= ADC_CR2_JSWSTART;
phungductung 0:8ede47d38d10 343 }
phungductung 0:8ede47d38d10 344 }
phungductung 0:8ede47d38d10 345 }
phungductung 0:8ede47d38d10 346
phungductung 0:8ede47d38d10 347 /* Return function status */
phungductung 0:8ede47d38d10 348 return HAL_OK;
phungductung 0:8ede47d38d10 349 }
phungductung 0:8ede47d38d10 350
phungductung 0:8ede47d38d10 351 /**
phungductung 0:8ede47d38d10 352 * @brief Stop conversion of injected channels. Disable ADC peripheral if
phungductung 0:8ede47d38d10 353 * no regular conversion is on going.
phungductung 0:8ede47d38d10 354 * @note If ADC must be disabled and if conversion is on going on
phungductung 0:8ede47d38d10 355 * regular group, function HAL_ADC_Stop must be used to stop both
phungductung 0:8ede47d38d10 356 * injected and regular groups, and disable the ADC.
phungductung 0:8ede47d38d10 357 * @note If injected group mode auto-injection is enabled,
phungductung 0:8ede47d38d10 358 * function HAL_ADC_Stop must be used.
phungductung 0:8ede47d38d10 359 * @note In case of auto-injection mode, HAL_ADC_Stop must be used.
phungductung 0:8ede47d38d10 360 * @param hadc: ADC handle
phungductung 0:8ede47d38d10 361 * @retval None
phungductung 0:8ede47d38d10 362 */
phungductung 0:8ede47d38d10 363 HAL_StatusTypeDef HAL_ADCEx_InjectedStop(ADC_HandleTypeDef* hadc)
phungductung 0:8ede47d38d10 364 {
phungductung 0:8ede47d38d10 365 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
phungductung 0:8ede47d38d10 366
phungductung 0:8ede47d38d10 367 /* Check the parameters */
phungductung 0:8ede47d38d10 368 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
phungductung 0:8ede47d38d10 369
phungductung 0:8ede47d38d10 370 /* Process locked */
phungductung 0:8ede47d38d10 371 __HAL_LOCK(hadc);
phungductung 0:8ede47d38d10 372
phungductung 0:8ede47d38d10 373 /* Stop potential conversion and disable ADC peripheral */
phungductung 0:8ede47d38d10 374 /* Conditioned to: */
phungductung 0:8ede47d38d10 375 /* - No conversion on the other group (regular group) is intended to */
phungductung 0:8ede47d38d10 376 /* continue (injected and regular groups stop conversion and ADC disable */
phungductung 0:8ede47d38d10 377 /* are common) */
phungductung 0:8ede47d38d10 378 /* - In case of auto-injection mode, HAL_ADC_Stop must be used. */
phungductung 0:8ede47d38d10 379 if(((hadc->State & HAL_ADC_STATE_REG_BUSY) == RESET) &&
phungductung 0:8ede47d38d10 380 HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO) )
phungductung 0:8ede47d38d10 381 {
phungductung 0:8ede47d38d10 382 /* Stop potential conversion on going, on regular and injected groups */
phungductung 0:8ede47d38d10 383 /* Disable ADC peripheral */
phungductung 0:8ede47d38d10 384 __HAL_ADC_DISABLE(hadc);
phungductung 0:8ede47d38d10 385
phungductung 0:8ede47d38d10 386 /* Check if ADC is effectively disabled */
phungductung 0:8ede47d38d10 387 if(HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_ADON))
phungductung 0:8ede47d38d10 388 {
phungductung 0:8ede47d38d10 389 /* Set ADC state */
phungductung 0:8ede47d38d10 390 ADC_STATE_CLR_SET(hadc->State,
phungductung 0:8ede47d38d10 391 HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY,
phungductung 0:8ede47d38d10 392 HAL_ADC_STATE_READY);
phungductung 0:8ede47d38d10 393 }
phungductung 0:8ede47d38d10 394 }
phungductung 0:8ede47d38d10 395 else
phungductung 0:8ede47d38d10 396 {
phungductung 0:8ede47d38d10 397 /* Update ADC state machine to error */
phungductung 0:8ede47d38d10 398 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
phungductung 0:8ede47d38d10 399
phungductung 0:8ede47d38d10 400 tmp_hal_status = HAL_ERROR;
phungductung 0:8ede47d38d10 401 }
phungductung 0:8ede47d38d10 402
phungductung 0:8ede47d38d10 403 /* Process unlocked */
phungductung 0:8ede47d38d10 404 __HAL_UNLOCK(hadc);
phungductung 0:8ede47d38d10 405
phungductung 0:8ede47d38d10 406 /* Return function status */
phungductung 0:8ede47d38d10 407 return tmp_hal_status;
phungductung 0:8ede47d38d10 408 }
phungductung 0:8ede47d38d10 409
phungductung 0:8ede47d38d10 410 /**
phungductung 0:8ede47d38d10 411 * @brief Poll for injected conversion complete
phungductung 0:8ede47d38d10 412 * @param hadc: pointer to a ADC_HandleTypeDef structure that contains
phungductung 0:8ede47d38d10 413 * the configuration information for the specified ADC.
phungductung 0:8ede47d38d10 414 * @param Timeout: Timeout value in millisecond.
phungductung 0:8ede47d38d10 415 * @retval HAL status
phungductung 0:8ede47d38d10 416 */
phungductung 0:8ede47d38d10 417 HAL_StatusTypeDef HAL_ADCEx_InjectedPollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout)
phungductung 0:8ede47d38d10 418 {
phungductung 0:8ede47d38d10 419 uint32_t tickstart = 0;
phungductung 0:8ede47d38d10 420
phungductung 0:8ede47d38d10 421 /* Get tick */
phungductung 0:8ede47d38d10 422 tickstart = HAL_GetTick();
phungductung 0:8ede47d38d10 423
phungductung 0:8ede47d38d10 424 /* Check End of conversion flag */
phungductung 0:8ede47d38d10 425 while(!(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_JEOC)))
phungductung 0:8ede47d38d10 426 {
phungductung 0:8ede47d38d10 427 /* Check for the Timeout */
phungductung 0:8ede47d38d10 428 if(Timeout != HAL_MAX_DELAY)
phungductung 0:8ede47d38d10 429 {
phungductung 0:8ede47d38d10 430 if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
phungductung 0:8ede47d38d10 431 {
phungductung 0:8ede47d38d10 432 hadc->State= HAL_ADC_STATE_TIMEOUT;
phungductung 0:8ede47d38d10 433 /* Process unlocked */
phungductung 0:8ede47d38d10 434 __HAL_UNLOCK(hadc);
phungductung 0:8ede47d38d10 435 return HAL_TIMEOUT;
phungductung 0:8ede47d38d10 436 }
phungductung 0:8ede47d38d10 437 }
phungductung 0:8ede47d38d10 438 }
phungductung 0:8ede47d38d10 439
phungductung 0:8ede47d38d10 440 /* Clear injected group conversion flag */
phungductung 0:8ede47d38d10 441 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JSTRT | ADC_FLAG_JEOC);
phungductung 0:8ede47d38d10 442
phungductung 0:8ede47d38d10 443 /* Update ADC state machine */
phungductung 0:8ede47d38d10 444 SET_BIT(hadc->State, HAL_ADC_STATE_INJ_EOC);
phungductung 0:8ede47d38d10 445
phungductung 0:8ede47d38d10 446 /* Determine whether any further conversion upcoming on group injected */
phungductung 0:8ede47d38d10 447 /* by external trigger, continuous mode or scan sequence on going. */
phungductung 0:8ede47d38d10 448 /* Note: On STM32F7, there is no independent flag of end of sequence. */
phungductung 0:8ede47d38d10 449 /* The test of scan sequence on going is done either with scan */
phungductung 0:8ede47d38d10 450 /* sequence disabled or with end of conversion flag set to */
phungductung 0:8ede47d38d10 451 /* of end of sequence. */
phungductung 0:8ede47d38d10 452 if(ADC_IS_SOFTWARE_START_INJECTED(hadc) &&
phungductung 0:8ede47d38d10 453 (HAL_IS_BIT_CLR(hadc->Instance->JSQR, ADC_JSQR_JL) ||
phungductung 0:8ede47d38d10 454 HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_EOCS) ) &&
phungductung 0:8ede47d38d10 455 (HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO) &&
phungductung 0:8ede47d38d10 456 (ADC_IS_SOFTWARE_START_REGULAR(hadc) &&
phungductung 0:8ede47d38d10 457 (hadc->Init.ContinuousConvMode == DISABLE) ) ) )
phungductung 0:8ede47d38d10 458 {
phungductung 0:8ede47d38d10 459 /* Set ADC state */
phungductung 0:8ede47d38d10 460 CLEAR_BIT(hadc->State, HAL_ADC_STATE_INJ_BUSY);
phungductung 0:8ede47d38d10 461
phungductung 0:8ede47d38d10 462 if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_REG_BUSY))
phungductung 0:8ede47d38d10 463 {
phungductung 0:8ede47d38d10 464 SET_BIT(hadc->State, HAL_ADC_STATE_READY);
phungductung 0:8ede47d38d10 465 }
phungductung 0:8ede47d38d10 466 }
phungductung 0:8ede47d38d10 467
phungductung 0:8ede47d38d10 468 /* Return ADC state */
phungductung 0:8ede47d38d10 469 return HAL_OK;
phungductung 0:8ede47d38d10 470 }
phungductung 0:8ede47d38d10 471
phungductung 0:8ede47d38d10 472 /**
phungductung 0:8ede47d38d10 473 * @brief Stop conversion of injected channels, disable interruption of
phungductung 0:8ede47d38d10 474 * end-of-conversion. Disable ADC peripheral if no regular conversion
phungductung 0:8ede47d38d10 475 * is on going.
phungductung 0:8ede47d38d10 476 * @note If ADC must be disabled and if conversion is on going on
phungductung 0:8ede47d38d10 477 * regular group, function HAL_ADC_Stop must be used to stop both
phungductung 0:8ede47d38d10 478 * injected and regular groups, and disable the ADC.
phungductung 0:8ede47d38d10 479 * @note If injected group mode auto-injection is enabled,
phungductung 0:8ede47d38d10 480 * function HAL_ADC_Stop must be used.
phungductung 0:8ede47d38d10 481 * @param hadc: ADC handle
phungductung 0:8ede47d38d10 482 * @retval None
phungductung 0:8ede47d38d10 483 */
phungductung 0:8ede47d38d10 484 HAL_StatusTypeDef HAL_ADCEx_InjectedStop_IT(ADC_HandleTypeDef* hadc)
phungductung 0:8ede47d38d10 485 {
phungductung 0:8ede47d38d10 486 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
phungductung 0:8ede47d38d10 487
phungductung 0:8ede47d38d10 488 /* Check the parameters */
phungductung 0:8ede47d38d10 489 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
phungductung 0:8ede47d38d10 490
phungductung 0:8ede47d38d10 491 /* Process locked */
phungductung 0:8ede47d38d10 492 __HAL_LOCK(hadc);
phungductung 0:8ede47d38d10 493
phungductung 0:8ede47d38d10 494 /* Stop potential conversion and disable ADC peripheral */
phungductung 0:8ede47d38d10 495 /* Conditioned to: */
phungductung 0:8ede47d38d10 496 /* - No conversion on the other group (regular group) is intended to */
phungductung 0:8ede47d38d10 497 /* continue (injected and regular groups stop conversion and ADC disable */
phungductung 0:8ede47d38d10 498 /* are common) */
phungductung 0:8ede47d38d10 499 /* - In case of auto-injection mode, HAL_ADC_Stop must be used. */
phungductung 0:8ede47d38d10 500 if(((hadc->State & HAL_ADC_STATE_REG_BUSY) == RESET) &&
phungductung 0:8ede47d38d10 501 HAL_IS_BIT_CLR(hadc->Instance->CR1, ADC_CR1_JAUTO) )
phungductung 0:8ede47d38d10 502 {
phungductung 0:8ede47d38d10 503 /* Stop potential conversion on going, on regular and injected groups */
phungductung 0:8ede47d38d10 504 /* Disable ADC peripheral */
phungductung 0:8ede47d38d10 505 __HAL_ADC_DISABLE(hadc);
phungductung 0:8ede47d38d10 506
phungductung 0:8ede47d38d10 507 /* Check if ADC is effectively disabled */
phungductung 0:8ede47d38d10 508 if(HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_ADON))
phungductung 0:8ede47d38d10 509 {
phungductung 0:8ede47d38d10 510 /* Disable ADC end of conversion interrupt for injected channels */
phungductung 0:8ede47d38d10 511 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_JEOC);
phungductung 0:8ede47d38d10 512
phungductung 0:8ede47d38d10 513 /* Set ADC state */
phungductung 0:8ede47d38d10 514 ADC_STATE_CLR_SET(hadc->State,
phungductung 0:8ede47d38d10 515 HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY,
phungductung 0:8ede47d38d10 516 HAL_ADC_STATE_READY);
phungductung 0:8ede47d38d10 517 }
phungductung 0:8ede47d38d10 518 }
phungductung 0:8ede47d38d10 519 else
phungductung 0:8ede47d38d10 520 {
phungductung 0:8ede47d38d10 521 /* Update ADC state machine to error */
phungductung 0:8ede47d38d10 522 SET_BIT(hadc->State, HAL_ADC_STATE_ERROR_CONFIG);
phungductung 0:8ede47d38d10 523
phungductung 0:8ede47d38d10 524 tmp_hal_status = HAL_ERROR;
phungductung 0:8ede47d38d10 525 }
phungductung 0:8ede47d38d10 526
phungductung 0:8ede47d38d10 527 /* Process unlocked */
phungductung 0:8ede47d38d10 528 __HAL_UNLOCK(hadc);
phungductung 0:8ede47d38d10 529
phungductung 0:8ede47d38d10 530 /* Return function status */
phungductung 0:8ede47d38d10 531 return tmp_hal_status;
phungductung 0:8ede47d38d10 532 }
phungductung 0:8ede47d38d10 533
phungductung 0:8ede47d38d10 534 /**
phungductung 0:8ede47d38d10 535 * @brief Gets the converted value from data register of injected channel.
phungductung 0:8ede47d38d10 536 * @param hadc: pointer to a ADC_HandleTypeDef structure that contains
phungductung 0:8ede47d38d10 537 * the configuration information for the specified ADC.
phungductung 0:8ede47d38d10 538 * @param InjectedRank: the ADC injected rank.
phungductung 0:8ede47d38d10 539 * This parameter can be one of the following values:
phungductung 0:8ede47d38d10 540 * @arg ADC_INJECTED_RANK_1: Injected Channel1 selected
phungductung 0:8ede47d38d10 541 * @arg ADC_INJECTED_RANK_2: Injected Channel2 selected
phungductung 0:8ede47d38d10 542 * @arg ADC_INJECTED_RANK_3: Injected Channel3 selected
phungductung 0:8ede47d38d10 543 * @arg ADC_INJECTED_RANK_4: Injected Channel4 selected
phungductung 0:8ede47d38d10 544 * @retval None
phungductung 0:8ede47d38d10 545 */
phungductung 0:8ede47d38d10 546 uint32_t HAL_ADCEx_InjectedGetValue(ADC_HandleTypeDef* hadc, uint32_t InjectedRank)
phungductung 0:8ede47d38d10 547 {
phungductung 0:8ede47d38d10 548 __IO uint32_t tmp = 0;
phungductung 0:8ede47d38d10 549
phungductung 0:8ede47d38d10 550 /* Check the parameters */
phungductung 0:8ede47d38d10 551 assert_param(IS_ADC_INJECTED_RANK(InjectedRank));
phungductung 0:8ede47d38d10 552
phungductung 0:8ede47d38d10 553 /* Clear injected group conversion flag to have similar behaviour as */
phungductung 0:8ede47d38d10 554 /* regular group: reading data register also clears end of conversion flag. */
phungductung 0:8ede47d38d10 555 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_JEOC);
phungductung 0:8ede47d38d10 556
phungductung 0:8ede47d38d10 557 /* Return the selected ADC converted value */
phungductung 0:8ede47d38d10 558 switch(InjectedRank)
phungductung 0:8ede47d38d10 559 {
phungductung 0:8ede47d38d10 560 case ADC_INJECTED_RANK_4:
phungductung 0:8ede47d38d10 561 {
phungductung 0:8ede47d38d10 562 tmp = hadc->Instance->JDR4;
phungductung 0:8ede47d38d10 563 }
phungductung 0:8ede47d38d10 564 break;
phungductung 0:8ede47d38d10 565 case ADC_INJECTED_RANK_3:
phungductung 0:8ede47d38d10 566 {
phungductung 0:8ede47d38d10 567 tmp = hadc->Instance->JDR3;
phungductung 0:8ede47d38d10 568 }
phungductung 0:8ede47d38d10 569 break;
phungductung 0:8ede47d38d10 570 case ADC_INJECTED_RANK_2:
phungductung 0:8ede47d38d10 571 {
phungductung 0:8ede47d38d10 572 tmp = hadc->Instance->JDR2;
phungductung 0:8ede47d38d10 573 }
phungductung 0:8ede47d38d10 574 break;
phungductung 0:8ede47d38d10 575 case ADC_INJECTED_RANK_1:
phungductung 0:8ede47d38d10 576 {
phungductung 0:8ede47d38d10 577 tmp = hadc->Instance->JDR1;
phungductung 0:8ede47d38d10 578 }
phungductung 0:8ede47d38d10 579 break;
phungductung 0:8ede47d38d10 580 default:
phungductung 0:8ede47d38d10 581 break;
phungductung 0:8ede47d38d10 582 }
phungductung 0:8ede47d38d10 583 return tmp;
phungductung 0:8ede47d38d10 584 }
phungductung 0:8ede47d38d10 585
phungductung 0:8ede47d38d10 586 /**
phungductung 0:8ede47d38d10 587 * @brief Enables ADC DMA request after last transfer (Multi-ADC mode) and enables ADC peripheral
phungductung 0:8ede47d38d10 588 *
phungductung 0:8ede47d38d10 589 * @note Caution: This function must be used only with the ADC master.
phungductung 0:8ede47d38d10 590 *
phungductung 0:8ede47d38d10 591 * @param hadc: pointer to a ADC_HandleTypeDef structure that contains
phungductung 0:8ede47d38d10 592 * the configuration information for the specified ADC.
phungductung 0:8ede47d38d10 593 * @param pData: Pointer to buffer in which transferred from ADC peripheral to memory will be stored.
phungductung 0:8ede47d38d10 594 * @param Length: The length of data to be transferred from ADC peripheral to memory.
phungductung 0:8ede47d38d10 595 * @retval HAL status
phungductung 0:8ede47d38d10 596 */
phungductung 0:8ede47d38d10 597 HAL_StatusTypeDef HAL_ADCEx_MultiModeStart_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length)
phungductung 0:8ede47d38d10 598 {
phungductung 0:8ede47d38d10 599 __IO uint32_t counter = 0;
phungductung 0:8ede47d38d10 600
phungductung 0:8ede47d38d10 601 /* Check the parameters */
phungductung 0:8ede47d38d10 602 assert_param(IS_FUNCTIONAL_STATE(hadc->Init.ContinuousConvMode));
phungductung 0:8ede47d38d10 603 assert_param(IS_ADC_EXT_TRIG_EDGE(hadc->Init.ExternalTrigConvEdge));
phungductung 0:8ede47d38d10 604 assert_param(IS_FUNCTIONAL_STATE(hadc->Init.DMAContinuousRequests));
phungductung 0:8ede47d38d10 605
phungductung 0:8ede47d38d10 606 /* Process locked */
phungductung 0:8ede47d38d10 607 __HAL_LOCK(hadc);
phungductung 0:8ede47d38d10 608
phungductung 0:8ede47d38d10 609 /* Check if ADC peripheral is disabled in order to enable it and wait during
phungductung 0:8ede47d38d10 610 Tstab time the ADC's stabilization */
phungductung 0:8ede47d38d10 611 if((hadc->Instance->CR2 & ADC_CR2_ADON) != ADC_CR2_ADON)
phungductung 0:8ede47d38d10 612 {
phungductung 0:8ede47d38d10 613 /* Enable the Peripheral */
phungductung 0:8ede47d38d10 614 __HAL_ADC_ENABLE(hadc);
phungductung 0:8ede47d38d10 615
phungductung 0:8ede47d38d10 616 /* Delay for temperature sensor stabilization time */
phungductung 0:8ede47d38d10 617 /* Compute number of CPU cycles to wait for */
phungductung 0:8ede47d38d10 618 counter = (ADC_STAB_DELAY_US * (SystemCoreClock / 1000000));
phungductung 0:8ede47d38d10 619 while(counter != 0)
phungductung 0:8ede47d38d10 620 {
phungductung 0:8ede47d38d10 621 counter--;
phungductung 0:8ede47d38d10 622 }
phungductung 0:8ede47d38d10 623 }
phungductung 0:8ede47d38d10 624
phungductung 0:8ede47d38d10 625 /* Start conversion if ADC is effectively enabled */
phungductung 0:8ede47d38d10 626 if(HAL_IS_BIT_SET(hadc->Instance->CR2, ADC_CR2_ADON))
phungductung 0:8ede47d38d10 627 {
phungductung 0:8ede47d38d10 628 /* Set ADC state */
phungductung 0:8ede47d38d10 629 /* - Clear state bitfield related to regular group conversion results */
phungductung 0:8ede47d38d10 630 /* - Set state bitfield related to regular group operation */
phungductung 0:8ede47d38d10 631 ADC_STATE_CLR_SET(hadc->State,
phungductung 0:8ede47d38d10 632 HAL_ADC_STATE_READY | HAL_ADC_STATE_REG_EOC | HAL_ADC_STATE_REG_OVR,
phungductung 0:8ede47d38d10 633 HAL_ADC_STATE_REG_BUSY);
phungductung 0:8ede47d38d10 634
phungductung 0:8ede47d38d10 635 /* If conversions on group regular are also triggering group injected, */
phungductung 0:8ede47d38d10 636 /* update ADC state. */
phungductung 0:8ede47d38d10 637 if (READ_BIT(hadc->Instance->CR1, ADC_CR1_JAUTO) != RESET)
phungductung 0:8ede47d38d10 638 {
phungductung 0:8ede47d38d10 639 ADC_STATE_CLR_SET(hadc->State, HAL_ADC_STATE_INJ_EOC, HAL_ADC_STATE_INJ_BUSY);
phungductung 0:8ede47d38d10 640 }
phungductung 0:8ede47d38d10 641
phungductung 0:8ede47d38d10 642 /* State machine update: Check if an injected conversion is ongoing */
phungductung 0:8ede47d38d10 643 if (HAL_IS_BIT_SET(hadc->State, HAL_ADC_STATE_INJ_BUSY))
phungductung 0:8ede47d38d10 644 {
phungductung 0:8ede47d38d10 645 /* Reset ADC error code fields related to conversions on group regular */
phungductung 0:8ede47d38d10 646 CLEAR_BIT(hadc->ErrorCode, (HAL_ADC_ERROR_OVR | HAL_ADC_ERROR_DMA));
phungductung 0:8ede47d38d10 647 }
phungductung 0:8ede47d38d10 648 else
phungductung 0:8ede47d38d10 649 {
phungductung 0:8ede47d38d10 650 /* Reset ADC all error code fields */
phungductung 0:8ede47d38d10 651 ADC_CLEAR_ERRORCODE(hadc);
phungductung 0:8ede47d38d10 652 }
phungductung 0:8ede47d38d10 653
phungductung 0:8ede47d38d10 654 /* Process unlocked */
phungductung 0:8ede47d38d10 655 /* Unlock before starting ADC conversions: in case of potential */
phungductung 0:8ede47d38d10 656 /* interruption, to let the process to ADC IRQ Handler. */
phungductung 0:8ede47d38d10 657 __HAL_UNLOCK(hadc);
phungductung 0:8ede47d38d10 658
phungductung 0:8ede47d38d10 659 /* Set the DMA transfer complete callback */
phungductung 0:8ede47d38d10 660 hadc->DMA_Handle->XferCpltCallback = ADC_MultiModeDMAConvCplt;
phungductung 0:8ede47d38d10 661
phungductung 0:8ede47d38d10 662 /* Set the DMA half transfer complete callback */
phungductung 0:8ede47d38d10 663 hadc->DMA_Handle->XferHalfCpltCallback = ADC_MultiModeDMAHalfConvCplt;
phungductung 0:8ede47d38d10 664
phungductung 0:8ede47d38d10 665 /* Set the DMA error callback */
phungductung 0:8ede47d38d10 666 hadc->DMA_Handle->XferErrorCallback = ADC_MultiModeDMAError ;
phungductung 0:8ede47d38d10 667
phungductung 0:8ede47d38d10 668 /* Manage ADC and DMA start: ADC overrun interruption, DMA start, ADC */
phungductung 0:8ede47d38d10 669 /* start (in case of SW start): */
phungductung 0:8ede47d38d10 670
phungductung 0:8ede47d38d10 671 /* Clear regular group conversion flag and overrun flag */
phungductung 0:8ede47d38d10 672 /* (To ensure of no unknown state from potential previous ADC operations) */
phungductung 0:8ede47d38d10 673 __HAL_ADC_CLEAR_FLAG(hadc, ADC_FLAG_EOC);
phungductung 0:8ede47d38d10 674
phungductung 0:8ede47d38d10 675 /* Enable ADC overrun interrupt */
phungductung 0:8ede47d38d10 676 __HAL_ADC_ENABLE_IT(hadc, ADC_IT_OVR);
phungductung 0:8ede47d38d10 677
phungductung 0:8ede47d38d10 678 if (hadc->Init.DMAContinuousRequests != DISABLE)
phungductung 0:8ede47d38d10 679 {
phungductung 0:8ede47d38d10 680 /* Enable the selected ADC DMA request after last transfer */
phungductung 0:8ede47d38d10 681 ADC->CCR |= ADC_CCR_DDS;
phungductung 0:8ede47d38d10 682 }
phungductung 0:8ede47d38d10 683 else
phungductung 0:8ede47d38d10 684 {
phungductung 0:8ede47d38d10 685 /* Disable the selected ADC EOC rising on each regular channel conversion */
phungductung 0:8ede47d38d10 686 ADC->CCR &= ~ADC_CCR_DDS;
phungductung 0:8ede47d38d10 687 }
phungductung 0:8ede47d38d10 688
phungductung 0:8ede47d38d10 689 /* Enable the DMA Stream */
phungductung 0:8ede47d38d10 690 HAL_DMA_Start_IT(hadc->DMA_Handle, (uint32_t)&ADC->CDR, (uint32_t)pData, Length);
phungductung 0:8ede47d38d10 691
phungductung 0:8ede47d38d10 692 /* if no external trigger present enable software conversion of regular channels */
phungductung 0:8ede47d38d10 693 if((hadc->Instance->CR2 & ADC_CR2_EXTEN) == RESET)
phungductung 0:8ede47d38d10 694 {
phungductung 0:8ede47d38d10 695 /* Enable the selected ADC software conversion for regular group */
phungductung 0:8ede47d38d10 696 hadc->Instance->CR2 |= (uint32_t)ADC_CR2_SWSTART;
phungductung 0:8ede47d38d10 697 }
phungductung 0:8ede47d38d10 698 }
phungductung 0:8ede47d38d10 699
phungductung 0:8ede47d38d10 700 /* Return function status */
phungductung 0:8ede47d38d10 701 return HAL_OK;
phungductung 0:8ede47d38d10 702 }
phungductung 0:8ede47d38d10 703
phungductung 0:8ede47d38d10 704 /**
phungductung 0:8ede47d38d10 705 * @brief Disables ADC DMA (multi-ADC mode) and disables ADC peripheral
phungductung 0:8ede47d38d10 706 * @param hadc: pointer to a ADC_HandleTypeDef structure that contains
phungductung 0:8ede47d38d10 707 * the configuration information for the specified ADC.
phungductung 0:8ede47d38d10 708 * @retval HAL status
phungductung 0:8ede47d38d10 709 */
phungductung 0:8ede47d38d10 710 HAL_StatusTypeDef HAL_ADCEx_MultiModeStop_DMA(ADC_HandleTypeDef* hadc)
phungductung 0:8ede47d38d10 711 {
phungductung 0:8ede47d38d10 712 HAL_StatusTypeDef tmp_hal_status = HAL_OK;
phungductung 0:8ede47d38d10 713
phungductung 0:8ede47d38d10 714 /* Check the parameters */
phungductung 0:8ede47d38d10 715 assert_param(IS_ADC_ALL_INSTANCE(hadc->Instance));
phungductung 0:8ede47d38d10 716
phungductung 0:8ede47d38d10 717 /* Process locked */
phungductung 0:8ede47d38d10 718 __HAL_LOCK(hadc);
phungductung 0:8ede47d38d10 719
phungductung 0:8ede47d38d10 720 /* Stop potential conversion on going, on regular and injected groups */
phungductung 0:8ede47d38d10 721 /* Disable ADC peripheral */
phungductung 0:8ede47d38d10 722 __HAL_ADC_DISABLE(hadc);
phungductung 0:8ede47d38d10 723
phungductung 0:8ede47d38d10 724 /* Check if ADC is effectively disabled */
phungductung 0:8ede47d38d10 725 if(HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_ADON))
phungductung 0:8ede47d38d10 726 {
phungductung 0:8ede47d38d10 727 /* Disable the selected ADC DMA mode for multimode */
phungductung 0:8ede47d38d10 728 ADC->CCR &= ~ADC_CCR_DDS;
phungductung 0:8ede47d38d10 729
phungductung 0:8ede47d38d10 730 /* Disable the DMA channel (in case of DMA in circular mode or stop while */
phungductung 0:8ede47d38d10 731 /* DMA transfer is on going) */
phungductung 0:8ede47d38d10 732 tmp_hal_status = HAL_DMA_Abort(hadc->DMA_Handle);
phungductung 0:8ede47d38d10 733
phungductung 0:8ede47d38d10 734 /* Disable ADC overrun interrupt */
phungductung 0:8ede47d38d10 735 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_OVR);
phungductung 0:8ede47d38d10 736
phungductung 0:8ede47d38d10 737 /* Set ADC state */
phungductung 0:8ede47d38d10 738 ADC_STATE_CLR_SET(hadc->State,
phungductung 0:8ede47d38d10 739 HAL_ADC_STATE_REG_BUSY | HAL_ADC_STATE_INJ_BUSY,
phungductung 0:8ede47d38d10 740 HAL_ADC_STATE_READY);
phungductung 0:8ede47d38d10 741 }
phungductung 0:8ede47d38d10 742
phungductung 0:8ede47d38d10 743 /* Process unlocked */
phungductung 0:8ede47d38d10 744 __HAL_UNLOCK(hadc);
phungductung 0:8ede47d38d10 745
phungductung 0:8ede47d38d10 746 /* Return function status */
phungductung 0:8ede47d38d10 747 return tmp_hal_status;
phungductung 0:8ede47d38d10 748 }
phungductung 0:8ede47d38d10 749
phungductung 0:8ede47d38d10 750 /**
phungductung 0:8ede47d38d10 751 * @brief Returns the last ADC1, ADC2 and ADC3 regular conversions results
phungductung 0:8ede47d38d10 752 * data in the selected multi mode.
phungductung 0:8ede47d38d10 753 * @param hadc: pointer to a ADC_HandleTypeDef structure that contains
phungductung 0:8ede47d38d10 754 * the configuration information for the specified ADC.
phungductung 0:8ede47d38d10 755 * @retval The converted data value.
phungductung 0:8ede47d38d10 756 */
phungductung 0:8ede47d38d10 757 uint32_t HAL_ADCEx_MultiModeGetValue(ADC_HandleTypeDef* hadc)
phungductung 0:8ede47d38d10 758 {
phungductung 0:8ede47d38d10 759 /* Return the multi mode conversion value */
phungductung 0:8ede47d38d10 760 return ADC->CDR;
phungductung 0:8ede47d38d10 761 }
phungductung 0:8ede47d38d10 762
phungductung 0:8ede47d38d10 763 /**
phungductung 0:8ede47d38d10 764 * @brief Injected conversion complete callback in non blocking mode
phungductung 0:8ede47d38d10 765 * @param hadc: pointer to a ADC_HandleTypeDef structure that contains
phungductung 0:8ede47d38d10 766 * the configuration information for the specified ADC.
phungductung 0:8ede47d38d10 767 * @retval None
phungductung 0:8ede47d38d10 768 */
phungductung 0:8ede47d38d10 769 __weak void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef* hadc)
phungductung 0:8ede47d38d10 770 {
phungductung 0:8ede47d38d10 771 /* Prevent unused argument(s) compilation warning */
phungductung 0:8ede47d38d10 772 UNUSED(hadc);
phungductung 0:8ede47d38d10 773 /* NOTE : This function Should not be modified, when the callback is needed,
phungductung 0:8ede47d38d10 774 the HAL_ADC_InjectedConvCpltCallback could be implemented in the user file
phungductung 0:8ede47d38d10 775 */
phungductung 0:8ede47d38d10 776 }
phungductung 0:8ede47d38d10 777
phungductung 0:8ede47d38d10 778 /**
phungductung 0:8ede47d38d10 779 * @brief Configures for the selected ADC injected channel its corresponding
phungductung 0:8ede47d38d10 780 * rank in the sequencer and its sample time.
phungductung 0:8ede47d38d10 781 * @param hadc: pointer to a ADC_HandleTypeDef structure that contains
phungductung 0:8ede47d38d10 782 * the configuration information for the specified ADC.
phungductung 0:8ede47d38d10 783 * @param sConfigInjected: ADC configuration structure for injected channel.
phungductung 0:8ede47d38d10 784 * @retval None
phungductung 0:8ede47d38d10 785 */
phungductung 0:8ede47d38d10 786 HAL_StatusTypeDef HAL_ADCEx_InjectedConfigChannel(ADC_HandleTypeDef* hadc, ADC_InjectionConfTypeDef* sConfigInjected)
phungductung 0:8ede47d38d10 787 {
phungductung 0:8ede47d38d10 788
phungductung 0:8ede47d38d10 789 #ifdef USE_FULL_ASSERT
phungductung 0:8ede47d38d10 790 uint32_t tmp = 0;
phungductung 0:8ede47d38d10 791 #endif /* USE_FULL_ASSERT */
phungductung 0:8ede47d38d10 792
phungductung 0:8ede47d38d10 793 /* Check the parameters */
phungductung 0:8ede47d38d10 794 assert_param(IS_ADC_CHANNEL(sConfigInjected->InjectedChannel));
phungductung 0:8ede47d38d10 795 assert_param(IS_ADC_INJECTED_RANK(sConfigInjected->InjectedRank));
phungductung 0:8ede47d38d10 796 assert_param(IS_ADC_SAMPLE_TIME(sConfigInjected->InjectedSamplingTime));
phungductung 0:8ede47d38d10 797 assert_param(IS_ADC_EXT_INJEC_TRIG(sConfigInjected->ExternalTrigInjecConv));
phungductung 0:8ede47d38d10 798 assert_param(IS_ADC_INJECTED_LENGTH(sConfigInjected->InjectedNbrOfConversion));
phungductung 0:8ede47d38d10 799 assert_param(IS_FUNCTIONAL_STATE(sConfigInjected->AutoInjectedConv));
phungductung 0:8ede47d38d10 800 assert_param(IS_FUNCTIONAL_STATE(sConfigInjected->InjectedDiscontinuousConvMode));
phungductung 0:8ede47d38d10 801
phungductung 0:8ede47d38d10 802 #ifdef USE_FULL_ASSERT
phungductung 0:8ede47d38d10 803 tmp = ADC_GET_RESOLUTION(hadc);
phungductung 0:8ede47d38d10 804 assert_param(IS_ADC_RANGE(tmp, sConfigInjected->InjectedOffset));
phungductung 0:8ede47d38d10 805 #endif /* USE_FULL_ASSERT */
phungductung 0:8ede47d38d10 806
phungductung 0:8ede47d38d10 807 if(sConfigInjected->ExternalTrigInjecConvEdge != ADC_INJECTED_SOFTWARE_START)
phungductung 0:8ede47d38d10 808 {
phungductung 0:8ede47d38d10 809 assert_param(IS_ADC_EXT_INJEC_TRIG_EDGE(sConfigInjected->ExternalTrigInjecConvEdge));
phungductung 0:8ede47d38d10 810 }
phungductung 0:8ede47d38d10 811
phungductung 0:8ede47d38d10 812 /* Process locked */
phungductung 0:8ede47d38d10 813 __HAL_LOCK(hadc);
phungductung 0:8ede47d38d10 814
phungductung 0:8ede47d38d10 815 /* if ADC_Channel_10 ... ADC_Channel_18 is selected */
phungductung 0:8ede47d38d10 816 if (sConfigInjected->InjectedChannel > ADC_CHANNEL_9)
phungductung 0:8ede47d38d10 817 {
phungductung 0:8ede47d38d10 818 /* Clear the old sample time */
phungductung 0:8ede47d38d10 819 hadc->Instance->SMPR1 &= ~ADC_SMPR1(ADC_SMPR1_SMP10, sConfigInjected->InjectedChannel);
phungductung 0:8ede47d38d10 820
phungductung 0:8ede47d38d10 821 /* Set the new sample time */
phungductung 0:8ede47d38d10 822 hadc->Instance->SMPR1 |= ADC_SMPR1(sConfigInjected->InjectedSamplingTime, sConfigInjected->InjectedChannel);
phungductung 0:8ede47d38d10 823 }
phungductung 0:8ede47d38d10 824 else /* ADC_Channel include in ADC_Channel_[0..9] */
phungductung 0:8ede47d38d10 825 {
phungductung 0:8ede47d38d10 826 /* Clear the old sample time */
phungductung 0:8ede47d38d10 827 hadc->Instance->SMPR2 &= ~ADC_SMPR2(ADC_SMPR2_SMP0, sConfigInjected->InjectedChannel);
phungductung 0:8ede47d38d10 828
phungductung 0:8ede47d38d10 829 /* Set the new sample time */
phungductung 0:8ede47d38d10 830 hadc->Instance->SMPR2 |= ADC_SMPR2(sConfigInjected->InjectedSamplingTime, sConfigInjected->InjectedChannel);
phungductung 0:8ede47d38d10 831 }
phungductung 0:8ede47d38d10 832
phungductung 0:8ede47d38d10 833 /*---------------------------- ADCx JSQR Configuration -----------------*/
phungductung 0:8ede47d38d10 834 hadc->Instance->JSQR &= ~(ADC_JSQR_JL);
phungductung 0:8ede47d38d10 835 hadc->Instance->JSQR |= ADC_SQR1(sConfigInjected->InjectedNbrOfConversion);
phungductung 0:8ede47d38d10 836
phungductung 0:8ede47d38d10 837 /* Rank configuration */
phungductung 0:8ede47d38d10 838
phungductung 0:8ede47d38d10 839 /* Clear the old SQx bits for the selected rank */
phungductung 0:8ede47d38d10 840 hadc->Instance->JSQR &= ~ADC_JSQR(ADC_JSQR_JSQ1, sConfigInjected->InjectedRank,sConfigInjected->InjectedNbrOfConversion);
phungductung 0:8ede47d38d10 841
phungductung 0:8ede47d38d10 842 /* Set the SQx bits for the selected rank */
phungductung 0:8ede47d38d10 843 hadc->Instance->JSQR |= ADC_JSQR(sConfigInjected->InjectedChannel, sConfigInjected->InjectedRank,sConfigInjected->InjectedNbrOfConversion);
phungductung 0:8ede47d38d10 844
phungductung 0:8ede47d38d10 845 /* Enable external trigger if trigger selection is different of software */
phungductung 0:8ede47d38d10 846 /* start. */
phungductung 0:8ede47d38d10 847 /* Note: This configuration keeps the hardware feature of parameter */
phungductung 0:8ede47d38d10 848 /* ExternalTrigConvEdge "trigger edge none" equivalent to */
phungductung 0:8ede47d38d10 849 /* software start. */
phungductung 0:8ede47d38d10 850 if(sConfigInjected->ExternalTrigInjecConv != ADC_INJECTED_SOFTWARE_START)
phungductung 0:8ede47d38d10 851 {
phungductung 0:8ede47d38d10 852 /* Select external trigger to start conversion */
phungductung 0:8ede47d38d10 853 hadc->Instance->CR2 &= ~(ADC_CR2_JEXTSEL);
phungductung 0:8ede47d38d10 854 hadc->Instance->CR2 |= sConfigInjected->ExternalTrigInjecConv;
phungductung 0:8ede47d38d10 855
phungductung 0:8ede47d38d10 856 /* Select external trigger polarity */
phungductung 0:8ede47d38d10 857 hadc->Instance->CR2 &= ~(ADC_CR2_JEXTEN);
phungductung 0:8ede47d38d10 858 hadc->Instance->CR2 |= sConfigInjected->ExternalTrigInjecConvEdge;
phungductung 0:8ede47d38d10 859 }
phungductung 0:8ede47d38d10 860 else
phungductung 0:8ede47d38d10 861 {
phungductung 0:8ede47d38d10 862 /* Reset the external trigger */
phungductung 0:8ede47d38d10 863 hadc->Instance->CR2 &= ~(ADC_CR2_JEXTSEL);
phungductung 0:8ede47d38d10 864 hadc->Instance->CR2 &= ~(ADC_CR2_JEXTEN);
phungductung 0:8ede47d38d10 865 }
phungductung 0:8ede47d38d10 866
phungductung 0:8ede47d38d10 867 if (sConfigInjected->AutoInjectedConv != DISABLE)
phungductung 0:8ede47d38d10 868 {
phungductung 0:8ede47d38d10 869 /* Enable the selected ADC automatic injected group conversion */
phungductung 0:8ede47d38d10 870 hadc->Instance->CR1 |= ADC_CR1_JAUTO;
phungductung 0:8ede47d38d10 871 }
phungductung 0:8ede47d38d10 872 else
phungductung 0:8ede47d38d10 873 {
phungductung 0:8ede47d38d10 874 /* Disable the selected ADC automatic injected group conversion */
phungductung 0:8ede47d38d10 875 hadc->Instance->CR1 &= ~(ADC_CR1_JAUTO);
phungductung 0:8ede47d38d10 876 }
phungductung 0:8ede47d38d10 877
phungductung 0:8ede47d38d10 878 if (sConfigInjected->InjectedDiscontinuousConvMode != DISABLE)
phungductung 0:8ede47d38d10 879 {
phungductung 0:8ede47d38d10 880 /* Enable the selected ADC injected discontinuous mode */
phungductung 0:8ede47d38d10 881 hadc->Instance->CR1 |= ADC_CR1_JDISCEN;
phungductung 0:8ede47d38d10 882 }
phungductung 0:8ede47d38d10 883 else
phungductung 0:8ede47d38d10 884 {
phungductung 0:8ede47d38d10 885 /* Disable the selected ADC injected discontinuous mode */
phungductung 0:8ede47d38d10 886 hadc->Instance->CR1 &= ~(ADC_CR1_JDISCEN);
phungductung 0:8ede47d38d10 887 }
phungductung 0:8ede47d38d10 888
phungductung 0:8ede47d38d10 889 switch(sConfigInjected->InjectedRank)
phungductung 0:8ede47d38d10 890 {
phungductung 0:8ede47d38d10 891 case 1:
phungductung 0:8ede47d38d10 892 /* Set injected channel 1 offset */
phungductung 0:8ede47d38d10 893 hadc->Instance->JOFR1 &= ~(ADC_JOFR1_JOFFSET1);
phungductung 0:8ede47d38d10 894 hadc->Instance->JOFR1 |= sConfigInjected->InjectedOffset;
phungductung 0:8ede47d38d10 895 break;
phungductung 0:8ede47d38d10 896 case 2:
phungductung 0:8ede47d38d10 897 /* Set injected channel 2 offset */
phungductung 0:8ede47d38d10 898 hadc->Instance->JOFR2 &= ~(ADC_JOFR2_JOFFSET2);
phungductung 0:8ede47d38d10 899 hadc->Instance->JOFR2 |= sConfigInjected->InjectedOffset;
phungductung 0:8ede47d38d10 900 break;
phungductung 0:8ede47d38d10 901 case 3:
phungductung 0:8ede47d38d10 902 /* Set injected channel 3 offset */
phungductung 0:8ede47d38d10 903 hadc->Instance->JOFR3 &= ~(ADC_JOFR3_JOFFSET3);
phungductung 0:8ede47d38d10 904 hadc->Instance->JOFR3 |= sConfigInjected->InjectedOffset;
phungductung 0:8ede47d38d10 905 break;
phungductung 0:8ede47d38d10 906 default:
phungductung 0:8ede47d38d10 907 /* Set injected channel 4 offset */
phungductung 0:8ede47d38d10 908 hadc->Instance->JOFR4 &= ~(ADC_JOFR4_JOFFSET4);
phungductung 0:8ede47d38d10 909 hadc->Instance->JOFR4 |= sConfigInjected->InjectedOffset;
phungductung 0:8ede47d38d10 910 break;
phungductung 0:8ede47d38d10 911 }
phungductung 0:8ede47d38d10 912
phungductung 0:8ede47d38d10 913 /* if ADC1 Channel_18 is selected enable VBAT Channel */
phungductung 0:8ede47d38d10 914 if ((hadc->Instance == ADC1) && (sConfigInjected->InjectedChannel == ADC_CHANNEL_VBAT))
phungductung 0:8ede47d38d10 915 {
phungductung 0:8ede47d38d10 916 /* Enable the VBAT channel*/
phungductung 0:8ede47d38d10 917 ADC->CCR |= ADC_CCR_VBATE;
phungductung 0:8ede47d38d10 918 }
phungductung 0:8ede47d38d10 919
phungductung 0:8ede47d38d10 920 /* if ADC1 Channel_16 or Channel_17 is selected enable TSVREFE Channel(Temperature sensor and VREFINT) */
phungductung 0:8ede47d38d10 921 if ((hadc->Instance == ADC1) && ((sConfigInjected->InjectedChannel == ADC_CHANNEL_TEMPSENSOR) || (sConfigInjected->InjectedChannel == ADC_CHANNEL_VREFINT)))
phungductung 0:8ede47d38d10 922 {
phungductung 0:8ede47d38d10 923 /* Enable the TSVREFE channel*/
phungductung 0:8ede47d38d10 924 ADC->CCR |= ADC_CCR_TSVREFE;
phungductung 0:8ede47d38d10 925 }
phungductung 0:8ede47d38d10 926
phungductung 0:8ede47d38d10 927 /* Process unlocked */
phungductung 0:8ede47d38d10 928 __HAL_UNLOCK(hadc);
phungductung 0:8ede47d38d10 929
phungductung 0:8ede47d38d10 930 /* Return function status */
phungductung 0:8ede47d38d10 931 return HAL_OK;
phungductung 0:8ede47d38d10 932 }
phungductung 0:8ede47d38d10 933
phungductung 0:8ede47d38d10 934 /**
phungductung 0:8ede47d38d10 935 * @brief Configures the ADC multi-mode
phungductung 0:8ede47d38d10 936 * @param hadc : pointer to a ADC_HandleTypeDef structure that contains
phungductung 0:8ede47d38d10 937 * the configuration information for the specified ADC.
phungductung 0:8ede47d38d10 938 * @param multimode : pointer to an ADC_MultiModeTypeDef structure that contains
phungductung 0:8ede47d38d10 939 * the configuration information for multimode.
phungductung 0:8ede47d38d10 940 * @retval HAL status
phungductung 0:8ede47d38d10 941 */
phungductung 0:8ede47d38d10 942 HAL_StatusTypeDef HAL_ADCEx_MultiModeConfigChannel(ADC_HandleTypeDef* hadc, ADC_MultiModeTypeDef* multimode)
phungductung 0:8ede47d38d10 943 {
phungductung 0:8ede47d38d10 944 /* Check the parameters */
phungductung 0:8ede47d38d10 945 assert_param(IS_ADC_MODE(multimode->Mode));
phungductung 0:8ede47d38d10 946 assert_param(IS_ADC_DMA_ACCESS_MODE(multimode->DMAAccessMode));
phungductung 0:8ede47d38d10 947 assert_param(IS_ADC_SAMPLING_DELAY(multimode->TwoSamplingDelay));
phungductung 0:8ede47d38d10 948
phungductung 0:8ede47d38d10 949 /* Process locked */
phungductung 0:8ede47d38d10 950 __HAL_LOCK(hadc);
phungductung 0:8ede47d38d10 951
phungductung 0:8ede47d38d10 952 /* Set ADC mode */
phungductung 0:8ede47d38d10 953 ADC->CCR &= ~(ADC_CCR_MULTI);
phungductung 0:8ede47d38d10 954 ADC->CCR |= multimode->Mode;
phungductung 0:8ede47d38d10 955
phungductung 0:8ede47d38d10 956 /* Set the ADC DMA access mode */
phungductung 0:8ede47d38d10 957 ADC->CCR &= ~(ADC_CCR_DMA);
phungductung 0:8ede47d38d10 958 ADC->CCR |= multimode->DMAAccessMode;
phungductung 0:8ede47d38d10 959
phungductung 0:8ede47d38d10 960 /* Set delay between two sampling phases */
phungductung 0:8ede47d38d10 961 ADC->CCR &= ~(ADC_CCR_DELAY);
phungductung 0:8ede47d38d10 962 ADC->CCR |= multimode->TwoSamplingDelay;
phungductung 0:8ede47d38d10 963
phungductung 0:8ede47d38d10 964 /* Process unlocked */
phungductung 0:8ede47d38d10 965 __HAL_UNLOCK(hadc);
phungductung 0:8ede47d38d10 966
phungductung 0:8ede47d38d10 967 /* Return function status */
phungductung 0:8ede47d38d10 968 return HAL_OK;
phungductung 0:8ede47d38d10 969 }
phungductung 0:8ede47d38d10 970
phungductung 0:8ede47d38d10 971 /**
phungductung 0:8ede47d38d10 972 * @}
phungductung 0:8ede47d38d10 973 */
phungductung 0:8ede47d38d10 974
phungductung 0:8ede47d38d10 975 /**
phungductung 0:8ede47d38d10 976 * @brief DMA transfer complete callback.
phungductung 0:8ede47d38d10 977 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
phungductung 0:8ede47d38d10 978 * the configuration information for the specified DMA module.
phungductung 0:8ede47d38d10 979 * @retval None
phungductung 0:8ede47d38d10 980 */
phungductung 0:8ede47d38d10 981 static void ADC_MultiModeDMAConvCplt(DMA_HandleTypeDef *hdma)
phungductung 0:8ede47d38d10 982 {
phungductung 0:8ede47d38d10 983 /* Retrieve ADC handle corresponding to current DMA handle */
phungductung 0:8ede47d38d10 984 ADC_HandleTypeDef* hadc = ( ADC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
phungductung 0:8ede47d38d10 985
phungductung 0:8ede47d38d10 986 /* Update state machine on conversion status if not in error state */
phungductung 0:8ede47d38d10 987 if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_ERROR_INTERNAL | HAL_ADC_STATE_ERROR_DMA))
phungductung 0:8ede47d38d10 988 {
phungductung 0:8ede47d38d10 989 /* Update ADC state machine */
phungductung 0:8ede47d38d10 990 SET_BIT(hadc->State, HAL_ADC_STATE_REG_EOC);
phungductung 0:8ede47d38d10 991
phungductung 0:8ede47d38d10 992 /* Determine whether any further conversion upcoming on group regular */
phungductung 0:8ede47d38d10 993 /* by external trigger, continuous mode or scan sequence on going. */
phungductung 0:8ede47d38d10 994 /* Note: On STM32F7, there is no independent flag of end of sequence. */
phungductung 0:8ede47d38d10 995 /* The test of scan sequence on going is done either with scan */
phungductung 0:8ede47d38d10 996 /* sequence disabled or with end of conversion flag set to */
phungductung 0:8ede47d38d10 997 /* of end of sequence. */
phungductung 0:8ede47d38d10 998 if(ADC_IS_SOFTWARE_START_REGULAR(hadc) &&
phungductung 0:8ede47d38d10 999 (hadc->Init.ContinuousConvMode == DISABLE) &&
phungductung 0:8ede47d38d10 1000 (HAL_IS_BIT_CLR(hadc->Instance->SQR1, ADC_SQR1_L) ||
phungductung 0:8ede47d38d10 1001 HAL_IS_BIT_CLR(hadc->Instance->CR2, ADC_CR2_EOCS) ) )
phungductung 0:8ede47d38d10 1002 {
phungductung 0:8ede47d38d10 1003 /* Disable ADC end of single conversion interrupt on group regular */
phungductung 0:8ede47d38d10 1004 /* Note: Overrun interrupt was enabled with EOC interrupt in */
phungductung 0:8ede47d38d10 1005 /* HAL_ADC_Start_IT(), but is not disabled here because can be used */
phungductung 0:8ede47d38d10 1006 /* by overrun IRQ process below. */
phungductung 0:8ede47d38d10 1007 __HAL_ADC_DISABLE_IT(hadc, ADC_IT_EOC);
phungductung 0:8ede47d38d10 1008
phungductung 0:8ede47d38d10 1009 /* Set ADC state */
phungductung 0:8ede47d38d10 1010 CLEAR_BIT(hadc->State, HAL_ADC_STATE_REG_BUSY);
phungductung 0:8ede47d38d10 1011
phungductung 0:8ede47d38d10 1012 if (HAL_IS_BIT_CLR(hadc->State, HAL_ADC_STATE_INJ_BUSY))
phungductung 0:8ede47d38d10 1013 {
phungductung 0:8ede47d38d10 1014 SET_BIT(hadc->State, HAL_ADC_STATE_READY);
phungductung 0:8ede47d38d10 1015 }
phungductung 0:8ede47d38d10 1016 }
phungductung 0:8ede47d38d10 1017
phungductung 0:8ede47d38d10 1018 /* Conversion complete callback */
phungductung 0:8ede47d38d10 1019 HAL_ADC_ConvCpltCallback(hadc);
phungductung 0:8ede47d38d10 1020 }
phungductung 0:8ede47d38d10 1021 else
phungductung 0:8ede47d38d10 1022 {
phungductung 0:8ede47d38d10 1023 /* Call DMA error callback */
phungductung 0:8ede47d38d10 1024 hadc->DMA_Handle->XferErrorCallback(hdma);
phungductung 0:8ede47d38d10 1025 }
phungductung 0:8ede47d38d10 1026 }
phungductung 0:8ede47d38d10 1027
phungductung 0:8ede47d38d10 1028 /**
phungductung 0:8ede47d38d10 1029 * @brief DMA half transfer complete callback.
phungductung 0:8ede47d38d10 1030 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
phungductung 0:8ede47d38d10 1031 * the configuration information for the specified DMA module.
phungductung 0:8ede47d38d10 1032 * @retval None
phungductung 0:8ede47d38d10 1033 */
phungductung 0:8ede47d38d10 1034 static void ADC_MultiModeDMAHalfConvCplt(DMA_HandleTypeDef *hdma)
phungductung 0:8ede47d38d10 1035 {
phungductung 0:8ede47d38d10 1036 ADC_HandleTypeDef* hadc = ( ADC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
phungductung 0:8ede47d38d10 1037 /* Conversion complete callback */
phungductung 0:8ede47d38d10 1038 HAL_ADC_ConvHalfCpltCallback(hadc);
phungductung 0:8ede47d38d10 1039 }
phungductung 0:8ede47d38d10 1040
phungductung 0:8ede47d38d10 1041 /**
phungductung 0:8ede47d38d10 1042 * @brief DMA error callback
phungductung 0:8ede47d38d10 1043 * @param hdma: pointer to a DMA_HandleTypeDef structure that contains
phungductung 0:8ede47d38d10 1044 * the configuration information for the specified DMA module.
phungductung 0:8ede47d38d10 1045 * @retval None
phungductung 0:8ede47d38d10 1046 */
phungductung 0:8ede47d38d10 1047 static void ADC_MultiModeDMAError(DMA_HandleTypeDef *hdma)
phungductung 0:8ede47d38d10 1048 {
phungductung 0:8ede47d38d10 1049 ADC_HandleTypeDef* hadc = ( ADC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;
phungductung 0:8ede47d38d10 1050 hadc->State= HAL_ADC_STATE_ERROR_DMA;
phungductung 0:8ede47d38d10 1051 /* Set ADC error code to DMA error */
phungductung 0:8ede47d38d10 1052 hadc->ErrorCode |= HAL_ADC_ERROR_DMA;
phungductung 0:8ede47d38d10 1053 HAL_ADC_ErrorCallback(hadc);
phungductung 0:8ede47d38d10 1054 }
phungductung 0:8ede47d38d10 1055
phungductung 0:8ede47d38d10 1056 /**
phungductung 0:8ede47d38d10 1057 * @}
phungductung 0:8ede47d38d10 1058 */
phungductung 0:8ede47d38d10 1059
phungductung 0:8ede47d38d10 1060 #endif /* HAL_ADC_MODULE_ENABLED */
phungductung 0:8ede47d38d10 1061 /**
phungductung 0:8ede47d38d10 1062 * @}
phungductung 0:8ede47d38d10 1063 */
phungductung 0:8ede47d38d10 1064
phungductung 0:8ede47d38d10 1065 /**
phungductung 0:8ede47d38d10 1066 * @}
phungductung 0:8ede47d38d10 1067 */
phungductung 0:8ede47d38d10 1068
phungductung 0:8ede47d38d10 1069 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/