mbed library sources. Supersedes mbed-src.

Fork of mbed-dev by mbed official

Committer:
Anna Bridge
Date:
Wed Jan 17 15:23:54 2018 +0000
Revision:
181:96ed750bd169
Parent:
167:e84263d55307
mbed-dev libray. Release version 158

Who changed what in which revision?

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