mbed library sources. Supersedes mbed-src.

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

Committer:
AnnaBridge
Date:
Wed Jun 21 17:46:44 2017 +0100
Revision:
167:e84263d55307
Parent:
149:156823d33999
Child:
181:57724642e740
This updates the lib to the mbed lib v 145

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