mbed library sources

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Fri Nov 07 15:45:07 2014 +0000
Revision:
394:83f921546702
Parent:
targets/cmsis/TARGET_STM/TARGET_NUCLEO_L152RE/stm32l1xx_hal_opamp_ex.c@354:e67efb2aab0e
Synchronized with git revision aab52cb7ec5a665869e507dd988bbfd55b7e087e

Full URL: https://github.com/mbedmicro/mbed/commit/aab52cb7ec5a665869e507dd988bbfd55b7e087e/

Tests: Fix cpputest testrunner

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 354:e67efb2aab0e 1 /**
mbed_official 354:e67efb2aab0e 2 ******************************************************************************
mbed_official 354:e67efb2aab0e 3 * @file stm32l1xx_hal_opamp_ex.c
mbed_official 354:e67efb2aab0e 4 * @author MCD Application Team
mbed_official 354:e67efb2aab0e 5 * @version V1.0.0
mbed_official 354:e67efb2aab0e 6 * @date 5-September-2014
mbed_official 354:e67efb2aab0e 7 * @brief Extended OPAMP HAL module driver.
mbed_official 354:e67efb2aab0e 8 *
mbed_official 354:e67efb2aab0e 9 * This file provides firmware functions to manage the following
mbed_official 354:e67efb2aab0e 10 * functionalities of the Power Controller (OPAMP) peripheral:
mbed_official 354:e67efb2aab0e 11 * + Extended Initialization and de-initialization functions
mbed_official 354:e67efb2aab0e 12 * + Extended Peripheral Control functions
mbed_official 354:e67efb2aab0e 13 *
mbed_official 354:e67efb2aab0e 14 @verbatim
mbed_official 354:e67efb2aab0e 15 ******************************************************************************
mbed_official 354:e67efb2aab0e 16 * @attention
mbed_official 354:e67efb2aab0e 17 *
mbed_official 354:e67efb2aab0e 18 * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
mbed_official 354:e67efb2aab0e 19 *
mbed_official 354:e67efb2aab0e 20 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 354:e67efb2aab0e 21 * are permitted provided that the following conditions are met:
mbed_official 354:e67efb2aab0e 22 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 354:e67efb2aab0e 23 * this list of conditions and the following disclaimer.
mbed_official 354:e67efb2aab0e 24 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 354:e67efb2aab0e 25 * this list of conditions and the following disclaimer in the documentation
mbed_official 354:e67efb2aab0e 26 * and/or other materials provided with the distribution.
mbed_official 354:e67efb2aab0e 27 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 354:e67efb2aab0e 28 * may be used to endorse or promote products derived from this software
mbed_official 354:e67efb2aab0e 29 * without specific prior written permission.
mbed_official 354:e67efb2aab0e 30 *
mbed_official 354:e67efb2aab0e 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 354:e67efb2aab0e 32 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 354:e67efb2aab0e 33 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 354:e67efb2aab0e 34 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 354:e67efb2aab0e 35 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 354:e67efb2aab0e 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 354:e67efb2aab0e 37 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 354:e67efb2aab0e 38 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 354:e67efb2aab0e 39 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 354:e67efb2aab0e 40 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 354:e67efb2aab0e 41 *
mbed_official 354:e67efb2aab0e 42 ******************************************************************************
mbed_official 354:e67efb2aab0e 43 */
mbed_official 354:e67efb2aab0e 44
mbed_official 354:e67efb2aab0e 45 /* Includes ------------------------------------------------------------------*/
mbed_official 354:e67efb2aab0e 46 #include "stm32l1xx_hal.h"
mbed_official 354:e67efb2aab0e 47
mbed_official 354:e67efb2aab0e 48 /** @addtogroup STM32L1xx_HAL_Driver
mbed_official 354:e67efb2aab0e 49 * @{
mbed_official 354:e67efb2aab0e 50 */
mbed_official 354:e67efb2aab0e 51
mbed_official 354:e67efb2aab0e 52 /** @defgroup OPAMPEx OPAMPEx
mbed_official 354:e67efb2aab0e 53 * @brief OPAMP Extended HAL module driver.
mbed_official 354:e67efb2aab0e 54 * @{
mbed_official 354:e67efb2aab0e 55 */
mbed_official 354:e67efb2aab0e 56
mbed_official 354:e67efb2aab0e 57 #ifdef HAL_OPAMP_MODULE_ENABLED
mbed_official 354:e67efb2aab0e 58
mbed_official 354:e67efb2aab0e 59 #if defined (STM32L151xCA) || defined (STM32L151xD) || defined (STM32L152xCA) || defined (STM32L152xD) || defined (STM32L162xCA) || defined (STM32L162xD) || defined (STM32L151xE) || defined (STM32L152xE) || defined (STM32L162xE) || defined (STM32L162xC) || defined (STM32L152xC) || defined (STM32L151xC)
mbed_official 354:e67efb2aab0e 60
mbed_official 354:e67efb2aab0e 61 /* Private typedef -----------------------------------------------------------*/
mbed_official 354:e67efb2aab0e 62 /* Private define ------------------------------------------------------------*/
mbed_official 354:e67efb2aab0e 63 /* Private macro -------------------------------------------------------------*/
mbed_official 354:e67efb2aab0e 64 /* Private variables ---------------------------------------------------------*/
mbed_official 354:e67efb2aab0e 65 /* Private function prototypes -----------------------------------------------*/
mbed_official 354:e67efb2aab0e 66 /* Private functions ---------------------------------------------------------*/
mbed_official 354:e67efb2aab0e 67
mbed_official 354:e67efb2aab0e 68 /** @addtogroup OPAMPEx_Exported_Functions OPAMPEx Exported Functions
mbed_official 354:e67efb2aab0e 69 * @{
mbed_official 354:e67efb2aab0e 70 */
mbed_official 354:e67efb2aab0e 71
mbed_official 354:e67efb2aab0e 72 /** @addtogroup OPAMPEx_Exported_Functions_Group1
mbed_official 354:e67efb2aab0e 73 * @brief Extended operation functions
mbed_official 354:e67efb2aab0e 74 *
mbed_official 354:e67efb2aab0e 75 @verbatim
mbed_official 354:e67efb2aab0e 76 ===============================================================================
mbed_official 354:e67efb2aab0e 77 ##### Extended IO operation functions #####
mbed_official 354:e67efb2aab0e 78 ===============================================================================
mbed_official 354:e67efb2aab0e 79 [..]
mbed_official 354:e67efb2aab0e 80 (+) OPAMP Self calibration.
mbed_official 354:e67efb2aab0e 81
mbed_official 354:e67efb2aab0e 82 @endverbatim
mbed_official 354:e67efb2aab0e 83 * @{
mbed_official 354:e67efb2aab0e 84 */
mbed_official 354:e67efb2aab0e 85
mbed_official 354:e67efb2aab0e 86 #if defined (STM32L151xD) || defined (STM32L152xD) || defined (STM32L162xD)
mbed_official 354:e67efb2aab0e 87
mbed_official 354:e67efb2aab0e 88 /* 3 OPAMPS available */
mbed_official 354:e67efb2aab0e 89 /* 3 OPAMPS can be calibrated in parallel */
mbed_official 354:e67efb2aab0e 90
mbed_official 354:e67efb2aab0e 91 /**
mbed_official 354:e67efb2aab0e 92 * @brief Run the self calibration of the 3 OPAMPs in parallel.
mbed_official 354:e67efb2aab0e 93 * @note Trimming values (PMOS & NMOS) are updated and user trimming is
mbed_official 354:e67efb2aab0e 94 * enabled is calibration is succesful.
mbed_official 354:e67efb2aab0e 95 * @note Calibration is performed in the mode specified in OPAMP init
mbed_official 354:e67efb2aab0e 96 * structure (mode normal or low-power). To perform calibration for
mbed_official 354:e67efb2aab0e 97 * both modes, repeat this function twice after OPAMP init structure
mbed_official 354:e67efb2aab0e 98 * accordingly updated.
mbed_official 354:e67efb2aab0e 99 * @note Calibration runs about 10 ms (5 dichotmy steps, repeated for P
mbed_official 354:e67efb2aab0e 100 * and N transistors: 10 steps with 1 ms for each step).
mbed_official 354:e67efb2aab0e 101 * @param hopamp1 handle
mbed_official 354:e67efb2aab0e 102 * @param hopamp2 handle
mbed_official 354:e67efb2aab0e 103 * @param hopamp3 handle
mbed_official 354:e67efb2aab0e 104 * @retval HAL status
mbed_official 354:e67efb2aab0e 105 */
mbed_official 354:e67efb2aab0e 106 HAL_StatusTypeDef HAL_OPAMPEx_SelfCalibrateAll(OPAMP_HandleTypeDef *hopamp1, OPAMP_HandleTypeDef *hopamp2, OPAMP_HandleTypeDef *hopamp3)
mbed_official 354:e67efb2aab0e 107 {
mbed_official 354:e67efb2aab0e 108 HAL_StatusTypeDef status = HAL_OK;
mbed_official 354:e67efb2aab0e 109
mbed_official 354:e67efb2aab0e 110 uint32_t* opamp1_trimmingvalue = 0;
mbed_official 354:e67efb2aab0e 111 uint32_t opamp1_trimmingvaluen = 0;
mbed_official 354:e67efb2aab0e 112 uint32_t opamp1_trimmingvaluep = 0;
mbed_official 354:e67efb2aab0e 113
mbed_official 354:e67efb2aab0e 114 uint32_t* opamp2_trimmingvalue = 0;
mbed_official 354:e67efb2aab0e 115 uint32_t opamp2_trimmingvaluen = 0;
mbed_official 354:e67efb2aab0e 116 uint32_t opamp2_trimmingvaluep = 0;
mbed_official 354:e67efb2aab0e 117
mbed_official 354:e67efb2aab0e 118 uint32_t* opamp3_trimmingvalue = 0;
mbed_official 354:e67efb2aab0e 119 uint32_t opamp3_trimmingvaluen = 0;
mbed_official 354:e67efb2aab0e 120 uint32_t opamp3_trimmingvaluep = 0;
mbed_official 354:e67efb2aab0e 121
mbed_official 354:e67efb2aab0e 122 uint32_t trimming_diff_pair = 0; /* Selection of differential transistors pair high or low */
mbed_official 354:e67efb2aab0e 123
mbed_official 354:e67efb2aab0e 124 __IO uint32_t* tmp_opamp1_reg_trimming; /* Selection of register of trimming depending on power mode: OTR or LPOTR */
mbed_official 354:e67efb2aab0e 125 __IO uint32_t* tmp_opamp2_reg_trimming;
mbed_official 354:e67efb2aab0e 126 __IO uint32_t* tmp_opamp3_reg_trimming;
mbed_official 354:e67efb2aab0e 127 uint32_t tmp_opamp1_otr_otuser = 0; /* Selection of bit OPAMP_OTR_OT_USER depending on trimming register pointed: OTR or LPOTR */
mbed_official 354:e67efb2aab0e 128 uint32_t tmp_opamp2_otr_otuser = 0;
mbed_official 354:e67efb2aab0e 129 uint32_t tmp_opamp3_otr_otuser = 0;
mbed_official 354:e67efb2aab0e 130
mbed_official 354:e67efb2aab0e 131 uint32_t tmp_Opa1calout_DefaultSate = 0; /* Bit OPAMP_CSR_OPA1CALOUT default state when trimming value is 00000b. Used to detect the bit toggling */
mbed_official 354:e67efb2aab0e 132 uint32_t tmp_Opa2calout_DefaultSate = 0; /* Bit OPAMP_CSR_OPA2CALOUT default state when trimming value is 00000b. Used to detect the bit toggling */
mbed_official 354:e67efb2aab0e 133 uint32_t tmp_Opa3calout_DefaultSate = 0; /* Bit OPAMP_CSR_OPA3CALOUT default state when trimming value is 00000b. Used to detect the bit toggling */
mbed_official 354:e67efb2aab0e 134
mbed_official 354:e67efb2aab0e 135 uint32_t tmp_OpaxSwitchesContextBackup = 0;
mbed_official 354:e67efb2aab0e 136
mbed_official 354:e67efb2aab0e 137 uint8_t trimming_diff_pair_iteration_count = 0;
mbed_official 354:e67efb2aab0e 138 uint8_t delta = 0;
mbed_official 354:e67efb2aab0e 139
mbed_official 354:e67efb2aab0e 140
mbed_official 354:e67efb2aab0e 141 /* Check the OPAMP handle allocation */
mbed_official 354:e67efb2aab0e 142 /* Check if OPAMP locked */
mbed_official 354:e67efb2aab0e 143 if((hopamp1 == HAL_NULL) || (hopamp1->State == HAL_OPAMP_STATE_BUSYLOCKED) ||
mbed_official 354:e67efb2aab0e 144 (hopamp2 == HAL_NULL) || (hopamp2->State == HAL_OPAMP_STATE_BUSYLOCKED) ||
mbed_official 354:e67efb2aab0e 145 (hopamp3 == HAL_NULL) || (hopamp3->State == HAL_OPAMP_STATE_BUSYLOCKED) )
mbed_official 354:e67efb2aab0e 146 {
mbed_official 354:e67efb2aab0e 147 status = HAL_ERROR;
mbed_official 354:e67efb2aab0e 148 }
mbed_official 354:e67efb2aab0e 149 else
mbed_official 354:e67efb2aab0e 150 {
mbed_official 354:e67efb2aab0e 151
mbed_official 354:e67efb2aab0e 152 /* Check if OPAMP in calibration mode and calibration not yet enable */
mbed_official 354:e67efb2aab0e 153 if((hopamp1->State == HAL_OPAMP_STATE_READY) &&
mbed_official 354:e67efb2aab0e 154 (hopamp2->State == HAL_OPAMP_STATE_READY) &&
mbed_official 354:e67efb2aab0e 155 (hopamp3->State == HAL_OPAMP_STATE_READY) )
mbed_official 354:e67efb2aab0e 156 {
mbed_official 354:e67efb2aab0e 157 /* Check the parameter */
mbed_official 354:e67efb2aab0e 158 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp1->Instance));
mbed_official 354:e67efb2aab0e 159 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp2->Instance));
mbed_official 354:e67efb2aab0e 160 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp3->Instance));
mbed_official 354:e67efb2aab0e 161 assert_param(IS_OPAMP_POWERMODE(hopamp1->Init.PowerMode));
mbed_official 354:e67efb2aab0e 162 assert_param(IS_OPAMP_POWERMODE(hopamp2->Init.PowerMode));
mbed_official 354:e67efb2aab0e 163 assert_param(IS_OPAMP_POWERMODE(hopamp3->Init.PowerMode));
mbed_official 354:e67efb2aab0e 164
mbed_official 354:e67efb2aab0e 165 /* Update OPAMP state */
mbed_official 354:e67efb2aab0e 166 hopamp1->State = HAL_OPAMP_STATE_CALIBBUSY;
mbed_official 354:e67efb2aab0e 167 hopamp2->State = HAL_OPAMP_STATE_CALIBBUSY;
mbed_official 354:e67efb2aab0e 168 hopamp3->State = HAL_OPAMP_STATE_CALIBBUSY;
mbed_official 354:e67efb2aab0e 169
mbed_official 354:e67efb2aab0e 170 /* Backup of switches configuration to restore it at the end of the */
mbed_official 354:e67efb2aab0e 171 /* calibration. */
mbed_official 354:e67efb2aab0e 172 tmp_OpaxSwitchesContextBackup = READ_BIT(OPAMP->CSR, OPAMP_CSR_ALL_SWITCHES_ALL_OPAMPS);
mbed_official 354:e67efb2aab0e 173
mbed_official 354:e67efb2aab0e 174 /* Open all switches on non-inverting input, inverting input and output */
mbed_official 354:e67efb2aab0e 175 /* feedback. */
mbed_official 354:e67efb2aab0e 176 CLEAR_BIT(OPAMP->CSR, OPAMP_CSR_ALL_SWITCHES_ALL_OPAMPS);
mbed_official 354:e67efb2aab0e 177
mbed_official 354:e67efb2aab0e 178 /* Set calibration mode to user programmed trimming values */
mbed_official 354:e67efb2aab0e 179 SET_BIT(OPAMP->OTR, OPAMP_OTR_OT_USER);
mbed_official 354:e67efb2aab0e 180
mbed_official 354:e67efb2aab0e 181 /* Select trimming settings depending on power mode */
mbed_official 354:e67efb2aab0e 182 if (hopamp1->Init.PowerMode == OPAMP_POWERMODE_NORMAL)
mbed_official 354:e67efb2aab0e 183 {
mbed_official 354:e67efb2aab0e 184 tmp_opamp1_otr_otuser = OPAMP_OTR_OT_USER;
mbed_official 354:e67efb2aab0e 185 tmp_opamp1_reg_trimming = &OPAMP->OTR;
mbed_official 354:e67efb2aab0e 186 }
mbed_official 354:e67efb2aab0e 187 else
mbed_official 354:e67efb2aab0e 188 {
mbed_official 354:e67efb2aab0e 189 tmp_opamp1_otr_otuser = 0x00000000;
mbed_official 354:e67efb2aab0e 190 tmp_opamp1_reg_trimming = &OPAMP->LPOTR;
mbed_official 354:e67efb2aab0e 191 }
mbed_official 354:e67efb2aab0e 192
mbed_official 354:e67efb2aab0e 193 if (hopamp2->Init.PowerMode == OPAMP_POWERMODE_NORMAL)
mbed_official 354:e67efb2aab0e 194 {
mbed_official 354:e67efb2aab0e 195 tmp_opamp2_otr_otuser = OPAMP_OTR_OT_USER;
mbed_official 354:e67efb2aab0e 196 tmp_opamp2_reg_trimming = &OPAMP->OTR;
mbed_official 354:e67efb2aab0e 197 }
mbed_official 354:e67efb2aab0e 198 else
mbed_official 354:e67efb2aab0e 199 {
mbed_official 354:e67efb2aab0e 200 tmp_opamp2_otr_otuser = 0x00000000;
mbed_official 354:e67efb2aab0e 201 tmp_opamp2_reg_trimming = &OPAMP->LPOTR;
mbed_official 354:e67efb2aab0e 202 }
mbed_official 354:e67efb2aab0e 203
mbed_official 354:e67efb2aab0e 204 if (hopamp3->Init.PowerMode == OPAMP_POWERMODE_NORMAL)
mbed_official 354:e67efb2aab0e 205 {
mbed_official 354:e67efb2aab0e 206 tmp_opamp3_otr_otuser = OPAMP_OTR_OT_USER;
mbed_official 354:e67efb2aab0e 207 tmp_opamp3_reg_trimming = &OPAMP->OTR;
mbed_official 354:e67efb2aab0e 208 }
mbed_official 354:e67efb2aab0e 209 else
mbed_official 354:e67efb2aab0e 210 {
mbed_official 354:e67efb2aab0e 211 tmp_opamp3_otr_otuser = 0x00000000;
mbed_official 354:e67efb2aab0e 212 tmp_opamp3_reg_trimming = &OPAMP->LPOTR;
mbed_official 354:e67efb2aab0e 213 }
mbed_official 354:e67efb2aab0e 214
mbed_official 354:e67efb2aab0e 215 /* Enable the selected opamp */
mbed_official 354:e67efb2aab0e 216 CLEAR_BIT (OPAMP->CSR, OPAMP_CSR_OPAXPD_ALL);
mbed_official 354:e67efb2aab0e 217
mbed_official 354:e67efb2aab0e 218 /* Perform trimming for both differential transistors pair high and low */
mbed_official 354:e67efb2aab0e 219 for (trimming_diff_pair_iteration_count = 0; trimming_diff_pair_iteration_count <=1; trimming_diff_pair_iteration_count++)
mbed_official 354:e67efb2aab0e 220 {
mbed_official 354:e67efb2aab0e 221 if (trimming_diff_pair_iteration_count == 0)
mbed_official 354:e67efb2aab0e 222 {
mbed_official 354:e67efb2aab0e 223 /* Calibration of transistors differential pair high (NMOS) */
mbed_official 354:e67efb2aab0e 224 trimming_diff_pair = OPAMP_FACTORYTRIMMING_N;
mbed_official 354:e67efb2aab0e 225 opamp1_trimmingvalue = &opamp1_trimmingvaluen;
mbed_official 354:e67efb2aab0e 226 opamp2_trimmingvalue = &opamp2_trimmingvaluen;
mbed_official 354:e67efb2aab0e 227 opamp3_trimmingvalue = &opamp3_trimmingvaluen;
mbed_official 354:e67efb2aab0e 228
mbed_official 354:e67efb2aab0e 229 /* Set bit OPAMP_CSR_OPAXCALOUT default state when trimming value */
mbed_official 354:e67efb2aab0e 230 /* is 00000b. Used to detect the bit toggling during trimming. */
mbed_official 354:e67efb2aab0e 231 tmp_Opa1calout_DefaultSate = RESET;
mbed_official 354:e67efb2aab0e 232 tmp_Opa2calout_DefaultSate = RESET;
mbed_official 354:e67efb2aab0e 233 tmp_Opa3calout_DefaultSate = RESET;
mbed_official 354:e67efb2aab0e 234
mbed_official 354:e67efb2aab0e 235 /* Enable calibration for N differential pair */
mbed_official 354:e67efb2aab0e 236 MODIFY_REG(OPAMP->CSR, OPAMP_CSR_OPAXCAL_L_ALL,
mbed_official 354:e67efb2aab0e 237 OPAMP_CSR_OPAXCAL_H_ALL);
mbed_official 354:e67efb2aab0e 238 }
mbed_official 354:e67efb2aab0e 239 else /* (trimming_diff_pair_iteration_count == 1) */
mbed_official 354:e67efb2aab0e 240 {
mbed_official 354:e67efb2aab0e 241 /* Calibration of transistors differential pair low (PMOS) */
mbed_official 354:e67efb2aab0e 242 trimming_diff_pair = OPAMP_FACTORYTRIMMING_P;
mbed_official 354:e67efb2aab0e 243 opamp1_trimmingvalue = &opamp1_trimmingvaluep;
mbed_official 354:e67efb2aab0e 244 opamp2_trimmingvalue = &opamp2_trimmingvaluep;
mbed_official 354:e67efb2aab0e 245 opamp3_trimmingvalue = &opamp3_trimmingvaluep;
mbed_official 354:e67efb2aab0e 246
mbed_official 354:e67efb2aab0e 247 /* Set bit OPAMP_CSR_OPAXCALOUT default state when trimming value */
mbed_official 354:e67efb2aab0e 248 /* is 00000b. Used to detect the bit toggling during trimming. */
mbed_official 354:e67efb2aab0e 249 tmp_Opa1calout_DefaultSate = __OPAMP_CSR_OPAXCALOUT(hopamp1);
mbed_official 354:e67efb2aab0e 250 tmp_Opa2calout_DefaultSate = __OPAMP_CSR_OPAXCALOUT(hopamp2);
mbed_official 354:e67efb2aab0e 251 tmp_Opa3calout_DefaultSate = __OPAMP_CSR_OPAXCALOUT(hopamp3);
mbed_official 354:e67efb2aab0e 252
mbed_official 354:e67efb2aab0e 253 /* Enable calibration for P differential pair */
mbed_official 354:e67efb2aab0e 254 MODIFY_REG(OPAMP->CSR, OPAMP_CSR_OPAXCAL_H_ALL,
mbed_official 354:e67efb2aab0e 255 OPAMP_CSR_OPAXCAL_L_ALL);
mbed_official 354:e67efb2aab0e 256 }
mbed_official 354:e67efb2aab0e 257
mbed_official 354:e67efb2aab0e 258
mbed_official 354:e67efb2aab0e 259 /* Perform calibration parameter search by dichotomy sweep */
mbed_official 354:e67efb2aab0e 260 /* - Delta initial value 16: for 5 dichotomy steps: 16 for the */
mbed_official 354:e67efb2aab0e 261 /* initial range, then successive delta sweeps (8, 4, 2, 1). */
mbed_official 354:e67efb2aab0e 262 /* can extend the search range to +/- 15 units. */
mbed_official 354:e67efb2aab0e 263 /* - Trimming initial value 15: search range will go from 0 to 30 */
mbed_official 354:e67efb2aab0e 264 /* (Trimming value 31 is forbidden). */
mbed_official 354:e67efb2aab0e 265 *opamp1_trimmingvalue = 15;
mbed_official 354:e67efb2aab0e 266 *opamp2_trimmingvalue = 15;
mbed_official 354:e67efb2aab0e 267 *opamp3_trimmingvalue = 15;
mbed_official 354:e67efb2aab0e 268 delta = 16;
mbed_official 354:e67efb2aab0e 269
mbed_official 354:e67efb2aab0e 270 while (delta != 0)
mbed_official 354:e67efb2aab0e 271 {
mbed_official 354:e67efb2aab0e 272 /* Set candidate trimming */
mbed_official 354:e67efb2aab0e 273
mbed_official 354:e67efb2aab0e 274 MODIFY_REG(*tmp_opamp1_reg_trimming, __OPAMP_OFFSET_TRIM_SET(hopamp1, trimming_diff_pair, OPAMP_TRIM_VALUE_MASK) ,
mbed_official 354:e67efb2aab0e 275 __OPAMP_OFFSET_TRIM_SET(hopamp1, trimming_diff_pair, *opamp1_trimmingvalue) | tmp_opamp1_otr_otuser);
mbed_official 354:e67efb2aab0e 276
mbed_official 354:e67efb2aab0e 277 MODIFY_REG(*tmp_opamp2_reg_trimming, __OPAMP_OFFSET_TRIM_SET(hopamp2, trimming_diff_pair, OPAMP_TRIM_VALUE_MASK) ,
mbed_official 354:e67efb2aab0e 278 __OPAMP_OFFSET_TRIM_SET(hopamp2, trimming_diff_pair, *opamp2_trimmingvalue) | tmp_opamp2_otr_otuser);
mbed_official 354:e67efb2aab0e 279
mbed_official 354:e67efb2aab0e 280 MODIFY_REG(*tmp_opamp3_reg_trimming, __OPAMP_OFFSET_TRIM_SET(hopamp3, trimming_diff_pair, OPAMP_TRIM_VALUE_MASK) ,
mbed_official 354:e67efb2aab0e 281 __OPAMP_OFFSET_TRIM_SET(hopamp3, trimming_diff_pair, *opamp3_trimmingvalue) | tmp_opamp3_otr_otuser);
mbed_official 354:e67efb2aab0e 282
mbed_official 354:e67efb2aab0e 283
mbed_official 354:e67efb2aab0e 284 /* Offset trimming time: during calibration, minimum time needed */
mbed_official 354:e67efb2aab0e 285 /* between two steps to have 1 mV accuracy. */
mbed_official 354:e67efb2aab0e 286 HAL_Delay(OPAMP_TRIMMING_DELAY);
mbed_official 354:e67efb2aab0e 287
mbed_official 354:e67efb2aab0e 288 /* Divide range by 2 to continue dichotomy sweep */
mbed_official 354:e67efb2aab0e 289 delta >>= 1;
mbed_official 354:e67efb2aab0e 290
mbed_official 354:e67efb2aab0e 291 /* Set trimming values for next iteration in function of trimming */
mbed_official 354:e67efb2aab0e 292 /* result toggle (versus initial state). */
mbed_official 354:e67efb2aab0e 293 /* Trimming values update with dichotomy delta of previous */
mbed_official 354:e67efb2aab0e 294 /* iteration. */
mbed_official 354:e67efb2aab0e 295 if (READ_BIT(OPAMP->CSR, __OPAMP_CSR_OPAXCALOUT(hopamp1)) != tmp_Opa1calout_DefaultSate)
mbed_official 354:e67efb2aab0e 296 {
mbed_official 354:e67efb2aab0e 297 /* If calibration output is has toggled, try lower trimming */
mbed_official 354:e67efb2aab0e 298 *opamp1_trimmingvalue -= delta;
mbed_official 354:e67efb2aab0e 299 }
mbed_official 354:e67efb2aab0e 300 else
mbed_official 354:e67efb2aab0e 301 {
mbed_official 354:e67efb2aab0e 302 /* If calibration output is has not toggled, try higher trimming */
mbed_official 354:e67efb2aab0e 303 *opamp1_trimmingvalue += delta;
mbed_official 354:e67efb2aab0e 304 }
mbed_official 354:e67efb2aab0e 305
mbed_official 354:e67efb2aab0e 306 /* Set trimming values for next iteration in function of trimming */
mbed_official 354:e67efb2aab0e 307 /* result toggle (versus initial state). */
mbed_official 354:e67efb2aab0e 308 /* Trimming values update with dichotomy delta of previous */
mbed_official 354:e67efb2aab0e 309 /* iteration. */
mbed_official 354:e67efb2aab0e 310 if (READ_BIT(OPAMP->CSR, __OPAMP_CSR_OPAXCALOUT(hopamp2)) != tmp_Opa2calout_DefaultSate)
mbed_official 354:e67efb2aab0e 311 {
mbed_official 354:e67efb2aab0e 312 /* If calibration output is has toggled, try lower trimming */
mbed_official 354:e67efb2aab0e 313 *opamp2_trimmingvalue -= delta;
mbed_official 354:e67efb2aab0e 314 }
mbed_official 354:e67efb2aab0e 315 else
mbed_official 354:e67efb2aab0e 316 {
mbed_official 354:e67efb2aab0e 317 /* If calibration output is has not toggled, try higher trimming */
mbed_official 354:e67efb2aab0e 318 *opamp2_trimmingvalue += delta;
mbed_official 354:e67efb2aab0e 319 }
mbed_official 354:e67efb2aab0e 320
mbed_official 354:e67efb2aab0e 321 /* Set trimming values for next iteration in function of trimming */
mbed_official 354:e67efb2aab0e 322 /* result toggle (versus initial state). */
mbed_official 354:e67efb2aab0e 323 /* Trimming values update with dichotomy delta of previous */
mbed_official 354:e67efb2aab0e 324 /* iteration. */
mbed_official 354:e67efb2aab0e 325 if (READ_BIT(OPAMP->CSR, __OPAMP_CSR_OPAXCALOUT(hopamp3)) != tmp_Opa3calout_DefaultSate)
mbed_official 354:e67efb2aab0e 326 {
mbed_official 354:e67efb2aab0e 327 /* If calibration output is has toggled, try lower trimming */
mbed_official 354:e67efb2aab0e 328 *opamp3_trimmingvalue -= delta;
mbed_official 354:e67efb2aab0e 329 }
mbed_official 354:e67efb2aab0e 330 else
mbed_official 354:e67efb2aab0e 331 {
mbed_official 354:e67efb2aab0e 332 /* If calibration output is has not toggled, try higher trimming */
mbed_official 354:e67efb2aab0e 333 *opamp3_trimmingvalue += delta;
mbed_official 354:e67efb2aab0e 334 }
mbed_official 354:e67efb2aab0e 335
mbed_official 354:e67efb2aab0e 336 }
mbed_official 354:e67efb2aab0e 337 }
mbed_official 354:e67efb2aab0e 338
mbed_official 354:e67efb2aab0e 339
mbed_official 354:e67efb2aab0e 340 /* Disable calibration for P and N differential pairs */
mbed_official 354:e67efb2aab0e 341 /* Disable the selected opamp */
mbed_official 354:e67efb2aab0e 342 CLEAR_BIT (OPAMP->CSR, (OPAMP_CSR_OPAXCAL_H_ALL |
mbed_official 354:e67efb2aab0e 343 OPAMP_CSR_OPAXCAL_L_ALL |
mbed_official 354:e67efb2aab0e 344 OPAMP_CSR_OPAXPD_ALL ));
mbed_official 354:e67efb2aab0e 345
mbed_official 354:e67efb2aab0e 346 /* Backup of switches configuration to restore it at the end of the */
mbed_official 354:e67efb2aab0e 347 /* calibration. */
mbed_official 354:e67efb2aab0e 348 SET_BIT(OPAMP->CSR, tmp_OpaxSwitchesContextBackup);
mbed_official 354:e67efb2aab0e 349
mbed_official 354:e67efb2aab0e 350 /* Self calibration is successful */
mbed_official 354:e67efb2aab0e 351 /* Store calibration (user trimming) results in init structure. */
mbed_official 354:e67efb2aab0e 352
mbed_official 354:e67efb2aab0e 353 /* Set user trimming mode */
mbed_official 354:e67efb2aab0e 354 hopamp1->Init.UserTrimming = OPAMP_TRIMMING_USER;
mbed_official 354:e67efb2aab0e 355 hopamp2->Init.UserTrimming = OPAMP_TRIMMING_USER;
mbed_official 354:e67efb2aab0e 356 hopamp3->Init.UserTrimming = OPAMP_TRIMMING_USER;
mbed_official 354:e67efb2aab0e 357
mbed_official 354:e67efb2aab0e 358 /* Affect calibration parameters depending on mode normal/low power */
mbed_official 354:e67efb2aab0e 359 if (hopamp1->Init.PowerMode != OPAMP_POWERMODE_LOWPOWER)
mbed_official 354:e67efb2aab0e 360 {
mbed_official 354:e67efb2aab0e 361 /* Write calibration result N */
mbed_official 354:e67efb2aab0e 362 hopamp1->Init.TrimmingValueN = opamp1_trimmingvaluen;
mbed_official 354:e67efb2aab0e 363 /* Write calibration result P */
mbed_official 354:e67efb2aab0e 364 hopamp1->Init.TrimmingValueP = opamp1_trimmingvaluep;
mbed_official 354:e67efb2aab0e 365 }
mbed_official 354:e67efb2aab0e 366 else
mbed_official 354:e67efb2aab0e 367 {
mbed_official 354:e67efb2aab0e 368 /* Write calibration result N */
mbed_official 354:e67efb2aab0e 369 hopamp1->Init.TrimmingValueNLowPower = opamp1_trimmingvaluen;
mbed_official 354:e67efb2aab0e 370 /* Write calibration result P */
mbed_official 354:e67efb2aab0e 371 hopamp1->Init.TrimmingValuePLowPower = opamp1_trimmingvaluep;
mbed_official 354:e67efb2aab0e 372 }
mbed_official 354:e67efb2aab0e 373
mbed_official 354:e67efb2aab0e 374 if (hopamp2->Init.PowerMode != OPAMP_POWERMODE_LOWPOWER)
mbed_official 354:e67efb2aab0e 375 {
mbed_official 354:e67efb2aab0e 376 /* Write calibration result N */
mbed_official 354:e67efb2aab0e 377 hopamp2->Init.TrimmingValueN = opamp2_trimmingvaluen;
mbed_official 354:e67efb2aab0e 378 /* Write calibration result P */
mbed_official 354:e67efb2aab0e 379 hopamp2->Init.TrimmingValueP = opamp2_trimmingvaluep;
mbed_official 354:e67efb2aab0e 380 }
mbed_official 354:e67efb2aab0e 381 else
mbed_official 354:e67efb2aab0e 382 {
mbed_official 354:e67efb2aab0e 383 /* Write calibration result N */
mbed_official 354:e67efb2aab0e 384 hopamp2->Init.TrimmingValueNLowPower = opamp2_trimmingvaluen;
mbed_official 354:e67efb2aab0e 385 /* Write calibration result P */
mbed_official 354:e67efb2aab0e 386 hopamp2->Init.TrimmingValuePLowPower = opamp2_trimmingvaluep;
mbed_official 354:e67efb2aab0e 387 }
mbed_official 354:e67efb2aab0e 388
mbed_official 354:e67efb2aab0e 389 if (hopamp3->Init.PowerMode != OPAMP_POWERMODE_LOWPOWER)
mbed_official 354:e67efb2aab0e 390 {
mbed_official 354:e67efb2aab0e 391 /* Write calibration result N */
mbed_official 354:e67efb2aab0e 392 hopamp3->Init.TrimmingValueN = opamp3_trimmingvaluen;
mbed_official 354:e67efb2aab0e 393 /* Write calibration result P */
mbed_official 354:e67efb2aab0e 394 hopamp3->Init.TrimmingValueP = opamp3_trimmingvaluep;
mbed_official 354:e67efb2aab0e 395 }
mbed_official 354:e67efb2aab0e 396 else
mbed_official 354:e67efb2aab0e 397 {
mbed_official 354:e67efb2aab0e 398 /* Write calibration result N */
mbed_official 354:e67efb2aab0e 399 hopamp3->Init.TrimmingValueNLowPower = opamp3_trimmingvaluen;
mbed_official 354:e67efb2aab0e 400 /* Write calibration result P */
mbed_official 354:e67efb2aab0e 401 hopamp3->Init.TrimmingValuePLowPower = opamp3_trimmingvaluep;
mbed_official 354:e67efb2aab0e 402 }
mbed_official 354:e67efb2aab0e 403
mbed_official 354:e67efb2aab0e 404 /* Update OPAMP state */
mbed_official 354:e67efb2aab0e 405 hopamp1->State = HAL_OPAMP_STATE_READY;
mbed_official 354:e67efb2aab0e 406 hopamp2->State = HAL_OPAMP_STATE_READY;
mbed_official 354:e67efb2aab0e 407 hopamp3->State = HAL_OPAMP_STATE_READY;
mbed_official 354:e67efb2aab0e 408
mbed_official 354:e67efb2aab0e 409 }
mbed_official 354:e67efb2aab0e 410 else
mbed_official 354:e67efb2aab0e 411 {
mbed_official 354:e67efb2aab0e 412 /* OPAMP can not be calibrated from this mode */
mbed_official 354:e67efb2aab0e 413 status = HAL_ERROR;
mbed_official 354:e67efb2aab0e 414 }
mbed_official 354:e67efb2aab0e 415 }
mbed_official 354:e67efb2aab0e 416
mbed_official 354:e67efb2aab0e 417 return status;
mbed_official 354:e67efb2aab0e 418 }
mbed_official 354:e67efb2aab0e 419
mbed_official 354:e67efb2aab0e 420 #else
mbed_official 354:e67efb2aab0e 421
mbed_official 354:e67efb2aab0e 422 /* 2 OPAMPS available */
mbed_official 354:e67efb2aab0e 423 /* 2 OPAMPS can be calibrated in parallel */
mbed_official 354:e67efb2aab0e 424
mbed_official 354:e67efb2aab0e 425 /**
mbed_official 354:e67efb2aab0e 426 * @brief Run the self calibration of the 2 OPAMPs in parallel.
mbed_official 354:e67efb2aab0e 427 * @note Trimming values (PMOS & NMOS) are updated and user trimming is
mbed_official 354:e67efb2aab0e 428 * enabled is calibration is succesful.
mbed_official 354:e67efb2aab0e 429 * @note Calibration is performed in the mode specified in OPAMP init
mbed_official 354:e67efb2aab0e 430 * structure (mode normal or low-power). To perform calibration for
mbed_official 354:e67efb2aab0e 431 * both modes, repeat this function twice after OPAMP init structure
mbed_official 354:e67efb2aab0e 432 * accordingly updated.
mbed_official 354:e67efb2aab0e 433 * @note Calibration runs about 10 ms (5 dichotmy steps, repeated for P
mbed_official 354:e67efb2aab0e 434 * and N transistors: 10 steps with 1 ms for each step).
mbed_official 354:e67efb2aab0e 435 * @param hopamp1 handle
mbed_official 354:e67efb2aab0e 436 * @param hopamp2 handle
mbed_official 354:e67efb2aab0e 437 * @retval HAL status
mbed_official 354:e67efb2aab0e 438 */
mbed_official 354:e67efb2aab0e 439 HAL_StatusTypeDef HAL_OPAMPEx_SelfCalibrateAll(OPAMP_HandleTypeDef *hopamp1, OPAMP_HandleTypeDef *hopamp2)
mbed_official 354:e67efb2aab0e 440 {
mbed_official 354:e67efb2aab0e 441 HAL_StatusTypeDef status = HAL_OK;
mbed_official 354:e67efb2aab0e 442
mbed_official 354:e67efb2aab0e 443 uint32_t* opamp1_trimmingvalue = 0;
mbed_official 354:e67efb2aab0e 444 uint32_t opamp1_trimmingvaluen = 0;
mbed_official 354:e67efb2aab0e 445 uint32_t opamp1_trimmingvaluep = 0;
mbed_official 354:e67efb2aab0e 446
mbed_official 354:e67efb2aab0e 447 uint32_t* opamp2_trimmingvalue = 0;
mbed_official 354:e67efb2aab0e 448 uint32_t opamp2_trimmingvaluen = 0;
mbed_official 354:e67efb2aab0e 449 uint32_t opamp2_trimmingvaluep = 0;
mbed_official 354:e67efb2aab0e 450
mbed_official 354:e67efb2aab0e 451 uint32_t trimming_diff_pair = 0; /* Selection of differential transistors pair high or low */
mbed_official 354:e67efb2aab0e 452
mbed_official 354:e67efb2aab0e 453 __IO uint32_t* tmp_opamp1_reg_trimming; /* Selection of register of trimming depending on power mode: OTR or LPOTR */
mbed_official 354:e67efb2aab0e 454 __IO uint32_t* tmp_opamp2_reg_trimming;
mbed_official 354:e67efb2aab0e 455 uint32_t tmp_opamp1_otr_otuser = 0; /* Selection of bit OPAMP_OTR_OT_USER depending on trimming register pointed: OTR or LPOTR */
mbed_official 354:e67efb2aab0e 456 uint32_t tmp_opamp2_otr_otuser = 0;
mbed_official 354:e67efb2aab0e 457
mbed_official 354:e67efb2aab0e 458 uint32_t tmp_Opa1calout_DefaultSate = 0; /* Bit OPAMP_CSR_OPA1CALOUT default state when trimming value is 00000b. Used to detect the bit toggling */
mbed_official 354:e67efb2aab0e 459 uint32_t tmp_Opa2calout_DefaultSate = 0; /* Bit OPAMP_CSR_OPA2CALOUT default state when trimming value is 00000b. Used to detect the bit toggling */
mbed_official 354:e67efb2aab0e 460
mbed_official 354:e67efb2aab0e 461 uint32_t tmp_OpaxSwitchesContextBackup = 0;
mbed_official 354:e67efb2aab0e 462
mbed_official 354:e67efb2aab0e 463 uint8_t trimming_diff_pair_iteration_count = 0;
mbed_official 354:e67efb2aab0e 464 uint8_t delta = 0;
mbed_official 354:e67efb2aab0e 465
mbed_official 354:e67efb2aab0e 466
mbed_official 354:e67efb2aab0e 467 /* Check the OPAMP handle allocation */
mbed_official 354:e67efb2aab0e 468 /* Check if OPAMP locked */
mbed_official 354:e67efb2aab0e 469 if((hopamp1 == HAL_NULL) || (hopamp1->State == HAL_OPAMP_STATE_BUSYLOCKED) ||
mbed_official 354:e67efb2aab0e 470 (hopamp2 == HAL_NULL) || (hopamp2->State == HAL_OPAMP_STATE_BUSYLOCKED) )
mbed_official 354:e67efb2aab0e 471 {
mbed_official 354:e67efb2aab0e 472 status = HAL_ERROR;
mbed_official 354:e67efb2aab0e 473 }
mbed_official 354:e67efb2aab0e 474 else
mbed_official 354:e67efb2aab0e 475 {
mbed_official 354:e67efb2aab0e 476
mbed_official 354:e67efb2aab0e 477 /* Check if OPAMP in calibration mode and calibration not yet enable */
mbed_official 354:e67efb2aab0e 478 if((hopamp1->State == HAL_OPAMP_STATE_READY) &&
mbed_official 354:e67efb2aab0e 479 (hopamp2->State == HAL_OPAMP_STATE_READY) )
mbed_official 354:e67efb2aab0e 480 {
mbed_official 354:e67efb2aab0e 481 /* Check the parameter */
mbed_official 354:e67efb2aab0e 482 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp1->Instance));
mbed_official 354:e67efb2aab0e 483 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp2->Instance));
mbed_official 354:e67efb2aab0e 484 assert_param(IS_OPAMP_POWERMODE(hopamp1->Init.PowerMode));
mbed_official 354:e67efb2aab0e 485 assert_param(IS_OPAMP_POWERMODE(hopamp2->Init.PowerMode));
mbed_official 354:e67efb2aab0e 486
mbed_official 354:e67efb2aab0e 487 /* Update OPAMP state */
mbed_official 354:e67efb2aab0e 488 hopamp1->State = HAL_OPAMP_STATE_CALIBBUSY;
mbed_official 354:e67efb2aab0e 489 hopamp2->State = HAL_OPAMP_STATE_CALIBBUSY;
mbed_official 354:e67efb2aab0e 490
mbed_official 354:e67efb2aab0e 491 /* Backup of switches configuration to restore it at the end of the */
mbed_official 354:e67efb2aab0e 492 /* calibration. */
mbed_official 354:e67efb2aab0e 493 tmp_OpaxSwitchesContextBackup = READ_BIT(OPAMP->CSR, OPAMP_CSR_ALL_SWITCHES_ALL_OPAMPS);
mbed_official 354:e67efb2aab0e 494
mbed_official 354:e67efb2aab0e 495 /* Open all switches on non-inverting input, inverting input and output */
mbed_official 354:e67efb2aab0e 496 /* feedback. */
mbed_official 354:e67efb2aab0e 497 CLEAR_BIT(OPAMP->CSR, OPAMP_CSR_ALL_SWITCHES_ALL_OPAMPS);
mbed_official 354:e67efb2aab0e 498
mbed_official 354:e67efb2aab0e 499 /* Set calibration mode to user programmed trimming values */
mbed_official 354:e67efb2aab0e 500 SET_BIT(OPAMP->OTR, OPAMP_OTR_OT_USER);
mbed_official 354:e67efb2aab0e 501
mbed_official 354:e67efb2aab0e 502 /* Select trimming settings depending on power mode */
mbed_official 354:e67efb2aab0e 503 if (hopamp1->Init.PowerMode == OPAMP_POWERMODE_NORMAL)
mbed_official 354:e67efb2aab0e 504 {
mbed_official 354:e67efb2aab0e 505 tmp_opamp1_otr_otuser = OPAMP_OTR_OT_USER;
mbed_official 354:e67efb2aab0e 506 tmp_opamp1_reg_trimming = &OPAMP->OTR;
mbed_official 354:e67efb2aab0e 507 }
mbed_official 354:e67efb2aab0e 508 else
mbed_official 354:e67efb2aab0e 509 {
mbed_official 354:e67efb2aab0e 510 tmp_opamp1_otr_otuser = 0x00000000;
mbed_official 354:e67efb2aab0e 511 tmp_opamp1_reg_trimming = &OPAMP->LPOTR;
mbed_official 354:e67efb2aab0e 512 }
mbed_official 354:e67efb2aab0e 513
mbed_official 354:e67efb2aab0e 514 if (hopamp2->Init.PowerMode == OPAMP_POWERMODE_NORMAL)
mbed_official 354:e67efb2aab0e 515 {
mbed_official 354:e67efb2aab0e 516 tmp_opamp2_otr_otuser = OPAMP_OTR_OT_USER;
mbed_official 354:e67efb2aab0e 517 tmp_opamp2_reg_trimming = &OPAMP->OTR;
mbed_official 354:e67efb2aab0e 518 }
mbed_official 354:e67efb2aab0e 519 else
mbed_official 354:e67efb2aab0e 520 {
mbed_official 354:e67efb2aab0e 521 tmp_opamp2_otr_otuser = 0x00000000;
mbed_official 354:e67efb2aab0e 522 tmp_opamp2_reg_trimming = &OPAMP->LPOTR;
mbed_official 354:e67efb2aab0e 523 }
mbed_official 354:e67efb2aab0e 524
mbed_official 354:e67efb2aab0e 525 /* Enable the selected opamp */
mbed_official 354:e67efb2aab0e 526 CLEAR_BIT (OPAMP->CSR, OPAMP_CSR_OPAXPD_ALL);
mbed_official 354:e67efb2aab0e 527
mbed_official 354:e67efb2aab0e 528 /* Perform trimming for both differential transistors pair high and low */
mbed_official 354:e67efb2aab0e 529 for (trimming_diff_pair_iteration_count = 0; trimming_diff_pair_iteration_count <=1; trimming_diff_pair_iteration_count++)
mbed_official 354:e67efb2aab0e 530 {
mbed_official 354:e67efb2aab0e 531 if (trimming_diff_pair_iteration_count == 0)
mbed_official 354:e67efb2aab0e 532 {
mbed_official 354:e67efb2aab0e 533 /* Calibration of transistors differential pair high (NMOS) */
mbed_official 354:e67efb2aab0e 534 trimming_diff_pair = OPAMP_FACTORYTRIMMING_N;
mbed_official 354:e67efb2aab0e 535 opamp1_trimmingvalue = &opamp1_trimmingvaluen;
mbed_official 354:e67efb2aab0e 536 opamp2_trimmingvalue = &opamp2_trimmingvaluen;
mbed_official 354:e67efb2aab0e 537
mbed_official 354:e67efb2aab0e 538 /* Set bit OPAMP_CSR_OPAXCALOUT default state when trimming value */
mbed_official 354:e67efb2aab0e 539 /* is 00000b. Used to detect the bit toggling during trimming. */
mbed_official 354:e67efb2aab0e 540 tmp_Opa1calout_DefaultSate = RESET;
mbed_official 354:e67efb2aab0e 541 tmp_Opa2calout_DefaultSate = RESET;
mbed_official 354:e67efb2aab0e 542
mbed_official 354:e67efb2aab0e 543 /* Enable calibration for N differential pair */
mbed_official 354:e67efb2aab0e 544 MODIFY_REG(OPAMP->CSR, OPAMP_CSR_OPAXCAL_L_ALL,
mbed_official 354:e67efb2aab0e 545 OPAMP_CSR_OPAXCAL_H_ALL);
mbed_official 354:e67efb2aab0e 546 }
mbed_official 354:e67efb2aab0e 547 else /* (trimming_diff_pair_iteration_count == 1) */
mbed_official 354:e67efb2aab0e 548 {
mbed_official 354:e67efb2aab0e 549 /* Calibration of transistors differential pair low (PMOS) */
mbed_official 354:e67efb2aab0e 550 trimming_diff_pair = OPAMP_FACTORYTRIMMING_P;
mbed_official 354:e67efb2aab0e 551 opamp1_trimmingvalue = &opamp1_trimmingvaluep;
mbed_official 354:e67efb2aab0e 552 opamp2_trimmingvalue = &opamp2_trimmingvaluep;
mbed_official 354:e67efb2aab0e 553
mbed_official 354:e67efb2aab0e 554 /* Set bit OPAMP_CSR_OPAXCALOUT default state when trimming value */
mbed_official 354:e67efb2aab0e 555 /* is 00000b. Used to detect the bit toggling during trimming. */
mbed_official 354:e67efb2aab0e 556 tmp_Opa1calout_DefaultSate = __OPAMP_CSR_OPAXCALOUT(hopamp1);
mbed_official 354:e67efb2aab0e 557 tmp_Opa2calout_DefaultSate = __OPAMP_CSR_OPAXCALOUT(hopamp2);
mbed_official 354:e67efb2aab0e 558
mbed_official 354:e67efb2aab0e 559 /* Enable calibration for P differential pair */
mbed_official 354:e67efb2aab0e 560 MODIFY_REG(OPAMP->CSR, OPAMP_CSR_OPAXCAL_H_ALL,
mbed_official 354:e67efb2aab0e 561 OPAMP_CSR_OPAXCAL_L_ALL);
mbed_official 354:e67efb2aab0e 562 }
mbed_official 354:e67efb2aab0e 563
mbed_official 354:e67efb2aab0e 564
mbed_official 354:e67efb2aab0e 565 /* Perform calibration parameter search by dichotomy sweep */
mbed_official 354:e67efb2aab0e 566 /* - Delta initial value 16: for 5 dichotomy steps: 16 for the */
mbed_official 354:e67efb2aab0e 567 /* initial range, then successive delta sweeps (8, 4, 2, 1). */
mbed_official 354:e67efb2aab0e 568 /* can extend the search range to +/- 15 units. */
mbed_official 354:e67efb2aab0e 569 /* - Trimming initial value 15: search range will go from 0 to 30 */
mbed_official 354:e67efb2aab0e 570 /* (Trimming value 31 is forbidden). */
mbed_official 354:e67efb2aab0e 571 *opamp1_trimmingvalue = 15;
mbed_official 354:e67efb2aab0e 572 *opamp2_trimmingvalue = 15;
mbed_official 354:e67efb2aab0e 573 delta = 16;
mbed_official 354:e67efb2aab0e 574
mbed_official 354:e67efb2aab0e 575 while (delta != 0)
mbed_official 354:e67efb2aab0e 576 {
mbed_official 354:e67efb2aab0e 577 /* Set candidate trimming */
mbed_official 354:e67efb2aab0e 578
mbed_official 354:e67efb2aab0e 579 MODIFY_REG(*tmp_opamp1_reg_trimming, __OPAMP_OFFSET_TRIM_SET(hopamp1, trimming_diff_pair, OPAMP_TRIM_VALUE_MASK) ,
mbed_official 354:e67efb2aab0e 580 __OPAMP_OFFSET_TRIM_SET(hopamp1, trimming_diff_pair, *opamp1_trimmingvalue) | tmp_opamp1_otr_otuser);
mbed_official 354:e67efb2aab0e 581
mbed_official 354:e67efb2aab0e 582 MODIFY_REG(*tmp_opamp2_reg_trimming, __OPAMP_OFFSET_TRIM_SET(hopamp2, trimming_diff_pair, OPAMP_TRIM_VALUE_MASK) ,
mbed_official 354:e67efb2aab0e 583 __OPAMP_OFFSET_TRIM_SET(hopamp2, trimming_diff_pair, *opamp2_trimmingvalue) | tmp_opamp2_otr_otuser);
mbed_official 354:e67efb2aab0e 584
mbed_official 354:e67efb2aab0e 585
mbed_official 354:e67efb2aab0e 586 /* Offset trimming time: during calibration, minimum time needed */
mbed_official 354:e67efb2aab0e 587 /* between two steps to have 1 mV accuracy. */
mbed_official 354:e67efb2aab0e 588 HAL_Delay(OPAMP_TRIMMING_DELAY);
mbed_official 354:e67efb2aab0e 589
mbed_official 354:e67efb2aab0e 590 /* Divide range by 2 to continue dichotomy sweep */
mbed_official 354:e67efb2aab0e 591 delta >>= 1;
mbed_official 354:e67efb2aab0e 592
mbed_official 354:e67efb2aab0e 593 /* Set trimming values for next iteration in function of trimming */
mbed_official 354:e67efb2aab0e 594 /* result toggle (versus initial state). */
mbed_official 354:e67efb2aab0e 595 if (READ_BIT(OPAMP->CSR, __OPAMP_CSR_OPAXCALOUT(hopamp1)) != tmp_Opa1calout_DefaultSate)
mbed_official 354:e67efb2aab0e 596 {
mbed_official 354:e67efb2aab0e 597 /* If calibration output is has toggled, try lower trimming */
mbed_official 354:e67efb2aab0e 598 *opamp1_trimmingvalue -= delta;
mbed_official 354:e67efb2aab0e 599 }
mbed_official 354:e67efb2aab0e 600 else
mbed_official 354:e67efb2aab0e 601 {
mbed_official 354:e67efb2aab0e 602 /* If calibration output is has not toggled, try higher trimming */
mbed_official 354:e67efb2aab0e 603 *opamp1_trimmingvalue += delta;
mbed_official 354:e67efb2aab0e 604 }
mbed_official 354:e67efb2aab0e 605
mbed_official 354:e67efb2aab0e 606 /* Set trimming values for next iteration in function of trimming */
mbed_official 354:e67efb2aab0e 607 /* result toggle (versus initial state). */
mbed_official 354:e67efb2aab0e 608 if (READ_BIT(OPAMP->CSR, __OPAMP_CSR_OPAXCALOUT(hopamp2)) != tmp_Opa2calout_DefaultSate)
mbed_official 354:e67efb2aab0e 609 {
mbed_official 354:e67efb2aab0e 610 /* If calibration output is has toggled, try lower trimming */
mbed_official 354:e67efb2aab0e 611 *opamp2_trimmingvalue -= delta;
mbed_official 354:e67efb2aab0e 612 }
mbed_official 354:e67efb2aab0e 613 else
mbed_official 354:e67efb2aab0e 614 {
mbed_official 354:e67efb2aab0e 615 /* If calibration output is has not toggled, try higher trimming */
mbed_official 354:e67efb2aab0e 616 *opamp2_trimmingvalue += delta;
mbed_official 354:e67efb2aab0e 617 }
mbed_official 354:e67efb2aab0e 618
mbed_official 354:e67efb2aab0e 619 }
mbed_official 354:e67efb2aab0e 620 }
mbed_official 354:e67efb2aab0e 621
mbed_official 354:e67efb2aab0e 622
mbed_official 354:e67efb2aab0e 623 /* Disable calibration for P and N differential pairs */
mbed_official 354:e67efb2aab0e 624 /* Disable the selected opamp */
mbed_official 354:e67efb2aab0e 625 CLEAR_BIT (OPAMP->CSR, (OPAMP_CSR_OPAXCAL_H_ALL |
mbed_official 354:e67efb2aab0e 626 OPAMP_CSR_OPAXCAL_L_ALL |
mbed_official 354:e67efb2aab0e 627 OPAMP_CSR_OPAXPD_ALL ));
mbed_official 354:e67efb2aab0e 628
mbed_official 354:e67efb2aab0e 629 /* Backup of switches configuration to restore it at the end of the */
mbed_official 354:e67efb2aab0e 630 /* calibration. */
mbed_official 354:e67efb2aab0e 631 SET_BIT(OPAMP->CSR, tmp_OpaxSwitchesContextBackup);
mbed_official 354:e67efb2aab0e 632
mbed_official 354:e67efb2aab0e 633 /* Self calibration is successful */
mbed_official 354:e67efb2aab0e 634 /* Store calibration (user trimming) results in init structure. */
mbed_official 354:e67efb2aab0e 635
mbed_official 354:e67efb2aab0e 636 /* Set user trimming mode */
mbed_official 354:e67efb2aab0e 637 hopamp1->Init.UserTrimming = OPAMP_TRIMMING_USER;
mbed_official 354:e67efb2aab0e 638 hopamp2->Init.UserTrimming = OPAMP_TRIMMING_USER;
mbed_official 354:e67efb2aab0e 639
mbed_official 354:e67efb2aab0e 640 /* Affect calibration parameters depending on mode normal/low power */
mbed_official 354:e67efb2aab0e 641 if (hopamp1->Init.PowerMode != OPAMP_POWERMODE_LOWPOWER)
mbed_official 354:e67efb2aab0e 642 {
mbed_official 354:e67efb2aab0e 643 /* Write calibration result N */
mbed_official 354:e67efb2aab0e 644 hopamp1->Init.TrimmingValueN = opamp1_trimmingvaluen;
mbed_official 354:e67efb2aab0e 645 /* Write calibration result P */
mbed_official 354:e67efb2aab0e 646 hopamp1->Init.TrimmingValueP = opamp1_trimmingvaluep;
mbed_official 354:e67efb2aab0e 647 }
mbed_official 354:e67efb2aab0e 648 else
mbed_official 354:e67efb2aab0e 649 {
mbed_official 354:e67efb2aab0e 650 /* Write calibration result N */
mbed_official 354:e67efb2aab0e 651 hopamp1->Init.TrimmingValueNLowPower = opamp1_trimmingvaluen;
mbed_official 354:e67efb2aab0e 652 /* Write calibration result P */
mbed_official 354:e67efb2aab0e 653 hopamp1->Init.TrimmingValuePLowPower = opamp1_trimmingvaluep;
mbed_official 354:e67efb2aab0e 654 }
mbed_official 354:e67efb2aab0e 655
mbed_official 354:e67efb2aab0e 656 if (hopamp2->Init.PowerMode != OPAMP_POWERMODE_LOWPOWER)
mbed_official 354:e67efb2aab0e 657 {
mbed_official 354:e67efb2aab0e 658 /* Write calibration result N */
mbed_official 354:e67efb2aab0e 659 hopamp2->Init.TrimmingValueN = opamp2_trimmingvaluen;
mbed_official 354:e67efb2aab0e 660 /* Write calibration result P */
mbed_official 354:e67efb2aab0e 661 hopamp2->Init.TrimmingValueP = opamp2_trimmingvaluep;
mbed_official 354:e67efb2aab0e 662 }
mbed_official 354:e67efb2aab0e 663 else
mbed_official 354:e67efb2aab0e 664 {
mbed_official 354:e67efb2aab0e 665 /* Write calibration result N */
mbed_official 354:e67efb2aab0e 666 hopamp2->Init.TrimmingValueNLowPower = opamp2_trimmingvaluen;
mbed_official 354:e67efb2aab0e 667 /* Write calibration result P */
mbed_official 354:e67efb2aab0e 668 hopamp2->Init.TrimmingValuePLowPower = opamp2_trimmingvaluep;
mbed_official 354:e67efb2aab0e 669 }
mbed_official 354:e67efb2aab0e 670
mbed_official 354:e67efb2aab0e 671 /* Update OPAMP state */
mbed_official 354:e67efb2aab0e 672 hopamp1->State = HAL_OPAMP_STATE_READY;
mbed_official 354:e67efb2aab0e 673 hopamp2->State = HAL_OPAMP_STATE_READY;
mbed_official 354:e67efb2aab0e 674
mbed_official 354:e67efb2aab0e 675 }
mbed_official 354:e67efb2aab0e 676 else
mbed_official 354:e67efb2aab0e 677 {
mbed_official 354:e67efb2aab0e 678 /* OPAMP can not be calibrated from this mode */
mbed_official 354:e67efb2aab0e 679 status = HAL_ERROR;
mbed_official 354:e67efb2aab0e 680 }
mbed_official 354:e67efb2aab0e 681 }
mbed_official 354:e67efb2aab0e 682
mbed_official 354:e67efb2aab0e 683 return status;
mbed_official 354:e67efb2aab0e 684 }
mbed_official 354:e67efb2aab0e 685
mbed_official 354:e67efb2aab0e 686 #endif /* STM32L151xD || STM32L152xD || STM32L162xD */
mbed_official 354:e67efb2aab0e 687
mbed_official 354:e67efb2aab0e 688 /**
mbed_official 354:e67efb2aab0e 689 * @}
mbed_official 354:e67efb2aab0e 690 */
mbed_official 354:e67efb2aab0e 691
mbed_official 354:e67efb2aab0e 692 /** @defgroup OPAMPEx_Exported_Functions_Group2 Extended Peripheral Control functions
mbed_official 354:e67efb2aab0e 693 * @brief Extended control functions
mbed_official 354:e67efb2aab0e 694 *
mbed_official 354:e67efb2aab0e 695 @verbatim
mbed_official 354:e67efb2aab0e 696 ===============================================================================
mbed_official 354:e67efb2aab0e 697 ##### Peripheral Control functions #####
mbed_official 354:e67efb2aab0e 698 ===============================================================================
mbed_official 354:e67efb2aab0e 699 [..]
mbed_official 354:e67efb2aab0e 700 (+) OPAMP unlock.
mbed_official 354:e67efb2aab0e 701
mbed_official 354:e67efb2aab0e 702 @endverbatim
mbed_official 354:e67efb2aab0e 703 * @{
mbed_official 354:e67efb2aab0e 704 */
mbed_official 354:e67efb2aab0e 705
mbed_official 354:e67efb2aab0e 706 /**
mbed_official 354:e67efb2aab0e 707 * @brief Unlock the selected opamp configuration.
mbed_official 354:e67efb2aab0e 708 * This function must be called only when OPAMP is in state "locked".
mbed_official 354:e67efb2aab0e 709 * @param hopamp: OPAMP handle
mbed_official 354:e67efb2aab0e 710 * @retval HAL status
mbed_official 354:e67efb2aab0e 711 */
mbed_official 354:e67efb2aab0e 712 HAL_StatusTypeDef HAL_OPAMPEx_Unlock(OPAMP_HandleTypeDef* hopamp)
mbed_official 354:e67efb2aab0e 713 {
mbed_official 354:e67efb2aab0e 714 HAL_StatusTypeDef status = HAL_OK;
mbed_official 354:e67efb2aab0e 715
mbed_official 354:e67efb2aab0e 716 /* Check the OPAMP handle allocation */
mbed_official 354:e67efb2aab0e 717 /* Check if OPAMP locked */
mbed_official 354:e67efb2aab0e 718 if((hopamp == HAL_NULL) || (hopamp->State == HAL_OPAMP_STATE_RESET)
mbed_official 354:e67efb2aab0e 719 || (hopamp->State == HAL_OPAMP_STATE_READY)
mbed_official 354:e67efb2aab0e 720 || (hopamp->State == HAL_OPAMP_STATE_CALIBBUSY)
mbed_official 354:e67efb2aab0e 721 || (hopamp->State == HAL_OPAMP_STATE_BUSY))
mbed_official 354:e67efb2aab0e 722
mbed_official 354:e67efb2aab0e 723 {
mbed_official 354:e67efb2aab0e 724 status = HAL_ERROR;
mbed_official 354:e67efb2aab0e 725 }
mbed_official 354:e67efb2aab0e 726 else
mbed_official 354:e67efb2aab0e 727 {
mbed_official 354:e67efb2aab0e 728 /* Check the parameter */
mbed_official 354:e67efb2aab0e 729 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp->Instance));
mbed_official 354:e67efb2aab0e 730
mbed_official 354:e67efb2aab0e 731 /* OPAMP state changed to locked */
mbed_official 354:e67efb2aab0e 732 hopamp->State = HAL_OPAMP_STATE_BUSY;
mbed_official 354:e67efb2aab0e 733 }
mbed_official 354:e67efb2aab0e 734 return status;
mbed_official 354:e67efb2aab0e 735 }
mbed_official 354:e67efb2aab0e 736
mbed_official 354:e67efb2aab0e 737 /**
mbed_official 354:e67efb2aab0e 738 * @}
mbed_official 354:e67efb2aab0e 739 */
mbed_official 354:e67efb2aab0e 740
mbed_official 354:e67efb2aab0e 741
mbed_official 354:e67efb2aab0e 742 /**
mbed_official 354:e67efb2aab0e 743 * @}
mbed_official 354:e67efb2aab0e 744 */
mbed_official 354:e67efb2aab0e 745
mbed_official 354:e67efb2aab0e 746 #endif /* STM32L151xCA || STM32L151xD || STM32L152xCA || STM32L152xD || STM32L162xCA || STM32L162xD || STM32L151xE || STM32L152xE || STM32L162xE || STM32L162xC || STM32L152xC || STM32L151xC */
mbed_official 354:e67efb2aab0e 747
mbed_official 354:e67efb2aab0e 748 #endif /* HAL_OPAMP_MODULE_ENABLED */
mbed_official 354:e67efb2aab0e 749 /**
mbed_official 354:e67efb2aab0e 750 * @}
mbed_official 354:e67efb2aab0e 751 */
mbed_official 354:e67efb2aab0e 752
mbed_official 354:e67efb2aab0e 753 /**
mbed_official 354:e67efb2aab0e 754 * @}
mbed_official 354:e67efb2aab0e 755 */
mbed_official 354:e67efb2aab0e 756
mbed_official 354:e67efb2aab0e 757 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/