mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
181:57724642e740
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /**
<> 144:ef7eb2e8f9f7 2 ******************************************************************************
<> 144:ef7eb2e8f9f7 3 * @file stm32l4xx_hal_opamp_ex.c
<> 144:ef7eb2e8f9f7 4 * @author MCD Application Team
<> 144:ef7eb2e8f9f7 5 * @brief Extended OPAMP HAL module driver.
<> 144:ef7eb2e8f9f7 6 * This file provides firmware functions to manage the following
<> 144:ef7eb2e8f9f7 7 * functionalities of the operational amplifier(s)(OPAMP1, OPAMP2 etc)
<> 144:ef7eb2e8f9f7 8 * peripheral:
<> 144:ef7eb2e8f9f7 9 * + Extended Initialization and de-initialization functions
<> 144:ef7eb2e8f9f7 10 * + Extended Peripheral Control functions
<> 144:ef7eb2e8f9f7 11 *
<> 144:ef7eb2e8f9f7 12 @verbatim
<> 144:ef7eb2e8f9f7 13 ******************************************************************************
<> 144:ef7eb2e8f9f7 14 * @attention
<> 144:ef7eb2e8f9f7 15 *
AnnaBridge 167:e84263d55307 16 * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
<> 144:ef7eb2e8f9f7 17 *
<> 144:ef7eb2e8f9f7 18 * Redistribution and use in source and binary forms, with or without modification,
<> 144:ef7eb2e8f9f7 19 * are permitted provided that the following conditions are met:
<> 144:ef7eb2e8f9f7 20 * 1. Redistributions of source code must retain the above copyright notice,
<> 144:ef7eb2e8f9f7 21 * this list of conditions and the following disclaimer.
<> 144:ef7eb2e8f9f7 22 * 2. Redistributions in binary form must reproduce the above copyright notice,
<> 144:ef7eb2e8f9f7 23 * this list of conditions and the following disclaimer in the documentation
<> 144:ef7eb2e8f9f7 24 * and/or other materials provided with the distribution.
<> 144:ef7eb2e8f9f7 25 * 3. Neither the name of STMicroelectronics nor the names of its contributors
<> 144:ef7eb2e8f9f7 26 * may be used to endorse or promote products derived from this software
<> 144:ef7eb2e8f9f7 27 * without specific prior written permission.
<> 144:ef7eb2e8f9f7 28 *
<> 144:ef7eb2e8f9f7 29 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
<> 144:ef7eb2e8f9f7 30 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
<> 144:ef7eb2e8f9f7 31 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
<> 144:ef7eb2e8f9f7 32 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
<> 144:ef7eb2e8f9f7 33 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
<> 144:ef7eb2e8f9f7 34 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
<> 144:ef7eb2e8f9f7 35 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
<> 144:ef7eb2e8f9f7 36 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
<> 144:ef7eb2e8f9f7 37 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
<> 144:ef7eb2e8f9f7 38 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<> 144:ef7eb2e8f9f7 39 *
<> 144:ef7eb2e8f9f7 40 ******************************************************************************
<> 144:ef7eb2e8f9f7 41 */
<> 144:ef7eb2e8f9f7 42
<> 144:ef7eb2e8f9f7 43 /* Includes ------------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 44 #include "stm32l4xx_hal.h"
<> 144:ef7eb2e8f9f7 45
<> 144:ef7eb2e8f9f7 46 /** @addtogroup STM32L4xx_HAL_Driver
<> 144:ef7eb2e8f9f7 47 * @{
<> 144:ef7eb2e8f9f7 48 */
<> 144:ef7eb2e8f9f7 49
<> 144:ef7eb2e8f9f7 50 /** @defgroup OPAMPEx OPAMPEx
<> 144:ef7eb2e8f9f7 51 * @brief OPAMP Extended HAL module driver
<> 144:ef7eb2e8f9f7 52 * @{
<> 144:ef7eb2e8f9f7 53 */
<> 144:ef7eb2e8f9f7 54
<> 144:ef7eb2e8f9f7 55 #ifdef HAL_OPAMP_MODULE_ENABLED
<> 144:ef7eb2e8f9f7 56
<> 144:ef7eb2e8f9f7 57 /* Private typedef -----------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 58 /* Private define ------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 59 /* Private macro -------------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 60 /* Private variables ---------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 61 /* Private function prototypes -----------------------------------------------*/
<> 144:ef7eb2e8f9f7 62 /* Exported functions --------------------------------------------------------*/
<> 144:ef7eb2e8f9f7 63
<> 144:ef7eb2e8f9f7 64 /** @defgroup OPAMP_Exported_Functions OPAMP Exported Functions
<> 144:ef7eb2e8f9f7 65 * @{
<> 144:ef7eb2e8f9f7 66 */
<> 144:ef7eb2e8f9f7 67
AnnaBridge 167:e84263d55307 68 #if defined (STM32L471xx) || defined (STM32L475xx) || defined (STM32L476xx) || defined (STM32L485xx) || defined (STM32L486xx) || \
AnnaBridge 181:57724642e740 69 defined (STM32L496xx) || defined (STM32L4A6xx) || \
AnnaBridge 181:57724642e740 70 defined (STM32L4R5xx) || defined (STM32L4R7xx) || defined (STM32L4R9xx) || defined (STM32L4S5xx) || defined (STM32L4S7xx) || defined (STM32L4S9xx)
<> 144:ef7eb2e8f9f7 71
<> 144:ef7eb2e8f9f7 72 /** @addtogroup OPAMPEx_Exported_Functions_Group1
<> 144:ef7eb2e8f9f7 73 * @brief Extended operation functions
<> 144:ef7eb2e8f9f7 74 *
<> 144:ef7eb2e8f9f7 75 @verbatim
<> 144:ef7eb2e8f9f7 76 ===============================================================================
<> 144:ef7eb2e8f9f7 77 ##### Extended IO operation functions #####
<> 144:ef7eb2e8f9f7 78 ===============================================================================
<> 144:ef7eb2e8f9f7 79 [..]
<> 144:ef7eb2e8f9f7 80 (+) OPAMP Self calibration.
<> 144:ef7eb2e8f9f7 81
<> 144:ef7eb2e8f9f7 82 @endverbatim
<> 144:ef7eb2e8f9f7 83 * @{
<> 144:ef7eb2e8f9f7 84 */
<> 144:ef7eb2e8f9f7 85
<> 144:ef7eb2e8f9f7 86 /* 2 OPAMPS available */
<> 144:ef7eb2e8f9f7 87 /* 2 OPAMPS can be calibrated in parallel */
<> 144:ef7eb2e8f9f7 88 /* Not available on STM32L43x/STM32L44x where only one OPAMP available */
<> 144:ef7eb2e8f9f7 89
<> 144:ef7eb2e8f9f7 90 /**
<> 144:ef7eb2e8f9f7 91 * @brief Run the self calibration of the 2 OPAMPs in parallel.
<> 144:ef7eb2e8f9f7 92 * @note Trimming values (PMOS & NMOS) are updated and user trimming is
<> 144:ef7eb2e8f9f7 93 * enabled is calibration is successful.
<> 144:ef7eb2e8f9f7 94 * @note Calibration is performed in the mode specified in OPAMP init
<> 144:ef7eb2e8f9f7 95 * structure (mode normal or low-power). To perform calibration for
<> 144:ef7eb2e8f9f7 96 * both modes, repeat this function twice after OPAMP init structure
<> 144:ef7eb2e8f9f7 97 * accordingly updated.
<> 144:ef7eb2e8f9f7 98 * @note Calibration runs about 10 ms (5 dichotomy steps, repeated for P
<> 144:ef7eb2e8f9f7 99 * and N transistors: 10 steps with 1 ms for each step).
<> 144:ef7eb2e8f9f7 100 * @param hopamp1 handle
<> 144:ef7eb2e8f9f7 101 * @param hopamp2 handle
<> 144:ef7eb2e8f9f7 102 * @retval HAL status
<> 144:ef7eb2e8f9f7 103 */
<> 144:ef7eb2e8f9f7 104
<> 144:ef7eb2e8f9f7 105 HAL_StatusTypeDef HAL_OPAMPEx_SelfCalibrateAll(OPAMP_HandleTypeDef *hopamp1, OPAMP_HandleTypeDef *hopamp2)
<> 144:ef7eb2e8f9f7 106 {
<> 144:ef7eb2e8f9f7 107 HAL_StatusTypeDef status = HAL_OK;
<> 144:ef7eb2e8f9f7 108
<> 144:ef7eb2e8f9f7 109 uint32_t trimmingvaluen1 = 0;
<> 144:ef7eb2e8f9f7 110 uint32_t trimmingvaluep1 = 0;
<> 144:ef7eb2e8f9f7 111 uint32_t trimmingvaluen2 = 0;
<> 144:ef7eb2e8f9f7 112 uint32_t trimmingvaluep2 = 0;
<> 144:ef7eb2e8f9f7 113
<> 144:ef7eb2e8f9f7 114 /* Selection of register of trimming depending on power mode: OTR or LPOTR */
<> 144:ef7eb2e8f9f7 115 __IO uint32_t* tmp_opamp1_reg_trimming;
<> 144:ef7eb2e8f9f7 116 __IO uint32_t* tmp_opamp2_reg_trimming;
<> 144:ef7eb2e8f9f7 117
<> 144:ef7eb2e8f9f7 118 uint32_t delta;
<> 144:ef7eb2e8f9f7 119 uint32_t opampmode1;
<> 144:ef7eb2e8f9f7 120 uint32_t opampmode2;
<> 144:ef7eb2e8f9f7 121
<> 144:ef7eb2e8f9f7 122 if((hopamp1 == NULL) || (hopamp1->State == HAL_OPAMP_STATE_BUSYLOCKED) || \
<> 144:ef7eb2e8f9f7 123 (hopamp2 == NULL) || (hopamp2->State == HAL_OPAMP_STATE_BUSYLOCKED))
<> 144:ef7eb2e8f9f7 124 {
<> 144:ef7eb2e8f9f7 125 status = HAL_ERROR;
<> 144:ef7eb2e8f9f7 126 }
<> 144:ef7eb2e8f9f7 127 else
<> 144:ef7eb2e8f9f7 128 {
<> 144:ef7eb2e8f9f7 129 /* Check if OPAMP in calibration mode and calibration not yet enable */
<> 144:ef7eb2e8f9f7 130 if((hopamp1->State == HAL_OPAMP_STATE_READY) && (hopamp2->State == HAL_OPAMP_STATE_READY))
<> 144:ef7eb2e8f9f7 131 {
<> 144:ef7eb2e8f9f7 132 /* Check the parameter */
<> 144:ef7eb2e8f9f7 133 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp1->Instance));
<> 144:ef7eb2e8f9f7 134 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp2->Instance));
<> 144:ef7eb2e8f9f7 135
<> 144:ef7eb2e8f9f7 136 assert_param(IS_OPAMP_POWERMODE(hopamp1->Init.PowerMode));
<> 144:ef7eb2e8f9f7 137 assert_param(IS_OPAMP_POWERMODE(hopamp2->Init.PowerMode));
<> 144:ef7eb2e8f9f7 138
<> 144:ef7eb2e8f9f7 139 /* Save OPAMP mode as in */
<> 144:ef7eb2e8f9f7 140 /* STM32L471xx STM32L475xx STM32L476xx STM32L485xx STM32L486xx */
<> 144:ef7eb2e8f9f7 141 /* the calibration is not working in PGA mode */
<> 144:ef7eb2e8f9f7 142 opampmode1 = READ_BIT(hopamp1->Instance->CSR,OPAMP_CSR_OPAMODE);
<> 144:ef7eb2e8f9f7 143 opampmode2 = READ_BIT(hopamp2->Instance->CSR,OPAMP_CSR_OPAMODE);
<> 144:ef7eb2e8f9f7 144
<> 144:ef7eb2e8f9f7 145 /* Use of standalone mode */
<> 144:ef7eb2e8f9f7 146 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_OPAMODE, OPAMP_STANDALONE_MODE);
<> 144:ef7eb2e8f9f7 147 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_OPAMODE, OPAMP_STANDALONE_MODE);
<> 144:ef7eb2e8f9f7 148
<> 144:ef7eb2e8f9f7 149 /* user trimming values are used for offset calibration */
<> 144:ef7eb2e8f9f7 150 SET_BIT(hopamp1->Instance->CSR, OPAMP_CSR_USERTRIM);
<> 144:ef7eb2e8f9f7 151 SET_BIT(hopamp2->Instance->CSR, OPAMP_CSR_USERTRIM);
<> 144:ef7eb2e8f9f7 152
<> 144:ef7eb2e8f9f7 153 /* Select trimming settings depending on power mode */
<> 144:ef7eb2e8f9f7 154 if (hopamp1->Init.PowerMode == OPAMP_POWERMODE_NORMAL)
<> 144:ef7eb2e8f9f7 155 {
<> 144:ef7eb2e8f9f7 156 tmp_opamp1_reg_trimming = &OPAMP1->OTR;
<> 144:ef7eb2e8f9f7 157 }
<> 144:ef7eb2e8f9f7 158 else
<> 144:ef7eb2e8f9f7 159 {
<> 144:ef7eb2e8f9f7 160 tmp_opamp1_reg_trimming = &OPAMP1->LPOTR;
<> 144:ef7eb2e8f9f7 161 }
<> 144:ef7eb2e8f9f7 162
<> 144:ef7eb2e8f9f7 163 if (hopamp2->Init.PowerMode == OPAMP_POWERMODE_NORMAL)
<> 144:ef7eb2e8f9f7 164 {
<> 144:ef7eb2e8f9f7 165 tmp_opamp2_reg_trimming = &OPAMP2->OTR;
<> 144:ef7eb2e8f9f7 166 }
<> 144:ef7eb2e8f9f7 167 else
<> 144:ef7eb2e8f9f7 168 {
<> 144:ef7eb2e8f9f7 169 tmp_opamp2_reg_trimming = &OPAMP2->LPOTR;
<> 144:ef7eb2e8f9f7 170 }
<> 144:ef7eb2e8f9f7 171
<> 144:ef7eb2e8f9f7 172 /* Enable calibration */
<> 144:ef7eb2e8f9f7 173 SET_BIT (hopamp1->Instance->CSR, OPAMP_CSR_CALON);
<> 144:ef7eb2e8f9f7 174 SET_BIT (hopamp2->Instance->CSR, OPAMP_CSR_CALON);
<> 144:ef7eb2e8f9f7 175
<> 144:ef7eb2e8f9f7 176 /* 1st calibration - N */
<> 144:ef7eb2e8f9f7 177 CLEAR_BIT (hopamp1->Instance->CSR, OPAMP_CSR_CALSEL);
<> 144:ef7eb2e8f9f7 178 CLEAR_BIT (hopamp2->Instance->CSR, OPAMP_CSR_CALSEL);
<> 144:ef7eb2e8f9f7 179
<> 144:ef7eb2e8f9f7 180 /* Enable the selected opamp */
<> 144:ef7eb2e8f9f7 181 SET_BIT (hopamp1->Instance->CSR, OPAMP_CSR_OPAMPxEN);
<> 144:ef7eb2e8f9f7 182 SET_BIT (hopamp2->Instance->CSR, OPAMP_CSR_OPAMPxEN);
<> 144:ef7eb2e8f9f7 183
<> 144:ef7eb2e8f9f7 184 /* Init trimming counter */
<> 144:ef7eb2e8f9f7 185 /* Medium value */
<> 144:ef7eb2e8f9f7 186 trimmingvaluen1 = 16;
<> 144:ef7eb2e8f9f7 187 trimmingvaluen2 = 16;
<> 144:ef7eb2e8f9f7 188 delta = 8;
<> 144:ef7eb2e8f9f7 189
<> 144:ef7eb2e8f9f7 190 while (delta != 0)
<> 144:ef7eb2e8f9f7 191 {
<> 144:ef7eb2e8f9f7 192 /* Set candidate trimming */
<> 144:ef7eb2e8f9f7 193 /* OPAMP_POWERMODE_NORMAL */
<> 144:ef7eb2e8f9f7 194 MODIFY_REG(*tmp_opamp1_reg_trimming, OPAMP_OTR_TRIMOFFSETN, trimmingvaluen1);
<> 144:ef7eb2e8f9f7 195 MODIFY_REG(*tmp_opamp2_reg_trimming, OPAMP_OTR_TRIMOFFSETN, trimmingvaluen2);
<> 144:ef7eb2e8f9f7 196
<> 144:ef7eb2e8f9f7 197 /* OFFTRIMmax delay 1 ms as per datasheet (electrical characteristics */
<> 144:ef7eb2e8f9f7 198 /* Offset trim time: during calibration, minimum time needed between */
<> 144:ef7eb2e8f9f7 199 /* two steps to have 1 mV accuracy */
<> 144:ef7eb2e8f9f7 200 HAL_Delay(OPAMP_TRIMMING_DELAY);
<> 144:ef7eb2e8f9f7 201
<> 144:ef7eb2e8f9f7 202 if (READ_BIT(hopamp1->Instance->CSR, OPAMP_CSR_CALOUT) != RESET)
<> 144:ef7eb2e8f9f7 203 {
<> 144:ef7eb2e8f9f7 204 /* OPAMP_CSR_CALOUT is HIGH try lower trimming */
<> 144:ef7eb2e8f9f7 205 trimmingvaluen1 -= delta;
<> 144:ef7eb2e8f9f7 206 }
<> 144:ef7eb2e8f9f7 207 else
<> 144:ef7eb2e8f9f7 208 {
<> 144:ef7eb2e8f9f7 209 /* OPAMP_CSR_CALOUT is LOW try higher trimming */
<> 144:ef7eb2e8f9f7 210 trimmingvaluen1 += delta;
<> 144:ef7eb2e8f9f7 211 }
<> 144:ef7eb2e8f9f7 212
<> 144:ef7eb2e8f9f7 213 if (READ_BIT(hopamp2->Instance->CSR, OPAMP_CSR_CALOUT) != RESET)
<> 144:ef7eb2e8f9f7 214 {
<> 144:ef7eb2e8f9f7 215 /* OPAMP_CSR_CALOUT is HIGH try lower trimming */
<> 144:ef7eb2e8f9f7 216 trimmingvaluen2 -= delta;
<> 144:ef7eb2e8f9f7 217 }
<> 144:ef7eb2e8f9f7 218 else
<> 144:ef7eb2e8f9f7 219 {
<> 144:ef7eb2e8f9f7 220 /* OPAMP_CSR_CALOUT is LOW try higher trimming */
<> 144:ef7eb2e8f9f7 221 trimmingvaluen2 += delta;
<> 144:ef7eb2e8f9f7 222 }
<> 144:ef7eb2e8f9f7 223 /* Divide range by 2 to continue dichotomy sweep */
<> 144:ef7eb2e8f9f7 224 delta >>= 1;
<> 144:ef7eb2e8f9f7 225 }
<> 144:ef7eb2e8f9f7 226
<> 144:ef7eb2e8f9f7 227 /* Still need to check if right calibration is current value or one step below */
<> 144:ef7eb2e8f9f7 228 /* Indeed the first value that causes the OUTCAL bit to change from 0 to 1 */
<> 144:ef7eb2e8f9f7 229 /* Set candidate trimming */
<> 144:ef7eb2e8f9f7 230 MODIFY_REG(*tmp_opamp1_reg_trimming, OPAMP_OTR_TRIMOFFSETN, trimmingvaluen1);
<> 144:ef7eb2e8f9f7 231 MODIFY_REG(*tmp_opamp2_reg_trimming, OPAMP_OTR_TRIMOFFSETN, trimmingvaluen2);
<> 144:ef7eb2e8f9f7 232
<> 144:ef7eb2e8f9f7 233 /* OFFTRIMmax delay 1 ms as per datasheet (electrical characteristics */
<> 144:ef7eb2e8f9f7 234 /* Offset trim time: during calibration, minimum time needed between */
<> 144:ef7eb2e8f9f7 235 /* two steps to have 1 mV accuracy */
<> 144:ef7eb2e8f9f7 236 HAL_Delay(OPAMP_TRIMMING_DELAY);
<> 144:ef7eb2e8f9f7 237
<> 144:ef7eb2e8f9f7 238 if ((READ_BIT(hopamp1->Instance->CSR, OPAMP_CSR_CALOUT)) == 0)
<> 144:ef7eb2e8f9f7 239 {
<> 144:ef7eb2e8f9f7 240 /* Trimming value is actually one value more */
<> 144:ef7eb2e8f9f7 241 trimmingvaluen1++;
<> 144:ef7eb2e8f9f7 242 MODIFY_REG(*tmp_opamp1_reg_trimming, OPAMP_OTR_TRIMOFFSETN, trimmingvaluen1);
<> 144:ef7eb2e8f9f7 243 }
<> 144:ef7eb2e8f9f7 244
<> 144:ef7eb2e8f9f7 245 if ((READ_BIT(hopamp2->Instance->CSR, OPAMP_CSR_CALOUT)) == 0)
<> 144:ef7eb2e8f9f7 246 {
<> 144:ef7eb2e8f9f7 247 /* Trimming value is actually one value more */
<> 144:ef7eb2e8f9f7 248 trimmingvaluen2++;
<> 144:ef7eb2e8f9f7 249 MODIFY_REG(*tmp_opamp2_reg_trimming, OPAMP_OTR_TRIMOFFSETN, trimmingvaluen2);
<> 144:ef7eb2e8f9f7 250 }
<> 144:ef7eb2e8f9f7 251
<> 144:ef7eb2e8f9f7 252 /* 2nd calibration - P */
<> 144:ef7eb2e8f9f7 253 SET_BIT (hopamp1->Instance->CSR, OPAMP_CSR_CALSEL);
<> 144:ef7eb2e8f9f7 254 SET_BIT (hopamp2->Instance->CSR, OPAMP_CSR_CALSEL);
<> 144:ef7eb2e8f9f7 255
<> 144:ef7eb2e8f9f7 256 /* Init trimming counter */
<> 144:ef7eb2e8f9f7 257 /* Medium value */
<> 144:ef7eb2e8f9f7 258 trimmingvaluep1 = 16;
<> 144:ef7eb2e8f9f7 259 trimmingvaluep2 = 16;
<> 144:ef7eb2e8f9f7 260 delta = 8;
<> 144:ef7eb2e8f9f7 261
<> 144:ef7eb2e8f9f7 262 while (delta != 0)
<> 144:ef7eb2e8f9f7 263 {
<> 144:ef7eb2e8f9f7 264 /* Set candidate trimming */
<> 144:ef7eb2e8f9f7 265 /* OPAMP_POWERMODE_NORMAL */
<> 144:ef7eb2e8f9f7 266 MODIFY_REG(*tmp_opamp1_reg_trimming, OPAMP_OTR_TRIMOFFSETP, (trimmingvaluep1<<OPAMP_INPUT_NONINVERTING));
<> 144:ef7eb2e8f9f7 267 MODIFY_REG(*tmp_opamp2_reg_trimming, OPAMP_OTR_TRIMOFFSETP, (trimmingvaluep2<<OPAMP_INPUT_NONINVERTING));
<> 144:ef7eb2e8f9f7 268
<> 144:ef7eb2e8f9f7 269 /* OFFTRIMmax delay 1 ms as per datasheet (electrical characteristics */
<> 144:ef7eb2e8f9f7 270 /* Offset trim time: during calibration, minimum time needed between */
<> 144:ef7eb2e8f9f7 271 /* two steps to have 1 mV accuracy */
<> 144:ef7eb2e8f9f7 272 HAL_Delay(OPAMP_TRIMMING_DELAY);
<> 144:ef7eb2e8f9f7 273
<> 144:ef7eb2e8f9f7 274 if (READ_BIT(hopamp1->Instance->CSR, OPAMP_CSR_CALOUT) != RESET)
<> 144:ef7eb2e8f9f7 275 {
<> 144:ef7eb2e8f9f7 276 /* OPAMP_CSR_CALOUT is HIGH try higher trimming */
<> 144:ef7eb2e8f9f7 277 trimmingvaluep1 += delta;
<> 144:ef7eb2e8f9f7 278 }
<> 144:ef7eb2e8f9f7 279 else
<> 144:ef7eb2e8f9f7 280 {
<> 144:ef7eb2e8f9f7 281 /* OPAMP_CSR_CALOUT is HIGH try lower trimming */
<> 144:ef7eb2e8f9f7 282 trimmingvaluep1 -= delta;
<> 144:ef7eb2e8f9f7 283 }
<> 144:ef7eb2e8f9f7 284
<> 144:ef7eb2e8f9f7 285 if (READ_BIT(hopamp2->Instance->CSR, OPAMP_CSR_CALOUT) != RESET)
<> 144:ef7eb2e8f9f7 286 {
<> 144:ef7eb2e8f9f7 287 /* OPAMP_CSR_CALOUT is HIGH try higher trimming */
<> 144:ef7eb2e8f9f7 288 trimmingvaluep2 += delta;
<> 144:ef7eb2e8f9f7 289 }
<> 144:ef7eb2e8f9f7 290 else
<> 144:ef7eb2e8f9f7 291 {
<> 144:ef7eb2e8f9f7 292 /* OPAMP_CSR_CALOUT is LOW try lower trimming */
<> 144:ef7eb2e8f9f7 293 trimmingvaluep2 -= delta;
<> 144:ef7eb2e8f9f7 294 }
<> 144:ef7eb2e8f9f7 295 /* Divide range by 2 to continue dichotomy sweep */
<> 144:ef7eb2e8f9f7 296 delta >>= 1;
<> 144:ef7eb2e8f9f7 297 }
<> 144:ef7eb2e8f9f7 298
<> 144:ef7eb2e8f9f7 299 /* Still need to check if right calibration is current value or one step below */
<> 144:ef7eb2e8f9f7 300 /* Indeed the first value that causes the OUTCAL bit to change from 1 to 0 */
<> 144:ef7eb2e8f9f7 301 /* Set candidate trimming */
<> 144:ef7eb2e8f9f7 302 MODIFY_REG(*tmp_opamp1_reg_trimming, OPAMP_OTR_TRIMOFFSETP, (trimmingvaluep1<<OPAMP_INPUT_NONINVERTING));
<> 144:ef7eb2e8f9f7 303 MODIFY_REG(*tmp_opamp2_reg_trimming, OPAMP_OTR_TRIMOFFSETP, (trimmingvaluep2<<OPAMP_INPUT_NONINVERTING));
<> 144:ef7eb2e8f9f7 304
<> 144:ef7eb2e8f9f7 305 /* OFFTRIMmax delay 1 ms as per datasheet (electrical characteristics */
<> 144:ef7eb2e8f9f7 306 /* Offset trim time: during calibration, minimum time needed between */
<> 144:ef7eb2e8f9f7 307 /* two steps to have 1 mV accuracy */
<> 144:ef7eb2e8f9f7 308 HAL_Delay(OPAMP_TRIMMING_DELAY);
<> 144:ef7eb2e8f9f7 309
<> 144:ef7eb2e8f9f7 310 if (READ_BIT(hopamp1->Instance->CSR, OPAMP_CSR_CALOUT) != RESET)
<> 144:ef7eb2e8f9f7 311 {
<> 144:ef7eb2e8f9f7 312 /* Trimming value is actually one value more */
<> 144:ef7eb2e8f9f7 313 trimmingvaluep1++;
<> 144:ef7eb2e8f9f7 314 MODIFY_REG(*tmp_opamp1_reg_trimming, OPAMP_OTR_TRIMOFFSETP, (trimmingvaluep1<<OPAMP_INPUT_NONINVERTING));
<> 144:ef7eb2e8f9f7 315 }
<> 144:ef7eb2e8f9f7 316
<> 144:ef7eb2e8f9f7 317 if (READ_BIT(hopamp2->Instance->CSR, OPAMP_CSR_CALOUT) != RESET)
<> 144:ef7eb2e8f9f7 318 {
<> 144:ef7eb2e8f9f7 319 /* Trimming value is actually one value more */
<> 144:ef7eb2e8f9f7 320 trimmingvaluep2++;
<> 144:ef7eb2e8f9f7 321 MODIFY_REG(*tmp_opamp2_reg_trimming, OPAMP_OTR_TRIMOFFSETP, (trimmingvaluep2<<OPAMP_INPUT_NONINVERTING));
<> 144:ef7eb2e8f9f7 322 }
<> 144:ef7eb2e8f9f7 323
<> 144:ef7eb2e8f9f7 324 /* Disable the OPAMPs */
<> 144:ef7eb2e8f9f7 325 CLEAR_BIT (hopamp1->Instance->CSR, OPAMP_CSR_OPAMPxEN);
<> 144:ef7eb2e8f9f7 326 CLEAR_BIT (hopamp2->Instance->CSR, OPAMP_CSR_OPAMPxEN);
<> 144:ef7eb2e8f9f7 327
<> 144:ef7eb2e8f9f7 328 /* Disable calibration & set normal mode (operating mode) */
<> 144:ef7eb2e8f9f7 329 CLEAR_BIT (hopamp1->Instance->CSR, OPAMP_CSR_CALON);
<> 144:ef7eb2e8f9f7 330 CLEAR_BIT (hopamp2->Instance->CSR, OPAMP_CSR_CALON);
<> 144:ef7eb2e8f9f7 331
<> 144:ef7eb2e8f9f7 332 /* Self calibration is successful */
<> 144:ef7eb2e8f9f7 333 /* Store calibration (user trimming) results in init structure. */
<> 144:ef7eb2e8f9f7 334
<> 144:ef7eb2e8f9f7 335 /* Set user trimming mode */
<> 144:ef7eb2e8f9f7 336 hopamp1->Init.UserTrimming = OPAMP_TRIMMING_USER;
<> 144:ef7eb2e8f9f7 337 hopamp2->Init.UserTrimming = OPAMP_TRIMMING_USER;
<> 144:ef7eb2e8f9f7 338
<> 144:ef7eb2e8f9f7 339 /* Affect calibration parameters depending on mode normal/low power */
<> 144:ef7eb2e8f9f7 340 if (hopamp1->Init.PowerMode != OPAMP_POWERMODE_LOWPOWER)
<> 144:ef7eb2e8f9f7 341 {
<> 144:ef7eb2e8f9f7 342 /* Write calibration result N */
<> 144:ef7eb2e8f9f7 343 hopamp1->Init.TrimmingValueN = trimmingvaluen1;
<> 144:ef7eb2e8f9f7 344 /* Write calibration result P */
<> 144:ef7eb2e8f9f7 345 hopamp1->Init.TrimmingValueP = trimmingvaluep1;
<> 144:ef7eb2e8f9f7 346 }
<> 144:ef7eb2e8f9f7 347 else
<> 144:ef7eb2e8f9f7 348 {
<> 144:ef7eb2e8f9f7 349 /* Write calibration result N */
<> 144:ef7eb2e8f9f7 350 hopamp1->Init.TrimmingValueNLowPower = trimmingvaluen1;
<> 144:ef7eb2e8f9f7 351 /* Write calibration result P */
<> 144:ef7eb2e8f9f7 352 hopamp1->Init.TrimmingValuePLowPower = trimmingvaluep1;
<> 144:ef7eb2e8f9f7 353 }
<> 144:ef7eb2e8f9f7 354
<> 144:ef7eb2e8f9f7 355 if (hopamp2->Init.PowerMode != OPAMP_POWERMODE_LOWPOWER)
<> 144:ef7eb2e8f9f7 356 {
<> 144:ef7eb2e8f9f7 357 /* Write calibration result N */
<> 144:ef7eb2e8f9f7 358 hopamp2->Init.TrimmingValueN = trimmingvaluen2;
<> 144:ef7eb2e8f9f7 359 /* Write calibration result P */
<> 144:ef7eb2e8f9f7 360 hopamp2->Init.TrimmingValueP = trimmingvaluep2;
<> 144:ef7eb2e8f9f7 361 }
<> 144:ef7eb2e8f9f7 362 else
<> 144:ef7eb2e8f9f7 363 {
<> 144:ef7eb2e8f9f7 364 /* Write calibration result N */
<> 144:ef7eb2e8f9f7 365 hopamp2->Init.TrimmingValueNLowPower = trimmingvaluen2;
<> 144:ef7eb2e8f9f7 366 /* Write calibration result P */
<> 144:ef7eb2e8f9f7 367 hopamp2->Init.TrimmingValuePLowPower = trimmingvaluep2;
<> 144:ef7eb2e8f9f7 368 }
<> 144:ef7eb2e8f9f7 369
<> 144:ef7eb2e8f9f7 370 /* Update OPAMP state */
<> 144:ef7eb2e8f9f7 371 hopamp1->State = HAL_OPAMP_STATE_READY;
<> 144:ef7eb2e8f9f7 372 hopamp2->State = HAL_OPAMP_STATE_READY;
<> 144:ef7eb2e8f9f7 373
<> 144:ef7eb2e8f9f7 374 /* Restore OPAMP mode after calibration */
<> 144:ef7eb2e8f9f7 375 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_OPAMODE, opampmode1);
<> 144:ef7eb2e8f9f7 376 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_OPAMODE, opampmode2);
<> 144:ef7eb2e8f9f7 377 }
<> 144:ef7eb2e8f9f7 378 else
<> 144:ef7eb2e8f9f7 379 {
<> 144:ef7eb2e8f9f7 380 /* At least one OPAMP can not be calibrated */
<> 144:ef7eb2e8f9f7 381 status = HAL_ERROR;
<> 144:ef7eb2e8f9f7 382 }
<> 144:ef7eb2e8f9f7 383 }
<> 144:ef7eb2e8f9f7 384 return status;
<> 144:ef7eb2e8f9f7 385 }
<> 144:ef7eb2e8f9f7 386
<> 144:ef7eb2e8f9f7 387 /**
<> 144:ef7eb2e8f9f7 388 * @}
<> 144:ef7eb2e8f9f7 389 */
<> 144:ef7eb2e8f9f7 390
<> 144:ef7eb2e8f9f7 391 #endif
<> 144:ef7eb2e8f9f7 392
<> 144:ef7eb2e8f9f7 393 /** @defgroup OPAMPEx_Exported_Functions_Group2 Peripheral Control functions
<> 144:ef7eb2e8f9f7 394 * @brief Peripheral Control functions
<> 144:ef7eb2e8f9f7 395 *
<> 144:ef7eb2e8f9f7 396 @verbatim
<> 144:ef7eb2e8f9f7 397 ===============================================================================
<> 144:ef7eb2e8f9f7 398 ##### Peripheral Control functions #####
<> 144:ef7eb2e8f9f7 399 ===============================================================================
<> 144:ef7eb2e8f9f7 400 [..]
<> 144:ef7eb2e8f9f7 401 (+) OPAMP unlock.
<> 144:ef7eb2e8f9f7 402
<> 144:ef7eb2e8f9f7 403 @endverbatim
<> 144:ef7eb2e8f9f7 404 * @{
<> 144:ef7eb2e8f9f7 405 */
<> 144:ef7eb2e8f9f7 406
<> 144:ef7eb2e8f9f7 407 /**
<> 144:ef7eb2e8f9f7 408 * @brief Unlock the selected OPAMP configuration.
<> 144:ef7eb2e8f9f7 409 * @note This function must be called only when OPAMP is in state "locked".
<> 144:ef7eb2e8f9f7 410 * @param hopamp: OPAMP handle
<> 144:ef7eb2e8f9f7 411 * @retval HAL status
<> 144:ef7eb2e8f9f7 412 */
<> 144:ef7eb2e8f9f7 413 HAL_StatusTypeDef HAL_OPAMPEx_Unlock(OPAMP_HandleTypeDef* hopamp)
<> 144:ef7eb2e8f9f7 414 {
<> 144:ef7eb2e8f9f7 415 HAL_StatusTypeDef status = HAL_OK;
<> 144:ef7eb2e8f9f7 416
<> 144:ef7eb2e8f9f7 417 /* Check the OPAMP handle allocation */
<> 144:ef7eb2e8f9f7 418 /* Check if OPAMP locked */
<> 144:ef7eb2e8f9f7 419 if((hopamp == NULL) || (hopamp->State == HAL_OPAMP_STATE_RESET)
<> 144:ef7eb2e8f9f7 420 || (hopamp->State == HAL_OPAMP_STATE_READY)
<> 144:ef7eb2e8f9f7 421 || (hopamp->State == HAL_OPAMP_STATE_CALIBBUSY)
<> 144:ef7eb2e8f9f7 422 || (hopamp->State == HAL_OPAMP_STATE_BUSY))
<> 144:ef7eb2e8f9f7 423
<> 144:ef7eb2e8f9f7 424 {
<> 144:ef7eb2e8f9f7 425 status = HAL_ERROR;
<> 144:ef7eb2e8f9f7 426 }
<> 144:ef7eb2e8f9f7 427 else
<> 144:ef7eb2e8f9f7 428 {
<> 144:ef7eb2e8f9f7 429 /* Check the parameter */
<> 144:ef7eb2e8f9f7 430 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp->Instance));
<> 144:ef7eb2e8f9f7 431
<> 144:ef7eb2e8f9f7 432 /* OPAMP state changed to locked */
<> 144:ef7eb2e8f9f7 433 hopamp->State = HAL_OPAMP_STATE_BUSY;
<> 144:ef7eb2e8f9f7 434 }
<> 144:ef7eb2e8f9f7 435 return status;
<> 144:ef7eb2e8f9f7 436 }
<> 144:ef7eb2e8f9f7 437
<> 144:ef7eb2e8f9f7 438 /**
<> 144:ef7eb2e8f9f7 439 * @}
<> 144:ef7eb2e8f9f7 440 */
<> 144:ef7eb2e8f9f7 441
<> 144:ef7eb2e8f9f7 442 /**
<> 144:ef7eb2e8f9f7 443 * @}
<> 144:ef7eb2e8f9f7 444 */
<> 144:ef7eb2e8f9f7 445
<> 144:ef7eb2e8f9f7 446 #endif /* HAL_OPAMP_MODULE_ENABLED */
<> 144:ef7eb2e8f9f7 447 /**
<> 144:ef7eb2e8f9f7 448 * @}
<> 144:ef7eb2e8f9f7 449 */
<> 144:ef7eb2e8f9f7 450
<> 144:ef7eb2e8f9f7 451 /**
<> 144:ef7eb2e8f9f7 452 * @}
<> 144:ef7eb2e8f9f7 453 */
<> 144:ef7eb2e8f9f7 454
<> 144:ef7eb2e8f9f7 455 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/