mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Wed Jul 01 09:45:11 2015 +0100
Revision:
579:53297373a894
Parent:
394:83f921546702
Synchronized with git revision d5b4d2ab9c47edb4dc5776e7177b0c2263459081

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

Initial version of drivers for SAMR21

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****/