L4 HAL Drivers

Committer:
EricLew
Date:
Mon Nov 02 19:37:23 2015 +0000
Revision:
0:80ee8f3b695e
Errors are with definitions of LCD and QSPI functions. I believe all .h and .c files are  uploaded, but there may need to be certain functions called.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
EricLew 0:80ee8f3b695e 1 /**
EricLew 0:80ee8f3b695e 2 ******************************************************************************
EricLew 0:80ee8f3b695e 3 * @file stm32l4xx_hal_opamp.c
EricLew 0:80ee8f3b695e 4 * @author MCD Application Team
EricLew 0:80ee8f3b695e 5 * @version V1.1.0
EricLew 0:80ee8f3b695e 6 * @date 16-September-2015
EricLew 0:80ee8f3b695e 7 * @brief OPAMP HAL module driver.
EricLew 0:80ee8f3b695e 8 * This file provides firmware functions to manage the following
EricLew 0:80ee8f3b695e 9 * functionalities of the operational amplifier(s) peripheral:
EricLew 0:80ee8f3b695e 10 * + OPAMP configuration
EricLew 0:80ee8f3b695e 11 * + OPAMP calibration
EricLew 0:80ee8f3b695e 12 * Thanks to
EricLew 0:80ee8f3b695e 13 * + Initialization and de-initialization functions
EricLew 0:80ee8f3b695e 14 * + IO operation functions
EricLew 0:80ee8f3b695e 15 * + Peripheral Control functions
EricLew 0:80ee8f3b695e 16 * + Peripheral State functions
EricLew 0:80ee8f3b695e 17 *
EricLew 0:80ee8f3b695e 18 @verbatim
EricLew 0:80ee8f3b695e 19 ================================================================================
EricLew 0:80ee8f3b695e 20 ##### OPAMP Peripheral Features #####
EricLew 0:80ee8f3b695e 21 ================================================================================
EricLew 0:80ee8f3b695e 22
EricLew 0:80ee8f3b695e 23 [..] The device integrates 2 operational amplifiers OPAMP1 & OPAMP2
EricLew 0:80ee8f3b695e 24
EricLew 0:80ee8f3b695e 25 (#) The OPAMP(s) provide(s) several exclusive running modes.
EricLew 0:80ee8f3b695e 26 (++) Standalone mode
EricLew 0:80ee8f3b695e 27 (++) Programmable Gain Amplifier (PGA) mode (Resistor feedback output)
EricLew 0:80ee8f3b695e 28 (++) Follower mode
EricLew 0:80ee8f3b695e 29
EricLew 0:80ee8f3b695e 30 (#) All OPAMP (same for all OPAMPs) can operate in
EricLew 0:80ee8f3b695e 31 (++) Either Low range (VDDA < 2.4V) power supply
EricLew 0:80ee8f3b695e 32 (++) Or High range (VDDA > 2.4V) power supply
EricLew 0:80ee8f3b695e 33
EricLew 0:80ee8f3b695e 34 (#) Each OPAMP(s) can be configured in normal and low power mode.
EricLew 0:80ee8f3b695e 35
EricLew 0:80ee8f3b695e 36 (#) The OPAMP(s) provide(s) calibration capabilities.
EricLew 0:80ee8f3b695e 37 (++) Calibration aims at correcting some offset for running mode.
EricLew 0:80ee8f3b695e 38 (++) The OPAMP uses either factory calibration settings OR user defined
EricLew 0:80ee8f3b695e 39 calibration (trimming) settings (i.e. trimming mode).
EricLew 0:80ee8f3b695e 40 (++) The user defined settings can be figured out using self calibration
EricLew 0:80ee8f3b695e 41 handled by HAL_OPAMP_SelfCalibrate, HAL_OPAMPEx_SelfCalibrateAll
EricLew 0:80ee8f3b695e 42 (++) HAL_OPAMP_SelfCalibrate:
EricLew 0:80ee8f3b695e 43 (+++) Runs automatically the calibration.
EricLew 0:80ee8f3b695e 44 (+++) Enables the user trimming mode
EricLew 0:80ee8f3b695e 45 (+++) Updates the init structure with trimming values with fresh calibration
EricLew 0:80ee8f3b695e 46 results.
EricLew 0:80ee8f3b695e 47 The user may store the calibration results for larger
EricLew 0:80ee8f3b695e 48 (ex monitoring the trimming as a function of temperature
EricLew 0:80ee8f3b695e 49 for instance)
EricLew 0:80ee8f3b695e 50 (+++) HAL_OPAMPEx_SelfCalibrateAll
EricLew 0:80ee8f3b695e 51 runs calibration of all OPAMPs in parallel to save search time.
EricLew 0:80ee8f3b695e 52
EricLew 0:80ee8f3b695e 53 (#) Running mode: Standalone mode
EricLew 0:80ee8f3b695e 54 (++) Gain is set externally (gain depends on external loads).
EricLew 0:80ee8f3b695e 55 (++) Follower mode also possible externally by connecting the inverting input to
EricLew 0:80ee8f3b695e 56 the output.
EricLew 0:80ee8f3b695e 57
EricLew 0:80ee8f3b695e 58 (#) Running mode: Follower mode
EricLew 0:80ee8f3b695e 59 (++) No Inverting Input is connected.
EricLew 0:80ee8f3b695e 60
EricLew 0:80ee8f3b695e 61 (#) Running mode: Programmable Gain Amplifier (PGA) mode
EricLew 0:80ee8f3b695e 62 (Resistor feedback output)
EricLew 0:80ee8f3b695e 63 (++) The OPAMP(s) output(s) can be internally connected to resistor feedback
EricLew 0:80ee8f3b695e 64 output.
EricLew 0:80ee8f3b695e 65 (++) OPAMP gain is either 2, 4, 8 or 16.
EricLew 0:80ee8f3b695e 66
EricLew 0:80ee8f3b695e 67 (#) The OPAMPs inverting input can be
EricLew 0:80ee8f3b695e 68 selected among the list shown by table below.
EricLew 0:80ee8f3b695e 69
EricLew 0:80ee8f3b695e 70 (#) The OPAMPs non inverting input can be
EricLew 0:80ee8f3b695e 71 selected among the list shown by table below.
EricLew 0:80ee8f3b695e 72
EricLew 0:80ee8f3b695e 73 [..] Table 1. OPAMPs inverting/non-inverting inputs for the STM32L4 devices:
EricLew 0:80ee8f3b695e 74
EricLew 0:80ee8f3b695e 75 (+) +------------------------------------------------------------------------|
EricLew 0:80ee8f3b695e 76 (+) | | | OPAMP1 | OPAMP2 |
EricLew 0:80ee8f3b695e 77 (+) |-----------------|---------|----------------------|---------------------|
EricLew 0:80ee8f3b695e 78 (+) | Inverting Input | VM_SEL | | |
EricLew 0:80ee8f3b695e 79 (+) | | | IO0-> PA1 | IO0-> PA7 |
EricLew 0:80ee8f3b695e 80 (+) | | | LOW LEAKAGE IO (2) | LOW LEAKAGE IO (2) |
EricLew 0:80ee8f3b695e 81 (+) | | | Not connected | Not connected |
EricLew 0:80ee8f3b695e 82 (+) | (1) | | PGA mode only | PGA mode only |
EricLew 0:80ee8f3b695e 83 (+) |-----------------|---------|----------------------|---------------------|
EricLew 0:80ee8f3b695e 84 (+) | Non Inverting | VP_SEL | | |
EricLew 0:80ee8f3b695e 85 (+) | | | IO0-> PA0 (GPIO) | IO0-> PA6 (GPIO) |
EricLew 0:80ee8f3b695e 86 (+) | Input | | DAC1_OUT1 internal | DAC1_OUT2 internal |
EricLew 0:80ee8f3b695e 87 (+) +------------------------------------------------------------------------|
EricLew 0:80ee8f3b695e 88 [..] (1): NA in follower mode.
EricLew 0:80ee8f3b695e 89 [..](2): Available on some package only (ex. BGA132).
EricLew 0:80ee8f3b695e 90
EricLew 0:80ee8f3b695e 91 [..] Table 2. OPAMPs outputs for the STM32L4 devices:
EricLew 0:80ee8f3b695e 92
EricLew 0:80ee8f3b695e 93 (+) +-------------------------------------------------------------------------
EricLew 0:80ee8f3b695e 94 (+) | | | OPAMP1 | OPAMP2 |
EricLew 0:80ee8f3b695e 95 (+) |-----------------|--------|-----------------------|---------------------|
EricLew 0:80ee8f3b695e 96 (+) | Output | VOUT | PA3 | PB0 |
EricLew 0:80ee8f3b695e 97 (+) | | | & (2) ADC12_IN if | & (2) ADC12_IN if |
EricLew 0:80ee8f3b695e 98 (+) | | | connected internally | connected internally|
EricLew 0:80ee8f3b695e 99 (+) |-----------------|--------|-----------------------|---------------------|
EricLew 0:80ee8f3b695e 100 [..] (2): ADC1 or ADC2 shall select IN15.
EricLew 0:80ee8f3b695e 101
EricLew 0:80ee8f3b695e 102 ##### How to use this driver #####
EricLew 0:80ee8f3b695e 103 ================================================================================
EricLew 0:80ee8f3b695e 104 [..]
EricLew 0:80ee8f3b695e 105
EricLew 0:80ee8f3b695e 106 *** Power supply range ***
EricLew 0:80ee8f3b695e 107 ============================================
EricLew 0:80ee8f3b695e 108 [..] To run in low power mode:
EricLew 0:80ee8f3b695e 109
EricLew 0:80ee8f3b695e 110 (#) Configure the OPAMP using HAL_OPAMP_Init() function:
EricLew 0:80ee8f3b695e 111 (++) Select OPAMP_POWERSUPPLY_LOW (VDDA lower than 2.4V)
EricLew 0:80ee8f3b695e 112 (++) Otherwise select OPAMP_POWERSUPPLY_HIGH (VDDA higher than 2.4V)
EricLew 0:80ee8f3b695e 113
EricLew 0:80ee8f3b695e 114 *** Low / normal power mode ***
EricLew 0:80ee8f3b695e 115 ============================================
EricLew 0:80ee8f3b695e 116 [..] To run in low power mode:
EricLew 0:80ee8f3b695e 117
EricLew 0:80ee8f3b695e 118 (#) Configure the OPAMP using HAL_OPAMP_Init() function:
EricLew 0:80ee8f3b695e 119 (++) Select OPAMP_POWERMODE_LOWPOWER
EricLew 0:80ee8f3b695e 120 (++) Otherwise select OPAMP_POWERMODE_NORMAL
EricLew 0:80ee8f3b695e 121
EricLew 0:80ee8f3b695e 122 *** Calibration ***
EricLew 0:80ee8f3b695e 123 ============================================
EricLew 0:80ee8f3b695e 124 [..] To run the OPAMP calibration self calibration:
EricLew 0:80ee8f3b695e 125
EricLew 0:80ee8f3b695e 126 (#) Start calibration using HAL_OPAMP_SelfCalibrate.
EricLew 0:80ee8f3b695e 127 Store the calibration results.
EricLew 0:80ee8f3b695e 128
EricLew 0:80ee8f3b695e 129 *** Running mode ***
EricLew 0:80ee8f3b695e 130 ============================================
EricLew 0:80ee8f3b695e 131
EricLew 0:80ee8f3b695e 132 [..] To use the OPAMP, perform the following steps:
EricLew 0:80ee8f3b695e 133
EricLew 0:80ee8f3b695e 134 (#) Fill in the HAL_OPAMP_MspInit() to
EricLew 0:80ee8f3b695e 135 (++) Enable the OPAMP Peripheral clock using macro __HAL_RCC_OPAMP_CLK_ENABLE()
EricLew 0:80ee8f3b695e 136 (++) Configure the OPAMP input AND output in analog mode using
EricLew 0:80ee8f3b695e 137 HAL_GPIO_Init() to map the OPAMP output to the GPIO pin.
EricLew 0:80ee8f3b695e 138
EricLew 0:80ee8f3b695e 139 (#) Configure the OPAMP using HAL_OPAMP_Init() function:
EricLew 0:80ee8f3b695e 140 (++) Select the mode
EricLew 0:80ee8f3b695e 141 (++) Select the inverting input
EricLew 0:80ee8f3b695e 142 (++) Select the non-inverting input
EricLew 0:80ee8f3b695e 143 (++) If PGA mode is enabled, Select if inverting input is connected.
EricLew 0:80ee8f3b695e 144 (++) Select either factory or user defined trimming mode.
EricLew 0:80ee8f3b695e 145 (++) If the user-defined trimming mode is enabled, select PMOS & NMOS trimming values
EricLew 0:80ee8f3b695e 146 (typically values set by HAL_OPAMP_SelfCalibrate function).
EricLew 0:80ee8f3b695e 147
EricLew 0:80ee8f3b695e 148 (#) Enable the OPAMP using HAL_OPAMP_Start() function.
EricLew 0:80ee8f3b695e 149
EricLew 0:80ee8f3b695e 150 (#) Disable the OPAMP using HAL_OPAMP_Stop() function.
EricLew 0:80ee8f3b695e 151
EricLew 0:80ee8f3b695e 152 (#) Lock the OPAMP in running mode using HAL_OPAMP_Lock() function.
EricLew 0:80ee8f3b695e 153 Caution: On STM32L4, HAL OPAMP lock is software lock only (not
EricLew 0:80ee8f3b695e 154 hardware lock as on some other STM32 devices)
EricLew 0:80ee8f3b695e 155
EricLew 0:80ee8f3b695e 156 (#) If needed, unlock the OPAMP using HAL_OPAMPEx_Unlock() function.
EricLew 0:80ee8f3b695e 157
EricLew 0:80ee8f3b695e 158 *** Running mode: change of configuration while OPAMP ON ***
EricLew 0:80ee8f3b695e 159 ============================================
EricLew 0:80ee8f3b695e 160 [..] To Re-configure OPAMP when OPAMP is ON (change on the fly)
EricLew 0:80ee8f3b695e 161 (#) If needed, fill in the HAL_OPAMP_MspInit()
EricLew 0:80ee8f3b695e 162 (++) This is the case for instance if you wish to use new OPAMP I/O
EricLew 0:80ee8f3b695e 163
EricLew 0:80ee8f3b695e 164 (#) Configure the OPAMP using HAL_OPAMP_Init() function:
EricLew 0:80ee8f3b695e 165 (++) As in configure case, select first the parameters you wish to modify.
EricLew 0:80ee8f3b695e 166
EricLew 0:80ee8f3b695e 167 (#) Change from low power mode to normal power mode (& vice versa) requires
EricLew 0:80ee8f3b695e 168 first HAL_OPAMP_DeInit() (force OPAMP OFF) and then HAL_OPAMP_Init().
EricLew 0:80ee8f3b695e 169 In other words, of OPAMP is ON, HAL_OPAMP_Init can NOT change power mode
EricLew 0:80ee8f3b695e 170 alone.
EricLew 0:80ee8f3b695e 171
EricLew 0:80ee8f3b695e 172 @endverbatim
EricLew 0:80ee8f3b695e 173 ******************************************************************************
EricLew 0:80ee8f3b695e 174 * @attention
EricLew 0:80ee8f3b695e 175 *
EricLew 0:80ee8f3b695e 176 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
EricLew 0:80ee8f3b695e 177 *
EricLew 0:80ee8f3b695e 178 * Redistribution and use in source and binary forms, with or without modification,
EricLew 0:80ee8f3b695e 179 * are permitted provided that the following conditions are met:
EricLew 0:80ee8f3b695e 180 * 1. Redistributions of source code must retain the above copyright notice,
EricLew 0:80ee8f3b695e 181 * this list of conditions and the following disclaimer.
EricLew 0:80ee8f3b695e 182 * 2. Redistributions in binary form must reproduce the above copyright notice,
EricLew 0:80ee8f3b695e 183 * this list of conditions and the following disclaimer in the documentation
EricLew 0:80ee8f3b695e 184 * and/or other materials provided with the distribution.
EricLew 0:80ee8f3b695e 185 * 3. Neither the name of STMicroelectronics nor the names of its contributors
EricLew 0:80ee8f3b695e 186 * may be used to endorse or promote products derived from this software
EricLew 0:80ee8f3b695e 187 * without specific prior written permission.
EricLew 0:80ee8f3b695e 188 *
EricLew 0:80ee8f3b695e 189 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
EricLew 0:80ee8f3b695e 190 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
EricLew 0:80ee8f3b695e 191 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
EricLew 0:80ee8f3b695e 192 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
EricLew 0:80ee8f3b695e 193 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
EricLew 0:80ee8f3b695e 194 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
EricLew 0:80ee8f3b695e 195 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
EricLew 0:80ee8f3b695e 196 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
EricLew 0:80ee8f3b695e 197 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
EricLew 0:80ee8f3b695e 198 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
EricLew 0:80ee8f3b695e 199 *
EricLew 0:80ee8f3b695e 200 ******************************************************************************
EricLew 0:80ee8f3b695e 201 */
EricLew 0:80ee8f3b695e 202
EricLew 0:80ee8f3b695e 203 /* Includes ------------------------------------------------------------------*/
EricLew 0:80ee8f3b695e 204 #include "stm32l4xx_hal.h"
EricLew 0:80ee8f3b695e 205
EricLew 0:80ee8f3b695e 206 /** @addtogroup STM32L4xx_HAL_Driver
EricLew 0:80ee8f3b695e 207 * @{
EricLew 0:80ee8f3b695e 208 */
EricLew 0:80ee8f3b695e 209
EricLew 0:80ee8f3b695e 210 /** @defgroup OPAMP OPAMP
EricLew 0:80ee8f3b695e 211 * @brief OPAMP module driver
EricLew 0:80ee8f3b695e 212 * @{
EricLew 0:80ee8f3b695e 213 */
EricLew 0:80ee8f3b695e 214
EricLew 0:80ee8f3b695e 215 #ifdef HAL_OPAMP_MODULE_ENABLED
EricLew 0:80ee8f3b695e 216
EricLew 0:80ee8f3b695e 217 /* Private types -------------------------------------------------------------*/
EricLew 0:80ee8f3b695e 218 /* Private variables ---------------------------------------------------------*/
EricLew 0:80ee8f3b695e 219 /* Private constants ---------------------------------------------------------*/
EricLew 0:80ee8f3b695e 220 /** @addtogroup OPAMP_Private_Constants
EricLew 0:80ee8f3b695e 221 * @{
EricLew 0:80ee8f3b695e 222 */
EricLew 0:80ee8f3b695e 223
EricLew 0:80ee8f3b695e 224 /* CSR register reset value */
EricLew 0:80ee8f3b695e 225 #define OPAMP_CSR_RESET_VALUE ((uint32_t)0x00000000)
EricLew 0:80ee8f3b695e 226
EricLew 0:80ee8f3b695e 227 #define OPAMP_CSR_RESET_BITS (OPAMP_CSR_OPAMPxEN | OPAMP_CSR_OPALPM | OPAMP_CSR_OPAMODE \
EricLew 0:80ee8f3b695e 228 | OPAMP_CSR_PGGAIN | OPAMP_CSR_VMSEL | OPAMP_CSR_VPSEL \
EricLew 0:80ee8f3b695e 229 | OPAMP_CSR_CALON | OPAMP_CSR_USERTRIM)
EricLew 0:80ee8f3b695e 230
EricLew 0:80ee8f3b695e 231 /* CSR Init masks */
EricLew 0:80ee8f3b695e 232 #define OPAMP_CSR_INIT_MASK_PGA (OPAMP_CSR_OPALPM | OPAMP_CSR_OPAMODE| OPAMP_CSR_PGGAIN \
EricLew 0:80ee8f3b695e 233 | OPAMP_CSR_VMSEL | OPAMP_CSR_VPSEL | OPAMP_CSR_USERTRIM)
EricLew 0:80ee8f3b695e 234
EricLew 0:80ee8f3b695e 235 #define OPAMP_CSR_INIT_MASK_FOLLOWER (OPAMP_CSR_OPALPM | OPAMP_CSR_OPAMODE| OPAMP_CSR_VPSEL \
EricLew 0:80ee8f3b695e 236 | OPAMP_CSR_USERTRIM)
EricLew 0:80ee8f3b695e 237
EricLew 0:80ee8f3b695e 238 #define OPAMP_CSR_INIT_MASK_STANDALONE (OPAMP_CSR_OPALPM | OPAMP_CSR_OPAMODE| OPAMP_CSR_VPSEL \
EricLew 0:80ee8f3b695e 239 | OPAMP_CSR_VMSEL | OPAMP_CSR_USERTRIM)
EricLew 0:80ee8f3b695e 240
EricLew 0:80ee8f3b695e 241
EricLew 0:80ee8f3b695e 242 /**
EricLew 0:80ee8f3b695e 243 * @}
EricLew 0:80ee8f3b695e 244 */
EricLew 0:80ee8f3b695e 245
EricLew 0:80ee8f3b695e 246 /* Private macros ------------------------------------------------------------*/
EricLew 0:80ee8f3b695e 247 /* Private functions ---------------------------------------------------------*/
EricLew 0:80ee8f3b695e 248 /* Exported functions --------------------------------------------------------*/
EricLew 0:80ee8f3b695e 249
EricLew 0:80ee8f3b695e 250 /** @defgroup OPAMP_Exported_Functions OPAMP Exported Functions
EricLew 0:80ee8f3b695e 251 * @{
EricLew 0:80ee8f3b695e 252 */
EricLew 0:80ee8f3b695e 253
EricLew 0:80ee8f3b695e 254 /** @defgroup OPAMP_Exported_Functions_Group1 Initialization and de-initialization functions
EricLew 0:80ee8f3b695e 255 * @brief Initialization and Configuration functions
EricLew 0:80ee8f3b695e 256 *
EricLew 0:80ee8f3b695e 257 @verbatim
EricLew 0:80ee8f3b695e 258 ==============================================================================
EricLew 0:80ee8f3b695e 259 ##### Initialization and de-initialization functions #####
EricLew 0:80ee8f3b695e 260 ==============================================================================
EricLew 0:80ee8f3b695e 261
EricLew 0:80ee8f3b695e 262 @endverbatim
EricLew 0:80ee8f3b695e 263 * @{
EricLew 0:80ee8f3b695e 264 */
EricLew 0:80ee8f3b695e 265
EricLew 0:80ee8f3b695e 266 /**
EricLew 0:80ee8f3b695e 267 * @brief Initializes the OPAMP according to the specified
EricLew 0:80ee8f3b695e 268 * parameters in the OPAMP_InitTypeDef and initialize the associated handle.
EricLew 0:80ee8f3b695e 269 * @note If the selected opamp is locked, initialization can't be performed.
EricLew 0:80ee8f3b695e 270 * To unlock the configuration, perform a system reset.
EricLew 0:80ee8f3b695e 271 * @param hopamp: OPAMP handle
EricLew 0:80ee8f3b695e 272 * @retval HAL status
EricLew 0:80ee8f3b695e 273 */
EricLew 0:80ee8f3b695e 274 HAL_StatusTypeDef HAL_OPAMP_Init(OPAMP_HandleTypeDef *hopamp)
EricLew 0:80ee8f3b695e 275 {
EricLew 0:80ee8f3b695e 276 HAL_StatusTypeDef status = HAL_OK;
EricLew 0:80ee8f3b695e 277 uint32_t updateotrlpotr = 0;
EricLew 0:80ee8f3b695e 278
EricLew 0:80ee8f3b695e 279 /* Check the OPAMP handle allocation and lock status */
EricLew 0:80ee8f3b695e 280 /* Init not allowed if calibration is ongoing */
EricLew 0:80ee8f3b695e 281 if((hopamp == NULL) || (hopamp->State == HAL_OPAMP_STATE_BUSYLOCKED)
EricLew 0:80ee8f3b695e 282 || (hopamp->State == HAL_OPAMP_STATE_CALIBBUSY))
EricLew 0:80ee8f3b695e 283 {
EricLew 0:80ee8f3b695e 284 return HAL_ERROR;
EricLew 0:80ee8f3b695e 285 }
EricLew 0:80ee8f3b695e 286 else
EricLew 0:80ee8f3b695e 287 {
EricLew 0:80ee8f3b695e 288 /* Check the parameter */
EricLew 0:80ee8f3b695e 289 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp->Instance));
EricLew 0:80ee8f3b695e 290
EricLew 0:80ee8f3b695e 291 /* Set OPAMP parameters */
EricLew 0:80ee8f3b695e 292 assert_param(IS_OPAMP_POWER_SUPPLY_RANGE(hopamp->Init.PowerSupplyRange));
EricLew 0:80ee8f3b695e 293 assert_param(IS_OPAMP_POWERMODE(hopamp->Init.PowerMode));
EricLew 0:80ee8f3b695e 294 assert_param(IS_OPAMP_FUNCTIONAL_NORMALMODE(hopamp->Init.Mode));
EricLew 0:80ee8f3b695e 295 assert_param(IS_OPAMP_NONINVERTING_INPUT(hopamp->Init.NonInvertingInput));
EricLew 0:80ee8f3b695e 296
EricLew 0:80ee8f3b695e 297 if ((hopamp->Init.Mode) == OPAMP_STANDALONE_MODE)
EricLew 0:80ee8f3b695e 298 {
EricLew 0:80ee8f3b695e 299 assert_param(IS_OPAMP_INVERTING_INPUT_STANDALONE(hopamp->Init.InvertingInput));
EricLew 0:80ee8f3b695e 300 }
EricLew 0:80ee8f3b695e 301
EricLew 0:80ee8f3b695e 302 if ((hopamp->Init.Mode) == OPAMP_PGA_MODE)
EricLew 0:80ee8f3b695e 303 {
EricLew 0:80ee8f3b695e 304 assert_param(IS_OPAMP_INVERTING_INPUT_PGA(hopamp->Init.InvertingInput));
EricLew 0:80ee8f3b695e 305 }
EricLew 0:80ee8f3b695e 306
EricLew 0:80ee8f3b695e 307 if ((hopamp->Init.Mode) == OPAMP_PGA_MODE)
EricLew 0:80ee8f3b695e 308 {
EricLew 0:80ee8f3b695e 309 assert_param(IS_OPAMP_PGA_GAIN(hopamp->Init.PgaGain));
EricLew 0:80ee8f3b695e 310 }
EricLew 0:80ee8f3b695e 311
EricLew 0:80ee8f3b695e 312 assert_param(IS_OPAMP_TRIMMING(hopamp->Init.UserTrimming));
EricLew 0:80ee8f3b695e 313 if ((hopamp->Init.UserTrimming) == OPAMP_TRIMMING_USER)
EricLew 0:80ee8f3b695e 314 {
EricLew 0:80ee8f3b695e 315 if (hopamp->Init.PowerMode == OPAMP_POWERMODE_NORMAL)
EricLew 0:80ee8f3b695e 316 {
EricLew 0:80ee8f3b695e 317 assert_param(IS_OPAMP_TRIMMINGVALUE(hopamp->Init.TrimmingValueP));
EricLew 0:80ee8f3b695e 318 assert_param(IS_OPAMP_TRIMMINGVALUE(hopamp->Init.TrimmingValueN));
EricLew 0:80ee8f3b695e 319 }
EricLew 0:80ee8f3b695e 320 else
EricLew 0:80ee8f3b695e 321 {
EricLew 0:80ee8f3b695e 322 assert_param(IS_OPAMP_TRIMMINGVALUE(hopamp->Init.TrimmingValuePLowPower));
EricLew 0:80ee8f3b695e 323 assert_param(IS_OPAMP_TRIMMINGVALUE(hopamp->Init.TrimmingValueNLowPower));
EricLew 0:80ee8f3b695e 324 }
EricLew 0:80ee8f3b695e 325 }
EricLew 0:80ee8f3b695e 326
EricLew 0:80ee8f3b695e 327 if(hopamp->State == HAL_OPAMP_STATE_RESET)
EricLew 0:80ee8f3b695e 328 {
EricLew 0:80ee8f3b695e 329 /* Allocate lock resource and initialize it */
EricLew 0:80ee8f3b695e 330 hopamp->Lock = HAL_UNLOCKED;
EricLew 0:80ee8f3b695e 331 }
EricLew 0:80ee8f3b695e 332
EricLew 0:80ee8f3b695e 333 /* Call MSP init function */
EricLew 0:80ee8f3b695e 334 HAL_OPAMP_MspInit(hopamp);
EricLew 0:80ee8f3b695e 335
EricLew 0:80ee8f3b695e 336 /* Set operating mode */
EricLew 0:80ee8f3b695e 337 CLEAR_BIT(hopamp->Instance->CSR, OPAMP_CSR_CALON);
EricLew 0:80ee8f3b695e 338
EricLew 0:80ee8f3b695e 339 if (hopamp->Init.Mode == OPAMP_PGA_MODE)
EricLew 0:80ee8f3b695e 340 {
EricLew 0:80ee8f3b695e 341 MODIFY_REG(hopamp->Instance->CSR, OPAMP_CSR_INIT_MASK_PGA, \
EricLew 0:80ee8f3b695e 342 hopamp->Init.PowerMode | \
EricLew 0:80ee8f3b695e 343 hopamp->Init.Mode | \
EricLew 0:80ee8f3b695e 344 hopamp->Init.PgaGain | \
EricLew 0:80ee8f3b695e 345 hopamp->Init.InvertingInput | \
EricLew 0:80ee8f3b695e 346 hopamp->Init.NonInvertingInput | \
EricLew 0:80ee8f3b695e 347 hopamp->Init.UserTrimming);
EricLew 0:80ee8f3b695e 348 }
EricLew 0:80ee8f3b695e 349
EricLew 0:80ee8f3b695e 350 if (hopamp->Init.Mode == OPAMP_FOLLOWER_MODE)
EricLew 0:80ee8f3b695e 351 {
EricLew 0:80ee8f3b695e 352 /* In Follower mode InvertingInput is Not Applicable */
EricLew 0:80ee8f3b695e 353 MODIFY_REG(hopamp->Instance->CSR, OPAMP_CSR_INIT_MASK_FOLLOWER, \
EricLew 0:80ee8f3b695e 354 hopamp->Init.PowerMode | \
EricLew 0:80ee8f3b695e 355 hopamp->Init.Mode | \
EricLew 0:80ee8f3b695e 356 hopamp->Init.NonInvertingInput | \
EricLew 0:80ee8f3b695e 357 hopamp->Init.UserTrimming);
EricLew 0:80ee8f3b695e 358 }
EricLew 0:80ee8f3b695e 359
EricLew 0:80ee8f3b695e 360 if (hopamp->Init.Mode == OPAMP_STANDALONE_MODE)
EricLew 0:80ee8f3b695e 361 {
EricLew 0:80ee8f3b695e 362 MODIFY_REG(hopamp->Instance->CSR, OPAMP_CSR_INIT_MASK_STANDALONE, \
EricLew 0:80ee8f3b695e 363 hopamp->Init.PowerMode | \
EricLew 0:80ee8f3b695e 364 hopamp->Init.Mode | \
EricLew 0:80ee8f3b695e 365 hopamp->Init.InvertingInput | \
EricLew 0:80ee8f3b695e 366 hopamp->Init.NonInvertingInput | \
EricLew 0:80ee8f3b695e 367 hopamp->Init.UserTrimming);
EricLew 0:80ee8f3b695e 368 }
EricLew 0:80ee8f3b695e 369
EricLew 0:80ee8f3b695e 370 if (hopamp->Init.UserTrimming == OPAMP_TRIMMING_USER)
EricLew 0:80ee8f3b695e 371 {
EricLew 0:80ee8f3b695e 372 /* Set power mode and associated calibration parameters */
EricLew 0:80ee8f3b695e 373 if (hopamp->Init.PowerMode != OPAMP_POWERMODE_LOWPOWER)
EricLew 0:80ee8f3b695e 374 {
EricLew 0:80ee8f3b695e 375 /* OPAMP_POWERMODE_NORMAL */
EricLew 0:80ee8f3b695e 376 /* Set calibration mode (factory or user) and values for */
EricLew 0:80ee8f3b695e 377 /* transistors differential pair high (PMOS) and low (NMOS) for */
EricLew 0:80ee8f3b695e 378 /* normal mode. */
EricLew 0:80ee8f3b695e 379 updateotrlpotr = (((hopamp->Init.TrimmingValueP) << (OPAMP_INPUT_NONINVERTING)) \
EricLew 0:80ee8f3b695e 380 | (hopamp->Init.TrimmingValueN));
EricLew 0:80ee8f3b695e 381 MODIFY_REG(hopamp->Instance->OTR, OPAMP_OTR_TRIMOFFSETN | OPAMP_OTR_TRIMOFFSETP, updateotrlpotr);
EricLew 0:80ee8f3b695e 382 }
EricLew 0:80ee8f3b695e 383 else
EricLew 0:80ee8f3b695e 384 {
EricLew 0:80ee8f3b695e 385 /* OPAMP_POWERMODE_LOWPOWER */
EricLew 0:80ee8f3b695e 386 /* transistors differential pair high (PMOS) and low (NMOS) for */
EricLew 0:80ee8f3b695e 387 /* low power mode. */
EricLew 0:80ee8f3b695e 388 updateotrlpotr = (((hopamp->Init.TrimmingValuePLowPower) << (OPAMP_INPUT_NONINVERTING)) \
EricLew 0:80ee8f3b695e 389 | (hopamp->Init.TrimmingValueNLowPower));
EricLew 0:80ee8f3b695e 390 MODIFY_REG(hopamp->Instance->LPOTR, OPAMP_OTR_TRIMOFFSETN | OPAMP_OTR_TRIMOFFSETP, updateotrlpotr);
EricLew 0:80ee8f3b695e 391 }
EricLew 0:80ee8f3b695e 392 }
EricLew 0:80ee8f3b695e 393
EricLew 0:80ee8f3b695e 394 /* Configure the power supply range */
EricLew 0:80ee8f3b695e 395 /* The OPAMP_CSR_OPARANGE is common configuration for all OPAMPs */
EricLew 0:80ee8f3b695e 396 /* bit OPAMP1_CSR_OPARANGE is used for both OPAMPs */
EricLew 0:80ee8f3b695e 397 MODIFY_REG(OPAMP1->CSR, OPAMP1_CSR_OPARANGE, hopamp->Init.PowerSupplyRange);
EricLew 0:80ee8f3b695e 398
EricLew 0:80ee8f3b695e 399 /* Update the OPAMP state*/
EricLew 0:80ee8f3b695e 400 if (hopamp->State == HAL_OPAMP_STATE_RESET)
EricLew 0:80ee8f3b695e 401 {
EricLew 0:80ee8f3b695e 402 /* From RESET state to READY State */
EricLew 0:80ee8f3b695e 403 hopamp->State = HAL_OPAMP_STATE_READY;
EricLew 0:80ee8f3b695e 404 }
EricLew 0:80ee8f3b695e 405 /* else: remain in READY or BUSY state (no update) */
EricLew 0:80ee8f3b695e 406 return status;
EricLew 0:80ee8f3b695e 407 }
EricLew 0:80ee8f3b695e 408 }
EricLew 0:80ee8f3b695e 409
EricLew 0:80ee8f3b695e 410 /**
EricLew 0:80ee8f3b695e 411 * @brief DeInitialize the OPAMP peripheral.
EricLew 0:80ee8f3b695e 412 * @note Deinitialization can be performed if the OPAMP configuration is locked.
EricLew 0:80ee8f3b695e 413 * (the lock is SW in L4)
EricLew 0:80ee8f3b695e 414 * @param hopamp: OPAMP handle
EricLew 0:80ee8f3b695e 415 * @retval HAL status
EricLew 0:80ee8f3b695e 416 */
EricLew 0:80ee8f3b695e 417 HAL_StatusTypeDef HAL_OPAMP_DeInit(OPAMP_HandleTypeDef *hopamp)
EricLew 0:80ee8f3b695e 418 {
EricLew 0:80ee8f3b695e 419 HAL_StatusTypeDef status = HAL_OK;
EricLew 0:80ee8f3b695e 420
EricLew 0:80ee8f3b695e 421 /* Check the OPAMP handle allocation */
EricLew 0:80ee8f3b695e 422 /* DeInit not allowed if calibration is ongoing */
EricLew 0:80ee8f3b695e 423 if((hopamp == NULL) || (hopamp->State == HAL_OPAMP_STATE_CALIBBUSY))
EricLew 0:80ee8f3b695e 424 {
EricLew 0:80ee8f3b695e 425 status = HAL_ERROR;
EricLew 0:80ee8f3b695e 426 }
EricLew 0:80ee8f3b695e 427 else
EricLew 0:80ee8f3b695e 428 {
EricLew 0:80ee8f3b695e 429 /* Check the parameter */
EricLew 0:80ee8f3b695e 430 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp->Instance));
EricLew 0:80ee8f3b695e 431
EricLew 0:80ee8f3b695e 432 /* Set OPAMP_CSR register to reset value */
EricLew 0:80ee8f3b695e 433 /* Mind that OPAMP1_CSR_OPARANGE of CSR of OPAMP1 remains unchanged (applies to both OPAMPs) */
EricLew 0:80ee8f3b695e 434 /* OPAMP shall be disabled first separately */
EricLew 0:80ee8f3b695e 435 CLEAR_BIT(hopamp->Instance->CSR, OPAMP_CSR_OPAMPxEN);
EricLew 0:80ee8f3b695e 436 MODIFY_REG(hopamp->Instance->CSR, OPAMP_CSR_RESET_BITS, OPAMP_CSR_RESET_VALUE);
EricLew 0:80ee8f3b695e 437
EricLew 0:80ee8f3b695e 438 /* DeInit the low level hardware: GPIO, CLOCK and NVIC */
EricLew 0:80ee8f3b695e 439 HAL_OPAMP_MspDeInit(hopamp);
EricLew 0:80ee8f3b695e 440
EricLew 0:80ee8f3b695e 441 /* Update the OPAMP state*/
EricLew 0:80ee8f3b695e 442 hopamp->State = HAL_OPAMP_STATE_RESET;
EricLew 0:80ee8f3b695e 443 }
EricLew 0:80ee8f3b695e 444
EricLew 0:80ee8f3b695e 445 /* Process unlocked */
EricLew 0:80ee8f3b695e 446 __HAL_UNLOCK(hopamp);
EricLew 0:80ee8f3b695e 447
EricLew 0:80ee8f3b695e 448 return status;
EricLew 0:80ee8f3b695e 449 }
EricLew 0:80ee8f3b695e 450
EricLew 0:80ee8f3b695e 451
EricLew 0:80ee8f3b695e 452 /**
EricLew 0:80ee8f3b695e 453 * @brief Initialize the OPAMP MSP.
EricLew 0:80ee8f3b695e 454 * @param hopamp: OPAMP handle
EricLew 0:80ee8f3b695e 455 * @retval None
EricLew 0:80ee8f3b695e 456 */
EricLew 0:80ee8f3b695e 457 __weak void HAL_OPAMP_MspInit(OPAMP_HandleTypeDef *hopamp)
EricLew 0:80ee8f3b695e 458 {
EricLew 0:80ee8f3b695e 459 /* NOTE : This function should not be modified, when the callback is needed,
EricLew 0:80ee8f3b695e 460 the function "HAL_OPAMP_MspInit()" must be implemented in the user file.
EricLew 0:80ee8f3b695e 461 */
EricLew 0:80ee8f3b695e 462 }
EricLew 0:80ee8f3b695e 463
EricLew 0:80ee8f3b695e 464 /**
EricLew 0:80ee8f3b695e 465 * @brief DeInitialize OPAMP MSP.
EricLew 0:80ee8f3b695e 466 * @param hopamp: OPAMP handle
EricLew 0:80ee8f3b695e 467 * @retval None
EricLew 0:80ee8f3b695e 468 */
EricLew 0:80ee8f3b695e 469 __weak void HAL_OPAMP_MspDeInit(OPAMP_HandleTypeDef *hopamp)
EricLew 0:80ee8f3b695e 470 {
EricLew 0:80ee8f3b695e 471 /* NOTE : This function should not be modified, when the callback is needed,
EricLew 0:80ee8f3b695e 472 the function "HAL_OPAMP_MspDeInit()" must be implemented in the user file.
EricLew 0:80ee8f3b695e 473 */
EricLew 0:80ee8f3b695e 474 }
EricLew 0:80ee8f3b695e 475
EricLew 0:80ee8f3b695e 476 /**
EricLew 0:80ee8f3b695e 477 * @}
EricLew 0:80ee8f3b695e 478 */
EricLew 0:80ee8f3b695e 479
EricLew 0:80ee8f3b695e 480
EricLew 0:80ee8f3b695e 481 /** @defgroup OPAMP_Exported_Functions_Group2 IO operation functions
EricLew 0:80ee8f3b695e 482 * @brief IO operation functions
EricLew 0:80ee8f3b695e 483 *
EricLew 0:80ee8f3b695e 484 @verbatim
EricLew 0:80ee8f3b695e 485 ===============================================================================
EricLew 0:80ee8f3b695e 486 ##### IO operation functions #####
EricLew 0:80ee8f3b695e 487 ===============================================================================
EricLew 0:80ee8f3b695e 488 [..]
EricLew 0:80ee8f3b695e 489 This subsection provides a set of functions allowing to manage the OPAMP
EricLew 0:80ee8f3b695e 490 start, stop and calibration actions.
EricLew 0:80ee8f3b695e 491
EricLew 0:80ee8f3b695e 492 @endverbatim
EricLew 0:80ee8f3b695e 493 * @{
EricLew 0:80ee8f3b695e 494 */
EricLew 0:80ee8f3b695e 495
EricLew 0:80ee8f3b695e 496 /**
EricLew 0:80ee8f3b695e 497 * @brief Start the OPAMP.
EricLew 0:80ee8f3b695e 498 * @param hopamp: OPAMP handle
EricLew 0:80ee8f3b695e 499 * @retval HAL status
EricLew 0:80ee8f3b695e 500 */
EricLew 0:80ee8f3b695e 501
EricLew 0:80ee8f3b695e 502 HAL_StatusTypeDef HAL_OPAMP_Start(OPAMP_HandleTypeDef *hopamp)
EricLew 0:80ee8f3b695e 503 {
EricLew 0:80ee8f3b695e 504 HAL_StatusTypeDef status = HAL_OK;
EricLew 0:80ee8f3b695e 505
EricLew 0:80ee8f3b695e 506 /* Check the OPAMP handle allocation */
EricLew 0:80ee8f3b695e 507 /* Check if OPAMP locked */
EricLew 0:80ee8f3b695e 508 if((hopamp == NULL) || (hopamp->State == HAL_OPAMP_STATE_BUSYLOCKED))
EricLew 0:80ee8f3b695e 509 {
EricLew 0:80ee8f3b695e 510 status = HAL_ERROR;
EricLew 0:80ee8f3b695e 511 }
EricLew 0:80ee8f3b695e 512 else
EricLew 0:80ee8f3b695e 513 {
EricLew 0:80ee8f3b695e 514 /* Check the parameter */
EricLew 0:80ee8f3b695e 515 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp->Instance));
EricLew 0:80ee8f3b695e 516
EricLew 0:80ee8f3b695e 517 if(hopamp->State == HAL_OPAMP_STATE_READY)
EricLew 0:80ee8f3b695e 518 {
EricLew 0:80ee8f3b695e 519 /* Enable the selected opamp */
EricLew 0:80ee8f3b695e 520 SET_BIT (hopamp->Instance->CSR, OPAMP_CSR_OPAMPxEN);
EricLew 0:80ee8f3b695e 521
EricLew 0:80ee8f3b695e 522 /* Update the OPAMP state*/
EricLew 0:80ee8f3b695e 523 /* From HAL_OPAMP_STATE_READY to HAL_OPAMP_STATE_BUSY */
EricLew 0:80ee8f3b695e 524 hopamp->State = HAL_OPAMP_STATE_BUSY;
EricLew 0:80ee8f3b695e 525 }
EricLew 0:80ee8f3b695e 526 else
EricLew 0:80ee8f3b695e 527 {
EricLew 0:80ee8f3b695e 528 status = HAL_ERROR;
EricLew 0:80ee8f3b695e 529 }
EricLew 0:80ee8f3b695e 530
EricLew 0:80ee8f3b695e 531 }
EricLew 0:80ee8f3b695e 532 return status;
EricLew 0:80ee8f3b695e 533 }
EricLew 0:80ee8f3b695e 534
EricLew 0:80ee8f3b695e 535 /**
EricLew 0:80ee8f3b695e 536 * @brief Stop the OPAMP.
EricLew 0:80ee8f3b695e 537 * @param hopamp: OPAMP handle
EricLew 0:80ee8f3b695e 538 * @retval HAL status
EricLew 0:80ee8f3b695e 539 */
EricLew 0:80ee8f3b695e 540 HAL_StatusTypeDef HAL_OPAMP_Stop(OPAMP_HandleTypeDef *hopamp)
EricLew 0:80ee8f3b695e 541 {
EricLew 0:80ee8f3b695e 542 HAL_StatusTypeDef status = HAL_OK;
EricLew 0:80ee8f3b695e 543
EricLew 0:80ee8f3b695e 544 /* Check the OPAMP handle allocation */
EricLew 0:80ee8f3b695e 545 /* Check if OPAMP locked */
EricLew 0:80ee8f3b695e 546 /* Check if OPAMP calibration ongoing */
EricLew 0:80ee8f3b695e 547 if((hopamp == NULL) || (hopamp->State == HAL_OPAMP_STATE_BUSYLOCKED) \
EricLew 0:80ee8f3b695e 548 || (hopamp->State == HAL_OPAMP_STATE_CALIBBUSY))
EricLew 0:80ee8f3b695e 549 {
EricLew 0:80ee8f3b695e 550 status = HAL_ERROR;
EricLew 0:80ee8f3b695e 551 }
EricLew 0:80ee8f3b695e 552 else
EricLew 0:80ee8f3b695e 553 {
EricLew 0:80ee8f3b695e 554 /* Check the parameter */
EricLew 0:80ee8f3b695e 555 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp->Instance));
EricLew 0:80ee8f3b695e 556
EricLew 0:80ee8f3b695e 557 if(hopamp->State == HAL_OPAMP_STATE_BUSY)
EricLew 0:80ee8f3b695e 558 {
EricLew 0:80ee8f3b695e 559 /* Disable the selected opamp */
EricLew 0:80ee8f3b695e 560 CLEAR_BIT (hopamp->Instance->CSR, OPAMP_CSR_OPAMPxEN);
EricLew 0:80ee8f3b695e 561
EricLew 0:80ee8f3b695e 562 /* Update the OPAMP state*/
EricLew 0:80ee8f3b695e 563 /* From HAL_OPAMP_STATE_BUSY to HAL_OPAMP_STATE_READY*/
EricLew 0:80ee8f3b695e 564 hopamp->State = HAL_OPAMP_STATE_READY;
EricLew 0:80ee8f3b695e 565 }
EricLew 0:80ee8f3b695e 566 else
EricLew 0:80ee8f3b695e 567 {
EricLew 0:80ee8f3b695e 568 status = HAL_ERROR;
EricLew 0:80ee8f3b695e 569 }
EricLew 0:80ee8f3b695e 570 }
EricLew 0:80ee8f3b695e 571 return status;
EricLew 0:80ee8f3b695e 572 }
EricLew 0:80ee8f3b695e 573
EricLew 0:80ee8f3b695e 574 /**
EricLew 0:80ee8f3b695e 575 * @brief Run the self calibration of one OPAMP.
EricLew 0:80ee8f3b695e 576 * @note Calibration is performed in the mode specified in OPAMP init
EricLew 0:80ee8f3b695e 577 * structure (mode normal or low-power). To perform calibration for
EricLew 0:80ee8f3b695e 578 * both modes, repeat this function twice after OPAMP init structure
EricLew 0:80ee8f3b695e 579 * accordingly updated.
EricLew 0:80ee8f3b695e 580 * @note Calibration runs about 10 ms.
EricLew 0:80ee8f3b695e 581 * @param hopamp handle
EricLew 0:80ee8f3b695e 582 * @retval Updated offset trimming values (PMOS & NMOS), user trimming is enabled
EricLew 0:80ee8f3b695e 583 * @retval HAL status
EricLew 0:80ee8f3b695e 584
EricLew 0:80ee8f3b695e 585 */
EricLew 0:80ee8f3b695e 586
EricLew 0:80ee8f3b695e 587 HAL_StatusTypeDef HAL_OPAMP_SelfCalibrate(OPAMP_HandleTypeDef *hopamp)
EricLew 0:80ee8f3b695e 588 {
EricLew 0:80ee8f3b695e 589
EricLew 0:80ee8f3b695e 590 HAL_StatusTypeDef status = HAL_OK;
EricLew 0:80ee8f3b695e 591
EricLew 0:80ee8f3b695e 592 uint32_t trimmingvaluen = 0;
EricLew 0:80ee8f3b695e 593 uint32_t trimmingvaluep = 0;
EricLew 0:80ee8f3b695e 594 uint32_t delta;
EricLew 0:80ee8f3b695e 595
EricLew 0:80ee8f3b695e 596 __IO uint32_t* tmp_opamp_reg_trimming; /* Selection of register of trimming depending on power mode: OTR or LPOTR */
EricLew 0:80ee8f3b695e 597
EricLew 0:80ee8f3b695e 598 /* Check the OPAMP handle allocation */
EricLew 0:80ee8f3b695e 599 /* Check if OPAMP locked */
EricLew 0:80ee8f3b695e 600 if((hopamp == NULL) || (hopamp->State == HAL_OPAMP_STATE_BUSYLOCKED))
EricLew 0:80ee8f3b695e 601 {
EricLew 0:80ee8f3b695e 602 status = HAL_ERROR;
EricLew 0:80ee8f3b695e 603 }
EricLew 0:80ee8f3b695e 604 else
EricLew 0:80ee8f3b695e 605 {
EricLew 0:80ee8f3b695e 606
EricLew 0:80ee8f3b695e 607 /* Check if OPAMP in calibration mode and calibration not yet enable */
EricLew 0:80ee8f3b695e 608 if(hopamp->State == HAL_OPAMP_STATE_READY)
EricLew 0:80ee8f3b695e 609 {
EricLew 0:80ee8f3b695e 610 /* Check the parameter */
EricLew 0:80ee8f3b695e 611 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp->Instance));
EricLew 0:80ee8f3b695e 612 assert_param(IS_OPAMP_POWERMODE(hopamp->Init.PowerMode));
EricLew 0:80ee8f3b695e 613
EricLew 0:80ee8f3b695e 614 /* user trimming values are used for offset calibration */
EricLew 0:80ee8f3b695e 615 SET_BIT(hopamp->Instance->CSR, OPAMP_CSR_USERTRIM);
EricLew 0:80ee8f3b695e 616
EricLew 0:80ee8f3b695e 617 /* Select trimming settings depending on power mode */
EricLew 0:80ee8f3b695e 618 if (hopamp->Init.PowerMode == OPAMP_POWERMODE_NORMAL)
EricLew 0:80ee8f3b695e 619 {
EricLew 0:80ee8f3b695e 620 tmp_opamp_reg_trimming = &hopamp->Instance->OTR;
EricLew 0:80ee8f3b695e 621 }
EricLew 0:80ee8f3b695e 622 else
EricLew 0:80ee8f3b695e 623 {
EricLew 0:80ee8f3b695e 624 tmp_opamp_reg_trimming = &hopamp->Instance->LPOTR;
EricLew 0:80ee8f3b695e 625 }
EricLew 0:80ee8f3b695e 626
EricLew 0:80ee8f3b695e 627 /* Enable calibration */
EricLew 0:80ee8f3b695e 628 SET_BIT (hopamp->Instance->CSR, OPAMP_CSR_CALON);
EricLew 0:80ee8f3b695e 629
EricLew 0:80ee8f3b695e 630 /* 1st calibration - N */
EricLew 0:80ee8f3b695e 631 CLEAR_BIT (hopamp->Instance->CSR, OPAMP_CSR_CALSEL);
EricLew 0:80ee8f3b695e 632
EricLew 0:80ee8f3b695e 633 /* Enable the selected opamp */
EricLew 0:80ee8f3b695e 634 SET_BIT (hopamp->Instance->CSR, OPAMP_CSR_OPAMPxEN);
EricLew 0:80ee8f3b695e 635
EricLew 0:80ee8f3b695e 636 /* Init trimming counter */
EricLew 0:80ee8f3b695e 637 /* Medium value */
EricLew 0:80ee8f3b695e 638 trimmingvaluen = 16;
EricLew 0:80ee8f3b695e 639 delta = 8;
EricLew 0:80ee8f3b695e 640
EricLew 0:80ee8f3b695e 641 while (delta != 0)
EricLew 0:80ee8f3b695e 642 {
EricLew 0:80ee8f3b695e 643 /* Set candidate trimming */
EricLew 0:80ee8f3b695e 644 /* OPAMP_POWERMODE_NORMAL */
EricLew 0:80ee8f3b695e 645 MODIFY_REG(*tmp_opamp_reg_trimming, OPAMP_OTR_TRIMOFFSETN, trimmingvaluen);
EricLew 0:80ee8f3b695e 646
EricLew 0:80ee8f3b695e 647 /* OFFTRIMmax delay 1 ms as per datasheet (electrical characteristics */
EricLew 0:80ee8f3b695e 648 /* Offset trim time: during calibration, minimum time needed between */
EricLew 0:80ee8f3b695e 649 /* two steps to have 1 mV accuracy */
EricLew 0:80ee8f3b695e 650 HAL_Delay(OPAMP_TRIMMING_DELAY);
EricLew 0:80ee8f3b695e 651
EricLew 0:80ee8f3b695e 652 if (READ_BIT(hopamp->Instance->CSR, OPAMP_CSR_CALOUT) != RESET)
EricLew 0:80ee8f3b695e 653 {
EricLew 0:80ee8f3b695e 654 /* OPAMP_CSR_CALOUT is HIGH try higher trimming */
EricLew 0:80ee8f3b695e 655 trimmingvaluen -= delta;
EricLew 0:80ee8f3b695e 656 }
EricLew 0:80ee8f3b695e 657 else
EricLew 0:80ee8f3b695e 658 {
EricLew 0:80ee8f3b695e 659 /* OPAMP_CSR_CALOUT is LOW try lower trimming */
EricLew 0:80ee8f3b695e 660 trimmingvaluen += delta;
EricLew 0:80ee8f3b695e 661 }
EricLew 0:80ee8f3b695e 662 /* Divide range by 2 to continue dichotomy sweep */
EricLew 0:80ee8f3b695e 663 delta >>= 1;
EricLew 0:80ee8f3b695e 664 }
EricLew 0:80ee8f3b695e 665
EricLew 0:80ee8f3b695e 666 /* Still need to check if right calibration is current value or one step below */
EricLew 0:80ee8f3b695e 667 /* Indeed the first value that causes the OUTCAL bit to change from 0 to 1 */
EricLew 0:80ee8f3b695e 668 /* Set candidate trimming */
EricLew 0:80ee8f3b695e 669 MODIFY_REG(*tmp_opamp_reg_trimming, OPAMP_OTR_TRIMOFFSETN, trimmingvaluen);
EricLew 0:80ee8f3b695e 670
EricLew 0:80ee8f3b695e 671 /* OFFTRIMmax delay 1 ms as per datasheet (electrical characteristics */
EricLew 0:80ee8f3b695e 672 /* Offset trim time: during calibration, minimum time needed between */
EricLew 0:80ee8f3b695e 673 /* two steps to have 1 mV accuracy */
EricLew 0:80ee8f3b695e 674 HAL_Delay(OPAMP_TRIMMING_DELAY);
EricLew 0:80ee8f3b695e 675
EricLew 0:80ee8f3b695e 676 if ((READ_BIT(hopamp->Instance->CSR, OPAMP_CSR_CALOUT)) == 0)
EricLew 0:80ee8f3b695e 677 {
EricLew 0:80ee8f3b695e 678 /* Trimming value is actually one value more */
EricLew 0:80ee8f3b695e 679 trimmingvaluen++;
EricLew 0:80ee8f3b695e 680 /* Set right trimming */
EricLew 0:80ee8f3b695e 681 MODIFY_REG(*tmp_opamp_reg_trimming, OPAMP_OTR_TRIMOFFSETN, trimmingvaluen);
EricLew 0:80ee8f3b695e 682 }
EricLew 0:80ee8f3b695e 683
EricLew 0:80ee8f3b695e 684 /* 2nd calibration - P */
EricLew 0:80ee8f3b695e 685 SET_BIT (hopamp->Instance->CSR, OPAMP_CSR_CALSEL);
EricLew 0:80ee8f3b695e 686
EricLew 0:80ee8f3b695e 687 /* Init trimming counter */
EricLew 0:80ee8f3b695e 688 /* Medium value */
EricLew 0:80ee8f3b695e 689 trimmingvaluep = 16;
EricLew 0:80ee8f3b695e 690 delta = 8;
EricLew 0:80ee8f3b695e 691
EricLew 0:80ee8f3b695e 692 while (delta != 0)
EricLew 0:80ee8f3b695e 693 {
EricLew 0:80ee8f3b695e 694 /* Set candidate trimming */
EricLew 0:80ee8f3b695e 695 /* OPAMP_POWERMODE_NORMAL */
EricLew 0:80ee8f3b695e 696 MODIFY_REG(*tmp_opamp_reg_trimming, OPAMP_OTR_TRIMOFFSETP, (trimmingvaluep<<OPAMP_INPUT_NONINVERTING));
EricLew 0:80ee8f3b695e 697
EricLew 0:80ee8f3b695e 698 /* OFFTRIMmax delay 1 ms as per datasheet (electrical characteristics */
EricLew 0:80ee8f3b695e 699 /* Offset trim time: during calibration, minimum time needed between */
EricLew 0:80ee8f3b695e 700 /* two steps to have 1 mV accuracy */
EricLew 0:80ee8f3b695e 701 HAL_Delay(OPAMP_TRIMMING_DELAY);
EricLew 0:80ee8f3b695e 702
EricLew 0:80ee8f3b695e 703 if (READ_BIT(hopamp->Instance->CSR, OPAMP_CSR_CALOUT) != RESET)
EricLew 0:80ee8f3b695e 704 {
EricLew 0:80ee8f3b695e 705 /* OPAMP_CSR_CALOUT is HIGH try higher trimming */
EricLew 0:80ee8f3b695e 706 trimmingvaluep += delta;
EricLew 0:80ee8f3b695e 707 }
EricLew 0:80ee8f3b695e 708 else
EricLew 0:80ee8f3b695e 709 {
EricLew 0:80ee8f3b695e 710 /* OPAMP_CSR_CALOUT is LOW try lower trimming */
EricLew 0:80ee8f3b695e 711 trimmingvaluep -= delta;
EricLew 0:80ee8f3b695e 712 }
EricLew 0:80ee8f3b695e 713
EricLew 0:80ee8f3b695e 714 /* Divide range by 2 to continue dichotomy sweep */
EricLew 0:80ee8f3b695e 715 delta >>= 1;
EricLew 0:80ee8f3b695e 716 }
EricLew 0:80ee8f3b695e 717
EricLew 0:80ee8f3b695e 718 /* Still need to check if right calibration is current value or one step below */
EricLew 0:80ee8f3b695e 719 /* Indeed the first value that causes the OUTCAL bit to change from 1 to 0 */
EricLew 0:80ee8f3b695e 720 /* Set candidate trimming */
EricLew 0:80ee8f3b695e 721 MODIFY_REG(*tmp_opamp_reg_trimming, OPAMP_OTR_TRIMOFFSETP, (trimmingvaluep<<OPAMP_INPUT_NONINVERTING));
EricLew 0:80ee8f3b695e 722
EricLew 0:80ee8f3b695e 723 /* OFFTRIMmax delay 1 ms as per datasheet (electrical characteristics */
EricLew 0:80ee8f3b695e 724 /* Offset trim time: during calibration, minimum time needed between */
EricLew 0:80ee8f3b695e 725 /* two steps to have 1 mV accuracy */
EricLew 0:80ee8f3b695e 726 HAL_Delay(OPAMP_TRIMMING_DELAY);
EricLew 0:80ee8f3b695e 727
EricLew 0:80ee8f3b695e 728 if (READ_BIT(hopamp->Instance->CSR, OPAMP_CSR_CALOUT) != RESET)
EricLew 0:80ee8f3b695e 729 {
EricLew 0:80ee8f3b695e 730 /* Trimming value is actually one value more */
EricLew 0:80ee8f3b695e 731 trimmingvaluep++;
EricLew 0:80ee8f3b695e 732 MODIFY_REG(*tmp_opamp_reg_trimming, OPAMP_OTR_TRIMOFFSETP, (trimmingvaluep<<OPAMP_INPUT_NONINVERTING));
EricLew 0:80ee8f3b695e 733 }
EricLew 0:80ee8f3b695e 734
EricLew 0:80ee8f3b695e 735 /* Disable the OPAMP */
EricLew 0:80ee8f3b695e 736 CLEAR_BIT (hopamp->Instance->CSR, OPAMP_CSR_OPAMPxEN);
EricLew 0:80ee8f3b695e 737
EricLew 0:80ee8f3b695e 738 /* Disable calibration & set normal mode (operating mode) */
EricLew 0:80ee8f3b695e 739 CLEAR_BIT (hopamp->Instance->CSR, OPAMP_CSR_CALON);
EricLew 0:80ee8f3b695e 740
EricLew 0:80ee8f3b695e 741 /* Self calibration is successful */
EricLew 0:80ee8f3b695e 742 /* Store calibration(user trimming) results in init structure. */
EricLew 0:80ee8f3b695e 743
EricLew 0:80ee8f3b695e 744 /* Set user trimming mode */
EricLew 0:80ee8f3b695e 745 hopamp->Init.UserTrimming = OPAMP_TRIMMING_USER;
EricLew 0:80ee8f3b695e 746
EricLew 0:80ee8f3b695e 747 /* Affect calibration parameters depending on mode normal/low power */
EricLew 0:80ee8f3b695e 748 if (hopamp->Init.PowerMode != OPAMP_POWERMODE_LOWPOWER)
EricLew 0:80ee8f3b695e 749 {
EricLew 0:80ee8f3b695e 750 /* Write calibration result N */
EricLew 0:80ee8f3b695e 751 hopamp->Init.TrimmingValueN = trimmingvaluen;
EricLew 0:80ee8f3b695e 752 /* Write calibration result P */
EricLew 0:80ee8f3b695e 753 hopamp->Init.TrimmingValueP = trimmingvaluep;
EricLew 0:80ee8f3b695e 754 }
EricLew 0:80ee8f3b695e 755 else
EricLew 0:80ee8f3b695e 756 {
EricLew 0:80ee8f3b695e 757 /* Write calibration result N */
EricLew 0:80ee8f3b695e 758 hopamp->Init.TrimmingValueNLowPower = trimmingvaluen;
EricLew 0:80ee8f3b695e 759 /* Write calibration result P */
EricLew 0:80ee8f3b695e 760 hopamp->Init.TrimmingValuePLowPower = trimmingvaluep;
EricLew 0:80ee8f3b695e 761 }
EricLew 0:80ee8f3b695e 762 }
EricLew 0:80ee8f3b695e 763
EricLew 0:80ee8f3b695e 764 else
EricLew 0:80ee8f3b695e 765 {
EricLew 0:80ee8f3b695e 766 /* OPAMP can not be calibrated from this mode */
EricLew 0:80ee8f3b695e 767 status = HAL_ERROR;
EricLew 0:80ee8f3b695e 768 }
EricLew 0:80ee8f3b695e 769 }
EricLew 0:80ee8f3b695e 770 return status;
EricLew 0:80ee8f3b695e 771 }
EricLew 0:80ee8f3b695e 772
EricLew 0:80ee8f3b695e 773 /**
EricLew 0:80ee8f3b695e 774 * @}
EricLew 0:80ee8f3b695e 775 */
EricLew 0:80ee8f3b695e 776
EricLew 0:80ee8f3b695e 777 /** @defgroup OPAMP_Exported_Functions_Group3 Peripheral Control functions
EricLew 0:80ee8f3b695e 778 * @brief Peripheral Control functions
EricLew 0:80ee8f3b695e 779 *
EricLew 0:80ee8f3b695e 780 @verbatim
EricLew 0:80ee8f3b695e 781 ===============================================================================
EricLew 0:80ee8f3b695e 782 ##### Peripheral Control functions #####
EricLew 0:80ee8f3b695e 783 ===============================================================================
EricLew 0:80ee8f3b695e 784 [..]
EricLew 0:80ee8f3b695e 785 This subsection provides a set of functions allowing to control the OPAMP data
EricLew 0:80ee8f3b695e 786 transfers.
EricLew 0:80ee8f3b695e 787
EricLew 0:80ee8f3b695e 788
EricLew 0:80ee8f3b695e 789
EricLew 0:80ee8f3b695e 790 @endverbatim
EricLew 0:80ee8f3b695e 791 * @{
EricLew 0:80ee8f3b695e 792 */
EricLew 0:80ee8f3b695e 793
EricLew 0:80ee8f3b695e 794 /**
EricLew 0:80ee8f3b695e 795 * @brief Lock the selected OPAMP configuration.
EricLew 0:80ee8f3b695e 796 * @note On STM32L4, HAL OPAMP lock is software lock only (in
EricLew 0:80ee8f3b695e 797 * contrast of hardware lock available on some other STM32
EricLew 0:80ee8f3b695e 798 * devices).
EricLew 0:80ee8f3b695e 799 * @param hopamp: OPAMP handle
EricLew 0:80ee8f3b695e 800 * @retval HAL status
EricLew 0:80ee8f3b695e 801 */
EricLew 0:80ee8f3b695e 802 HAL_StatusTypeDef HAL_OPAMP_Lock(OPAMP_HandleTypeDef *hopamp)
EricLew 0:80ee8f3b695e 803 {
EricLew 0:80ee8f3b695e 804 HAL_StatusTypeDef status = HAL_OK;
EricLew 0:80ee8f3b695e 805
EricLew 0:80ee8f3b695e 806 /* Check the OPAMP handle allocation */
EricLew 0:80ee8f3b695e 807 /* Check if OPAMP locked */
EricLew 0:80ee8f3b695e 808 /* OPAMP can be locked when enabled and running in normal mode */
EricLew 0:80ee8f3b695e 809 /* It is meaningless otherwise */
EricLew 0:80ee8f3b695e 810 if((hopamp == NULL) || (hopamp->State == HAL_OPAMP_STATE_RESET) \
EricLew 0:80ee8f3b695e 811 || (hopamp->State == HAL_OPAMP_STATE_READY) \
EricLew 0:80ee8f3b695e 812 || (hopamp->State == HAL_OPAMP_STATE_CALIBBUSY)\
EricLew 0:80ee8f3b695e 813 || (hopamp->State == HAL_OPAMP_STATE_BUSYLOCKED))
EricLew 0:80ee8f3b695e 814
EricLew 0:80ee8f3b695e 815 {
EricLew 0:80ee8f3b695e 816 status = HAL_ERROR;
EricLew 0:80ee8f3b695e 817 }
EricLew 0:80ee8f3b695e 818
EricLew 0:80ee8f3b695e 819 else
EricLew 0:80ee8f3b695e 820 {
EricLew 0:80ee8f3b695e 821 /* Check the parameter */
EricLew 0:80ee8f3b695e 822 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp->Instance));
EricLew 0:80ee8f3b695e 823
EricLew 0:80ee8f3b695e 824 /* OPAMP state changed to locked */
EricLew 0:80ee8f3b695e 825 hopamp->State = HAL_OPAMP_STATE_BUSYLOCKED;
EricLew 0:80ee8f3b695e 826 }
EricLew 0:80ee8f3b695e 827 return status;
EricLew 0:80ee8f3b695e 828 }
EricLew 0:80ee8f3b695e 829
EricLew 0:80ee8f3b695e 830 /**
EricLew 0:80ee8f3b695e 831 * @brief Return the OPAMP factory trimming value.
EricLew 0:80ee8f3b695e 832 * @note On STM32L4 OPAMP, user can retrieve factory trimming if
EricLew 0:80ee8f3b695e 833 * OPAMP has never been set to user trimming before.
EricLew 0:80ee8f3b695e 834 * Therefore, this function must be called when OPAMP init
EricLew 0:80ee8f3b695e 835 * parameter "UserTrimming" is set to trimming factory,
EricLew 0:80ee8f3b695e 836 * and before OPAMP calibration (function
EricLew 0:80ee8f3b695e 837 * "HAL_OPAMP_SelfCalibrate()").
EricLew 0:80ee8f3b695e 838 * Otherwise, factory trimming value cannot be retrieved and
EricLew 0:80ee8f3b695e 839 * error status is returned.
EricLew 0:80ee8f3b695e 840 * @param hopamp : OPAMP handle
EricLew 0:80ee8f3b695e 841 * @param trimmingoffset : Trimming offset (P or N)
EricLew 0:80ee8f3b695e 842 * This parameter must be a value of @ref OPAMP_FactoryTrimming
EricLew 0:80ee8f3b695e 843 * @note Calibration parameter retrieved is corresponding to the mode
EricLew 0:80ee8f3b695e 844 * specified in OPAMP init structure (mode normal or low-power).
EricLew 0:80ee8f3b695e 845 * To retrieve calibration parameters for both modes, repeat this
EricLew 0:80ee8f3b695e 846 * function after OPAMP init structure accordingly updated.
EricLew 0:80ee8f3b695e 847 * @retval Trimming value (P or N): range: 0->31
EricLew 0:80ee8f3b695e 848 * or OPAMP_FACTORYTRIMMING_DUMMY if trimming value is not available
EricLew 0:80ee8f3b695e 849 *
EricLew 0:80ee8f3b695e 850 */
EricLew 0:80ee8f3b695e 851
EricLew 0:80ee8f3b695e 852 HAL_OPAMP_TrimmingValueTypeDef HAL_OPAMP_GetTrimOffset (OPAMP_HandleTypeDef *hopamp, uint32_t trimmingoffset)
EricLew 0:80ee8f3b695e 853 {
EricLew 0:80ee8f3b695e 854 HAL_OPAMP_TrimmingValueTypeDef trimmingvalue;
EricLew 0:80ee8f3b695e 855 __IO uint32_t* tmp_opamp_reg_trimming; /* Selection of register of trimming depending on power mode: OTR or LPOTR */
EricLew 0:80ee8f3b695e 856
EricLew 0:80ee8f3b695e 857 /* Check the OPAMP handle allocation */
EricLew 0:80ee8f3b695e 858 /* Value can be retrieved in HAL_OPAMP_STATE_READY state */
EricLew 0:80ee8f3b695e 859 if((hopamp == NULL) || (hopamp->State == HAL_OPAMP_STATE_RESET) \
EricLew 0:80ee8f3b695e 860 || (hopamp->State == HAL_OPAMP_STATE_BUSY) \
EricLew 0:80ee8f3b695e 861 || (hopamp->State == HAL_OPAMP_STATE_CALIBBUSY)\
EricLew 0:80ee8f3b695e 862 || (hopamp->State == HAL_OPAMP_STATE_BUSYLOCKED))
EricLew 0:80ee8f3b695e 863 {
EricLew 0:80ee8f3b695e 864 return OPAMP_FACTORYTRIMMING_DUMMY;
EricLew 0:80ee8f3b695e 865 }
EricLew 0:80ee8f3b695e 866 else
EricLew 0:80ee8f3b695e 867 {
EricLew 0:80ee8f3b695e 868 /* Check the parameter */
EricLew 0:80ee8f3b695e 869 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp->Instance));
EricLew 0:80ee8f3b695e 870 assert_param(IS_OPAMP_FACTORYTRIMMING(trimmingoffset));
EricLew 0:80ee8f3b695e 871 assert_param(IS_OPAMP_POWERMODE(hopamp->Init.PowerMode));
EricLew 0:80ee8f3b695e 872
EricLew 0:80ee8f3b695e 873 /* Check the trimming mode */
EricLew 0:80ee8f3b695e 874 if (READ_BIT(hopamp->Instance->CSR,OPAMP_CSR_USERTRIM) != RESET)
EricLew 0:80ee8f3b695e 875 {
EricLew 0:80ee8f3b695e 876 /* This function must called when OPAMP init parameter "UserTrimming" */
EricLew 0:80ee8f3b695e 877 /* is set to trimming factory, and before OPAMP calibration (function */
EricLew 0:80ee8f3b695e 878 /* "HAL_OPAMP_SelfCalibrate()"). */
EricLew 0:80ee8f3b695e 879 /* Otherwise, factory trimming value cannot be retrieved and error */
EricLew 0:80ee8f3b695e 880 /* status is returned. */
EricLew 0:80ee8f3b695e 881 trimmingvalue = OPAMP_FACTORYTRIMMING_DUMMY;
EricLew 0:80ee8f3b695e 882 }
EricLew 0:80ee8f3b695e 883 else
EricLew 0:80ee8f3b695e 884 {
EricLew 0:80ee8f3b695e 885 /* Select trimming settings depending on power mode */
EricLew 0:80ee8f3b695e 886 if (hopamp->Init.PowerMode == OPAMP_POWERMODE_NORMAL)
EricLew 0:80ee8f3b695e 887 {
EricLew 0:80ee8f3b695e 888 tmp_opamp_reg_trimming = &OPAMP->OTR;
EricLew 0:80ee8f3b695e 889 }
EricLew 0:80ee8f3b695e 890 else
EricLew 0:80ee8f3b695e 891 {
EricLew 0:80ee8f3b695e 892 tmp_opamp_reg_trimming = &OPAMP->LPOTR;
EricLew 0:80ee8f3b695e 893 }
EricLew 0:80ee8f3b695e 894
EricLew 0:80ee8f3b695e 895 /* Get factory trimming */
EricLew 0:80ee8f3b695e 896 if (trimmingoffset == OPAMP_FACTORYTRIMMING_P)
EricLew 0:80ee8f3b695e 897 {
EricLew 0:80ee8f3b695e 898 /* OPAMP_FACTORYTRIMMING_P */
EricLew 0:80ee8f3b695e 899 trimmingvalue = ((*tmp_opamp_reg_trimming) & OPAMP_OTR_TRIMOFFSETP) >> OPAMP_INPUT_NONINVERTING;
EricLew 0:80ee8f3b695e 900 }
EricLew 0:80ee8f3b695e 901 else
EricLew 0:80ee8f3b695e 902 {
EricLew 0:80ee8f3b695e 903 /* OPAMP_FACTORYTRIMMING_N */
EricLew 0:80ee8f3b695e 904 trimmingvalue = (*tmp_opamp_reg_trimming) & OPAMP_OTR_TRIMOFFSETN;
EricLew 0:80ee8f3b695e 905 }
EricLew 0:80ee8f3b695e 906 }
EricLew 0:80ee8f3b695e 907 }
EricLew 0:80ee8f3b695e 908 return trimmingvalue;
EricLew 0:80ee8f3b695e 909 }
EricLew 0:80ee8f3b695e 910
EricLew 0:80ee8f3b695e 911 /**
EricLew 0:80ee8f3b695e 912 * @}
EricLew 0:80ee8f3b695e 913 */
EricLew 0:80ee8f3b695e 914
EricLew 0:80ee8f3b695e 915
EricLew 0:80ee8f3b695e 916 /** @defgroup OPAMP_Exported_Functions_Group4 Peripheral State functions
EricLew 0:80ee8f3b695e 917 * @brief Peripheral State functions
EricLew 0:80ee8f3b695e 918 *
EricLew 0:80ee8f3b695e 919 @verbatim
EricLew 0:80ee8f3b695e 920 ===============================================================================
EricLew 0:80ee8f3b695e 921 ##### Peripheral State functions #####
EricLew 0:80ee8f3b695e 922 ===============================================================================
EricLew 0:80ee8f3b695e 923 [..]
EricLew 0:80ee8f3b695e 924 This subsection permits to get in run-time the status of the peripheral.
EricLew 0:80ee8f3b695e 925
EricLew 0:80ee8f3b695e 926 @endverbatim
EricLew 0:80ee8f3b695e 927 * @{
EricLew 0:80ee8f3b695e 928 */
EricLew 0:80ee8f3b695e 929
EricLew 0:80ee8f3b695e 930 /**
EricLew 0:80ee8f3b695e 931 * @brief Return the OPAMP handle state.
EricLew 0:80ee8f3b695e 932 * @param hopamp : OPAMP handle
EricLew 0:80ee8f3b695e 933 * @retval HAL state
EricLew 0:80ee8f3b695e 934 */
EricLew 0:80ee8f3b695e 935 HAL_OPAMP_StateTypeDef HAL_OPAMP_GetState(OPAMP_HandleTypeDef *hopamp)
EricLew 0:80ee8f3b695e 936 {
EricLew 0:80ee8f3b695e 937 /* Check the OPAMP handle allocation */
EricLew 0:80ee8f3b695e 938 if(hopamp == NULL)
EricLew 0:80ee8f3b695e 939 {
EricLew 0:80ee8f3b695e 940 return HAL_OPAMP_STATE_RESET;
EricLew 0:80ee8f3b695e 941 }
EricLew 0:80ee8f3b695e 942
EricLew 0:80ee8f3b695e 943 /* Check the parameter */
EricLew 0:80ee8f3b695e 944 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp->Instance));
EricLew 0:80ee8f3b695e 945
EricLew 0:80ee8f3b695e 946 /* Return OPAMP handle state */
EricLew 0:80ee8f3b695e 947 return hopamp->State;
EricLew 0:80ee8f3b695e 948 }
EricLew 0:80ee8f3b695e 949
EricLew 0:80ee8f3b695e 950 /**
EricLew 0:80ee8f3b695e 951 * @}
EricLew 0:80ee8f3b695e 952 */
EricLew 0:80ee8f3b695e 953
EricLew 0:80ee8f3b695e 954 /**
EricLew 0:80ee8f3b695e 955 * @}
EricLew 0:80ee8f3b695e 956 */
EricLew 0:80ee8f3b695e 957
EricLew 0:80ee8f3b695e 958 /**
EricLew 0:80ee8f3b695e 959 * @}
EricLew 0:80ee8f3b695e 960 */
EricLew 0:80ee8f3b695e 961
EricLew 0:80ee8f3b695e 962 #endif /* HAL_OPAMP_MODULE_ENABLED */
EricLew 0:80ee8f3b695e 963 /**
EricLew 0:80ee8f3b695e 964 * @}
EricLew 0:80ee8f3b695e 965 */
EricLew 0:80ee8f3b695e 966
EricLew 0:80ee8f3b695e 967 /**
EricLew 0:80ee8f3b695e 968 * @}
EricLew 0:80ee8f3b695e 969 */
EricLew 0:80ee8f3b695e 970
EricLew 0:80ee8f3b695e 971 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
EricLew 0:80ee8f3b695e 972