mbed library sources

Fork of mbed-src by mbed official

Committer:
mbed_official
Date:
Mon Sep 28 20:15:09 2015 +0100
Revision:
634:ac7d6880524d
Parent:
632:7687fb9c4f91
Synchronized with git revision 9b7d23d47153c298a6d24de9a415202705889d11

Full URL: https://github.com/mbedmicro/mbed/commit/9b7d23d47153c298a6d24de9a415202705889d11/

Revert "[NUCLEO_F303K8] add support of the STM32F303K8"

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 237:f3da66175598 1 /**
mbed_official 237:f3da66175598 2 ******************************************************************************
mbed_official 237:f3da66175598 3 * @file stm32f3xx_hal_opamp_ex.c
mbed_official 237:f3da66175598 4 * @author MCD Application Team
mbed_official 634:ac7d6880524d 5 * @version V1.1.0
mbed_official 634:ac7d6880524d 6 * @date 12-Sept-2014
mbed_official 237:f3da66175598 7 * @brief Extended OPAMP HAL module driver.
mbed_official 237:f3da66175598 8 *
mbed_official 237:f3da66175598 9 * This file provides firmware functions to manage the following
mbed_official 237:f3da66175598 10 * functionalities of the Power Controller (OPAMP) peripheral:
mbed_official 237:f3da66175598 11 * + Extended Initialization and de-initialization functions
mbed_official 237:f3da66175598 12 * + Extended Peripheral Control functions
mbed_official 237:f3da66175598 13 *
mbed_official 237:f3da66175598 14 @verbatim
mbed_official 237:f3da66175598 15 ******************************************************************************
mbed_official 237:f3da66175598 16 * @attention
mbed_official 237:f3da66175598 17 *
mbed_official 634:ac7d6880524d 18 * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
mbed_official 237:f3da66175598 19 *
mbed_official 237:f3da66175598 20 * Redistribution and use in source and binary forms, with or without modification,
mbed_official 237:f3da66175598 21 * are permitted provided that the following conditions are met:
mbed_official 237:f3da66175598 22 * 1. Redistributions of source code must retain the above copyright notice,
mbed_official 237:f3da66175598 23 * this list of conditions and the following disclaimer.
mbed_official 237:f3da66175598 24 * 2. Redistributions in binary form must reproduce the above copyright notice,
mbed_official 237:f3da66175598 25 * this list of conditions and the following disclaimer in the documentation
mbed_official 237:f3da66175598 26 * and/or other materials provided with the distribution.
mbed_official 237:f3da66175598 27 * 3. Neither the name of STMicroelectronics nor the names of its contributors
mbed_official 237:f3da66175598 28 * may be used to endorse or promote products derived from this software
mbed_official 237:f3da66175598 29 * without specific prior written permission.
mbed_official 237:f3da66175598 30 *
mbed_official 237:f3da66175598 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 237:f3da66175598 32 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 237:f3da66175598 33 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
mbed_official 237:f3da66175598 34 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
mbed_official 237:f3da66175598 35 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
mbed_official 237:f3da66175598 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
mbed_official 237:f3da66175598 37 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 237:f3da66175598 38 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
mbed_official 237:f3da66175598 39 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
mbed_official 237:f3da66175598 40 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
mbed_official 237:f3da66175598 41 *
mbed_official 237:f3da66175598 42 ******************************************************************************
mbed_official 237:f3da66175598 43 */
mbed_official 237:f3da66175598 44
mbed_official 237:f3da66175598 45 /* Includes ------------------------------------------------------------------*/
mbed_official 237:f3da66175598 46 #include "stm32f3xx_hal.h"
mbed_official 237:f3da66175598 47
mbed_official 237:f3da66175598 48 /** @addtogroup STM32F3xx_HAL_Driver
mbed_official 237:f3da66175598 49 * @{
mbed_official 237:f3da66175598 50 */
mbed_official 237:f3da66175598 51
mbed_official 375:3d36234a1087 52 /** @defgroup OPAMPEx OPAMP Extended HAL module driver
mbed_official 237:f3da66175598 53 * @brief OPAMP Extended HAL module driver.
mbed_official 237:f3da66175598 54 * @{
mbed_official 237:f3da66175598 55 */
mbed_official 237:f3da66175598 56
mbed_official 237:f3da66175598 57 #ifdef HAL_OPAMP_MODULE_ENABLED
mbed_official 237:f3da66175598 58
mbed_official 237:f3da66175598 59 /* Private typedef -----------------------------------------------------------*/
mbed_official 237:f3da66175598 60 /* Private define ------------------------------------------------------------*/
mbed_official 237:f3da66175598 61 /* Private macro -------------------------------------------------------------*/
mbed_official 237:f3da66175598 62 /* Private variables ---------------------------------------------------------*/
mbed_official 237:f3da66175598 63 /* Private function prototypes -----------------------------------------------*/
mbed_official 375:3d36234a1087 64 /* Exported functions ---------------------------------------------------------*/
mbed_official 237:f3da66175598 65
mbed_official 375:3d36234a1087 66 /** @defgroup OPAMPEx_Exported_Functions OPAMP Extended Exported Functions
mbed_official 237:f3da66175598 67 * @{
mbed_official 237:f3da66175598 68 */
mbed_official 237:f3da66175598 69
mbed_official 375:3d36234a1087 70
mbed_official 375:3d36234a1087 71 /** @defgroup OPAMPEx_Exported_Functions_Group1 Extended Input and Output operation functions
mbed_official 237:f3da66175598 72 * @brief Extended Self calibration functions
mbed_official 237:f3da66175598 73 *
mbed_official 237:f3da66175598 74 @verbatim
mbed_official 237:f3da66175598 75 ===============================================================================
mbed_official 237:f3da66175598 76 ##### Extended IO operation functions #####
mbed_official 237:f3da66175598 77 ===============================================================================
mbed_official 237:f3da66175598 78 [..]
mbed_official 237:f3da66175598 79
mbed_official 237:f3da66175598 80 @endverbatim
mbed_official 237:f3da66175598 81 * @{
mbed_official 237:f3da66175598 82 */
mbed_official 237:f3da66175598 83
mbed_official 375:3d36234a1087 84 #if defined(STM32F302xE) || \
mbed_official 375:3d36234a1087 85 defined(STM32F302xC)
mbed_official 237:f3da66175598 86 /* 2 OPAMPS available */
mbed_official 237:f3da66175598 87 /* 2 OPAMPS can be calibrated in parallel */
mbed_official 237:f3da66175598 88
mbed_official 237:f3da66175598 89 /**
mbed_official 237:f3da66175598 90 * @brief Run the self calibration of 2 OPAMPs in parallel.
mbed_official 237:f3da66175598 91 * @param hopamp1 handle
mbed_official 237:f3da66175598 92 * @param hopamp2 handle
mbed_official 237:f3da66175598 93 * @retval HAL status
mbed_official 237:f3da66175598 94 * @note Updated offset trimming values (PMOS & NMOS), user trimming is enabled
mbed_official 237:f3da66175598 95 * @note Calibration runs about 25 ms.
mbed_official 237:f3da66175598 96 */
mbed_official 237:f3da66175598 97
mbed_official 237:f3da66175598 98 HAL_StatusTypeDef HAL_OPAMPEx_SelfCalibrateAll(OPAMP_HandleTypeDef *hopamp1, OPAMP_HandleTypeDef *hopamp2)
mbed_official 237:f3da66175598 99 {
mbed_official 237:f3da66175598 100 HAL_StatusTypeDef status = HAL_OK;
mbed_official 237:f3da66175598 101
mbed_official 237:f3da66175598 102 uint32_t trimmingvaluen1 = 0;
mbed_official 237:f3da66175598 103 uint32_t trimmingvaluep1 = 0;
mbed_official 237:f3da66175598 104 uint32_t trimmingvaluen2 = 0;
mbed_official 237:f3da66175598 105 uint32_t trimmingvaluep2 = 0;
mbed_official 237:f3da66175598 106
mbed_official 237:f3da66175598 107 uint32_t delta;
mbed_official 237:f3da66175598 108
mbed_official 634:ac7d6880524d 109 if((hopamp1 == HAL_NULL) || (hopamp1->State == HAL_OPAMP_STATE_BUSYLOCKED) || \
mbed_official 634:ac7d6880524d 110 (hopamp2 == HAL_NULL) || (hopamp2->State == HAL_OPAMP_STATE_BUSYLOCKED))
mbed_official 237:f3da66175598 111 {
mbed_official 237:f3da66175598 112 status = HAL_ERROR;
mbed_official 237:f3da66175598 113 }
mbed_official 237:f3da66175598 114
mbed_official 237:f3da66175598 115 if(status == HAL_OK)
mbed_official 237:f3da66175598 116 {
mbed_official 237:f3da66175598 117 /* Check if OPAMP in calibration mode and calibration not yet enable */
mbed_official 237:f3da66175598 118 if((hopamp1->State == HAL_OPAMP_STATE_READY) && (hopamp2->State == HAL_OPAMP_STATE_READY))
mbed_official 237:f3da66175598 119 {
mbed_official 237:f3da66175598 120 /* Check the parameter */
mbed_official 237:f3da66175598 121 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp1->Instance));
mbed_official 237:f3da66175598 122 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp2->Instance));
mbed_official 237:f3da66175598 123
mbed_official 237:f3da66175598 124 /* Set Calibration mode */
mbed_official 237:f3da66175598 125 /* Non-inverting input connected to calibration reference voltage. */
mbed_official 237:f3da66175598 126 SET_BIT(hopamp1->Instance->CSR, OPAMP_CSR_FORCEVP);
mbed_official 237:f3da66175598 127 SET_BIT(hopamp2->Instance->CSR, OPAMP_CSR_FORCEVP);
mbed_official 237:f3da66175598 128
mbed_official 237:f3da66175598 129 /* user trimming values are used for offset calibration */
mbed_official 237:f3da66175598 130 SET_BIT(hopamp1->Instance->CSR, OPAMP_CSR_USERTRIM);
mbed_official 237:f3da66175598 131 SET_BIT(hopamp2->Instance->CSR, OPAMP_CSR_USERTRIM);
mbed_official 237:f3da66175598 132
mbed_official 237:f3da66175598 133 /* Enable calibration */
mbed_official 237:f3da66175598 134 SET_BIT (hopamp1->Instance->CSR, OPAMP_CSR_CALON);
mbed_official 237:f3da66175598 135 SET_BIT (hopamp2->Instance->CSR, OPAMP_CSR_CALON);
mbed_official 237:f3da66175598 136
mbed_official 237:f3da66175598 137 /* 1st calibration - N */
mbed_official 237:f3da66175598 138 /* Select 90% VREF */
mbed_official 237:f3da66175598 139 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_90VDDA);
mbed_official 237:f3da66175598 140 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_90VDDA);
mbed_official 237:f3da66175598 141
mbed_official 237:f3da66175598 142 /* Enable the opamps */
mbed_official 237:f3da66175598 143 SET_BIT (hopamp1->Instance->CSR, OPAMP_CSR_OPAMPxEN);
mbed_official 237:f3da66175598 144 SET_BIT (hopamp2->Instance->CSR, OPAMP_CSR_OPAMPxEN);
mbed_official 237:f3da66175598 145
mbed_official 237:f3da66175598 146 /* Init trimming counter */
mbed_official 237:f3da66175598 147 /* Medium value */
mbed_official 237:f3da66175598 148 trimmingvaluen1 = 16;
mbed_official 237:f3da66175598 149 trimmingvaluen2 = 16;
mbed_official 237:f3da66175598 150 delta = 8;
mbed_official 237:f3da66175598 151
mbed_official 237:f3da66175598 152 while (delta != 0)
mbed_official 237:f3da66175598 153 {
mbed_official 237:f3da66175598 154 // Set candidate trimming */
mbed_official 237:f3da66175598 155 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen1<<OPAMP_INPUT_INVERTING);
mbed_official 237:f3da66175598 156 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen2<<OPAMP_INPUT_INVERTING);
mbed_official 237:f3da66175598 157
mbed_official 237:f3da66175598 158 /* OFFTRIMmax delay 2 ms as per datasheet (electrical characteristics */
mbed_official 237:f3da66175598 159 /* Offset trim time: during calibration, minimum time needed between */
mbed_official 237:f3da66175598 160 /* two steps to have 1 mV accuracy */
mbed_official 237:f3da66175598 161 HAL_Delay(2);
mbed_official 237:f3da66175598 162
mbed_official 237:f3da66175598 163 if (hopamp1->Instance->CSR & OPAMP_CSR_OUTCAL)
mbed_official 237:f3da66175598 164 {
mbed_official 237:f3da66175598 165 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
mbed_official 237:f3da66175598 166 trimmingvaluen1 += delta;
mbed_official 237:f3da66175598 167 }
mbed_official 237:f3da66175598 168 else
mbed_official 237:f3da66175598 169 {
mbed_official 237:f3da66175598 170 /* OPAMP_CSR_OUTCAL is LOW try lower trimming */
mbed_official 237:f3da66175598 171 trimmingvaluen1 -= delta;
mbed_official 237:f3da66175598 172 }
mbed_official 237:f3da66175598 173
mbed_official 237:f3da66175598 174 if (hopamp2->Instance->CSR & OPAMP_CSR_OUTCAL)
mbed_official 237:f3da66175598 175 {
mbed_official 237:f3da66175598 176 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
mbed_official 237:f3da66175598 177 trimmingvaluen2 += delta;
mbed_official 237:f3da66175598 178 }
mbed_official 237:f3da66175598 179 else
mbed_official 237:f3da66175598 180 {
mbed_official 237:f3da66175598 181 /* OPAMP_CSR_OUTCAL is LOW try lower trimming */
mbed_official 237:f3da66175598 182 trimmingvaluen2 -= delta;
mbed_official 237:f3da66175598 183 }
mbed_official 237:f3da66175598 184
mbed_official 237:f3da66175598 185 delta >>= 1;
mbed_official 237:f3da66175598 186 }
mbed_official 237:f3da66175598 187
mbed_official 237:f3da66175598 188 // Still need to check if righ calibration is current value or un step below
mbed_official 237:f3da66175598 189 // Indeed the first value that causes the OUTCAL bit to change from 1 to 0
mbed_official 237:f3da66175598 190 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen1<<OPAMP_INPUT_INVERTING);
mbed_official 237:f3da66175598 191 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen2<<OPAMP_INPUT_INVERTING);
mbed_official 237:f3da66175598 192
mbed_official 237:f3da66175598 193 /* OFFTRIMmax delay 2 ms as per datasheet (electrical characteristics */
mbed_official 237:f3da66175598 194 /* Offset trim time: during calibration, minimum time needed between */
mbed_official 237:f3da66175598 195 /* two steps to have 1 mV accuracy */
mbed_official 237:f3da66175598 196 HAL_Delay(2);
mbed_official 237:f3da66175598 197
mbed_official 237:f3da66175598 198 if (hopamp1->Instance->CSR & OPAMP_CSR_OUTCAL)
mbed_official 237:f3da66175598 199 {
mbed_official 237:f3da66175598 200 /* OPAMP_CSR_OUTCAL is actually one value more */
mbed_official 237:f3da66175598 201 trimmingvaluen1++;
mbed_official 237:f3da66175598 202 /* Set right trimming */
mbed_official 237:f3da66175598 203 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen1<<OPAMP_INPUT_INVERTING);
mbed_official 237:f3da66175598 204 }
mbed_official 237:f3da66175598 205
mbed_official 237:f3da66175598 206 if (hopamp2->Instance->CSR & OPAMP_CSR_OUTCAL)
mbed_official 237:f3da66175598 207 {
mbed_official 237:f3da66175598 208 /* OPAMP_CSR_OUTCAL is actually one value more */
mbed_official 237:f3da66175598 209 trimmingvaluen2++;
mbed_official 237:f3da66175598 210 /* Set right trimming */
mbed_official 237:f3da66175598 211 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen2<<OPAMP_INPUT_INVERTING);
mbed_official 237:f3da66175598 212 }
mbed_official 237:f3da66175598 213
mbed_official 237:f3da66175598 214
mbed_official 237:f3da66175598 215 /* 2nd calibration - P */
mbed_official 237:f3da66175598 216 /* Select 10% VREF */
mbed_official 237:f3da66175598 217 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_10VDDA);
mbed_official 237:f3da66175598 218 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_10VDDA);
mbed_official 237:f3da66175598 219
mbed_official 237:f3da66175598 220 /* Init trimming counter */
mbed_official 237:f3da66175598 221 /* Medium value */
mbed_official 237:f3da66175598 222 trimmingvaluep1 = 16;
mbed_official 237:f3da66175598 223 trimmingvaluep2 = 16;
mbed_official 237:f3da66175598 224 delta = 8;
mbed_official 237:f3da66175598 225
mbed_official 237:f3da66175598 226 while (delta != 0)
mbed_official 237:f3da66175598 227 {
mbed_official 237:f3da66175598 228 // Set candidate trimming */
mbed_official 237:f3da66175598 229 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep1<<OPAMP_INPUT_NONINVERTING);
mbed_official 237:f3da66175598 230 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep2<<OPAMP_INPUT_NONINVERTING);
mbed_official 237:f3da66175598 231
mbed_official 237:f3da66175598 232 /* OFFTRIMmax delay 2 ms as per datasheet (electrical characteristics */
mbed_official 237:f3da66175598 233 /* Offset trim time: during calibration, minimum time needed between */
mbed_official 237:f3da66175598 234 /* two steps to have 1 mV accuracy */
mbed_official 237:f3da66175598 235 HAL_Delay(2);
mbed_official 237:f3da66175598 236
mbed_official 237:f3da66175598 237 if (hopamp1->Instance->CSR & OPAMP_CSR_OUTCAL)
mbed_official 237:f3da66175598 238 {
mbed_official 237:f3da66175598 239 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
mbed_official 237:f3da66175598 240 trimmingvaluep1 += delta;
mbed_official 237:f3da66175598 241 }
mbed_official 237:f3da66175598 242 else
mbed_official 237:f3da66175598 243 {
mbed_official 237:f3da66175598 244 trimmingvaluep1 -= delta;
mbed_official 237:f3da66175598 245 }
mbed_official 237:f3da66175598 246
mbed_official 237:f3da66175598 247 if (hopamp2->Instance->CSR & OPAMP_CSR_OUTCAL)
mbed_official 237:f3da66175598 248 {
mbed_official 237:f3da66175598 249 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
mbed_official 237:f3da66175598 250 trimmingvaluep2 += delta;
mbed_official 237:f3da66175598 251 }
mbed_official 237:f3da66175598 252 else
mbed_official 237:f3da66175598 253 {
mbed_official 237:f3da66175598 254 trimmingvaluep2 -= delta;
mbed_official 237:f3da66175598 255 }
mbed_official 237:f3da66175598 256
mbed_official 237:f3da66175598 257 delta >>= 1;
mbed_official 237:f3da66175598 258 }
mbed_official 237:f3da66175598 259
mbed_official 237:f3da66175598 260 // Still need to check if righ calibration is current value or un step below
mbed_official 237:f3da66175598 261 // Indeed the first value that causes the OUTCAL bit to change from 1 to 0
mbed_official 237:f3da66175598 262 // Set candidate trimming */
mbed_official 237:f3da66175598 263 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep1<<OPAMP_INPUT_NONINVERTING);
mbed_official 237:f3da66175598 264 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep2<<OPAMP_INPUT_NONINVERTING);
mbed_official 237:f3da66175598 265
mbed_official 237:f3da66175598 266 /* OFFTRIMmax delay 2 ms as per datasheet (electrical characteristics */
mbed_official 237:f3da66175598 267 /* Offset trim time: during calibration, minimum time needed between */
mbed_official 237:f3da66175598 268 /* two steps to have 1 mV accuracy */
mbed_official 237:f3da66175598 269 HAL_Delay(2);
mbed_official 237:f3da66175598 270
mbed_official 237:f3da66175598 271 if (hopamp1->Instance->CSR & OPAMP_CSR_OUTCAL)
mbed_official 237:f3da66175598 272 {
mbed_official 237:f3da66175598 273 /* OPAMP_CSR_OUTCAL is actually one value more */
mbed_official 237:f3da66175598 274 trimmingvaluep1++;
mbed_official 237:f3da66175598 275 /* Set right trimming */
mbed_official 237:f3da66175598 276 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep1<<OPAMP_INPUT_NONINVERTING);
mbed_official 237:f3da66175598 277 }
mbed_official 237:f3da66175598 278
mbed_official 237:f3da66175598 279 if (hopamp2->Instance->CSR & OPAMP_CSR_OUTCAL)
mbed_official 237:f3da66175598 280 {
mbed_official 237:f3da66175598 281 /* OPAMP_CSR_OUTCAL is actually one value more */
mbed_official 237:f3da66175598 282 trimmingvaluep2++;
mbed_official 237:f3da66175598 283 /* Set right trimming */
mbed_official 237:f3da66175598 284 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep2<<OPAMP_INPUT_NONINVERTING);
mbed_official 237:f3da66175598 285 }
mbed_official 237:f3da66175598 286
mbed_official 237:f3da66175598 287 /* Disable calibration */
mbed_official 237:f3da66175598 288 CLEAR_BIT (hopamp1->Instance->CSR, OPAMP_CSR_CALON);
mbed_official 237:f3da66175598 289 CLEAR_BIT (hopamp2->Instance->CSR, OPAMP_CSR_CALON);
mbed_official 237:f3da66175598 290
mbed_official 237:f3da66175598 291 /* Disable the OPAMPs */
mbed_official 237:f3da66175598 292 CLEAR_BIT (hopamp1->Instance->CSR, OPAMP_CSR_OPAMPxEN);
mbed_official 237:f3da66175598 293 CLEAR_BIT (hopamp2->Instance->CSR, OPAMP_CSR_OPAMPxEN);
mbed_official 237:f3da66175598 294
mbed_official 237:f3da66175598 295 /* Set normale operating mode back */
mbed_official 237:f3da66175598 296 CLEAR_BIT(hopamp1->Instance->CSR, OPAMP_CSR_FORCEVP);
mbed_official 237:f3da66175598 297 CLEAR_BIT(hopamp2->Instance->CSR, OPAMP_CSR_FORCEVP);
mbed_official 237:f3da66175598 298
mbed_official 237:f3da66175598 299 /* Self calibration is successful */
mbed_official 237:f3da66175598 300 /* Store calibration(user timming) results in init structure. */
mbed_official 237:f3da66175598 301 /* Select user timming mode */
mbed_official 237:f3da66175598 302
mbed_official 237:f3da66175598 303 /* Write calibration result N */
mbed_official 237:f3da66175598 304 hopamp1->Init.TrimmingValueN = trimmingvaluen1;
mbed_official 237:f3da66175598 305 hopamp2->Init.TrimmingValueN = trimmingvaluen2;
mbed_official 237:f3da66175598 306
mbed_official 237:f3da66175598 307 /* Write calibration result P */
mbed_official 237:f3da66175598 308 hopamp1->Init.TrimmingValueP = trimmingvaluep1;
mbed_official 237:f3da66175598 309 hopamp2->Init.TrimmingValueP = trimmingvaluep2;
mbed_official 237:f3da66175598 310
mbed_official 237:f3da66175598 311 /* Calibration */
mbed_official 237:f3da66175598 312 hopamp1->Init.UserTrimming = OPAMP_TRIMMING_USER;
mbed_official 237:f3da66175598 313 hopamp2->Init.UserTrimming = OPAMP_TRIMMING_USER;
mbed_official 237:f3da66175598 314
mbed_official 237:f3da66175598 315 /* Select user timming mode */
mbed_official 237:f3da66175598 316 /* And updated with calibrated settings */
mbed_official 237:f3da66175598 317 hopamp1->Init.UserTrimming = OPAMP_TRIMMING_USER;
mbed_official 237:f3da66175598 318 hopamp2->Init.UserTrimming = OPAMP_TRIMMING_USER;
mbed_official 237:f3da66175598 319
mbed_official 237:f3da66175598 320 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen1<<OPAMP_INPUT_INVERTING);
mbed_official 237:f3da66175598 321 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen2<<OPAMP_INPUT_INVERTING);
mbed_official 237:f3da66175598 322
mbed_official 237:f3da66175598 323 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep1<<OPAMP_INPUT_NONINVERTING);
mbed_official 237:f3da66175598 324 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep2<<OPAMP_INPUT_NONINVERTING);
mbed_official 237:f3da66175598 325
mbed_official 237:f3da66175598 326 }
mbed_official 237:f3da66175598 327
mbed_official 237:f3da66175598 328 else
mbed_official 237:f3da66175598 329 {
mbed_official 237:f3da66175598 330 /* At least one OPAMP can not be calibrated */
mbed_official 237:f3da66175598 331 status = HAL_ERROR;
mbed_official 237:f3da66175598 332 }
mbed_official 237:f3da66175598 333 }
mbed_official 237:f3da66175598 334
mbed_official 237:f3da66175598 335 return status;
mbed_official 237:f3da66175598 336 }
mbed_official 375:3d36234a1087 337 #endif /* STM32F302xE || */
mbed_official 375:3d36234a1087 338 /* STM32F302xC */
mbed_official 237:f3da66175598 339
mbed_official 375:3d36234a1087 340 #if defined(STM32F303xE) || defined(STM32F398xx) || \
mbed_official 375:3d36234a1087 341 defined(STM32F303xC) || defined(STM32F358xx)
mbed_official 237:f3da66175598 342 /* 4 OPAMPS available */
mbed_official 237:f3da66175598 343 /* 4 OPAMPS can be calibrated in parallel */
mbed_official 237:f3da66175598 344
mbed_official 237:f3da66175598 345 /**
mbed_official 237:f3da66175598 346 * @brief Run the self calibration of 4 OPAMPs in parallel.
mbed_official 237:f3da66175598 347 * @param hopamp1 handle
mbed_official 237:f3da66175598 348 * @param hopamp2 handle
mbed_official 237:f3da66175598 349 * @param hopamp3 handle
mbed_official 237:f3da66175598 350 * @param hopamp4 handle
mbed_official 237:f3da66175598 351 * @retval HAL status
mbed_official 237:f3da66175598 352 * @note Updated offset trimming values (PMOS & NMOS), user trimming is enabled
mbed_official 237:f3da66175598 353 * @note Calibration runs about 25 ms.
mbed_official 237:f3da66175598 354 */
mbed_official 237:f3da66175598 355
mbed_official 237:f3da66175598 356 HAL_StatusTypeDef HAL_OPAMPEx_SelfCalibrateAll(OPAMP_HandleTypeDef *hopamp1, OPAMP_HandleTypeDef *hopamp2, OPAMP_HandleTypeDef *hopamp3, OPAMP_HandleTypeDef *hopamp4)
mbed_official 237:f3da66175598 357 {
mbed_official 237:f3da66175598 358 HAL_StatusTypeDef status = HAL_OK;
mbed_official 237:f3da66175598 359
mbed_official 237:f3da66175598 360 uint32_t trimmingvaluen1 = 0;
mbed_official 237:f3da66175598 361 uint32_t trimmingvaluep1 = 0;
mbed_official 237:f3da66175598 362 uint32_t trimmingvaluen2 = 0;
mbed_official 237:f3da66175598 363 uint32_t trimmingvaluep2 = 0;
mbed_official 237:f3da66175598 364 uint32_t trimmingvaluen3 = 0;
mbed_official 237:f3da66175598 365 uint32_t trimmingvaluep3 = 0;
mbed_official 237:f3da66175598 366 uint32_t trimmingvaluen4 = 0;
mbed_official 237:f3da66175598 367 uint32_t trimmingvaluep4 = 0;
mbed_official 237:f3da66175598 368
mbed_official 237:f3da66175598 369 uint32_t delta;
mbed_official 237:f3da66175598 370
mbed_official 634:ac7d6880524d 371 if((hopamp1 == HAL_NULL) || (hopamp1->State == HAL_OPAMP_STATE_BUSYLOCKED) || \
mbed_official 634:ac7d6880524d 372 (hopamp2 == HAL_NULL) || (hopamp2->State == HAL_OPAMP_STATE_BUSYLOCKED) || \
mbed_official 634:ac7d6880524d 373 (hopamp3 == HAL_NULL) || (hopamp3->State == HAL_OPAMP_STATE_BUSYLOCKED) || \
mbed_official 634:ac7d6880524d 374 (hopamp4 == HAL_NULL) || (hopamp4->State == HAL_OPAMP_STATE_BUSYLOCKED))
mbed_official 237:f3da66175598 375 {
mbed_official 237:f3da66175598 376 status = HAL_ERROR;
mbed_official 237:f3da66175598 377 }
mbed_official 237:f3da66175598 378
mbed_official 237:f3da66175598 379 if(status == HAL_OK)
mbed_official 237:f3da66175598 380 {
mbed_official 237:f3da66175598 381 /* Check if OPAMP in calibration mode and calibration not yet enable */
mbed_official 237:f3da66175598 382 if((hopamp1->State == HAL_OPAMP_STATE_READY) && (hopamp2->State == HAL_OPAMP_STATE_READY) && \
mbed_official 237:f3da66175598 383 (hopamp3->State == HAL_OPAMP_STATE_READY) && (hopamp4->State == HAL_OPAMP_STATE_READY))
mbed_official 237:f3da66175598 384 {
mbed_official 237:f3da66175598 385 /* Check the parameter */
mbed_official 237:f3da66175598 386 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp1->Instance));
mbed_official 237:f3da66175598 387 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp2->Instance));
mbed_official 237:f3da66175598 388 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp3->Instance));
mbed_official 237:f3da66175598 389 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp4->Instance));
mbed_official 237:f3da66175598 390
mbed_official 237:f3da66175598 391 /* Set Calibration mode */
mbed_official 237:f3da66175598 392 /* Non-inverting input connected to calibration reference voltage. */
mbed_official 237:f3da66175598 393 SET_BIT(hopamp1->Instance->CSR, OPAMP_CSR_FORCEVP);
mbed_official 237:f3da66175598 394 SET_BIT(hopamp2->Instance->CSR, OPAMP_CSR_FORCEVP);
mbed_official 237:f3da66175598 395 SET_BIT(hopamp3->Instance->CSR, OPAMP_CSR_FORCEVP);
mbed_official 237:f3da66175598 396 SET_BIT(hopamp4->Instance->CSR, OPAMP_CSR_FORCEVP);
mbed_official 237:f3da66175598 397
mbed_official 237:f3da66175598 398 /* user trimming values are used for offset calibration */
mbed_official 237:f3da66175598 399 SET_BIT(hopamp1->Instance->CSR, OPAMP_CSR_USERTRIM);
mbed_official 237:f3da66175598 400 SET_BIT(hopamp2->Instance->CSR, OPAMP_CSR_USERTRIM);
mbed_official 237:f3da66175598 401 SET_BIT(hopamp3->Instance->CSR, OPAMP_CSR_USERTRIM);
mbed_official 237:f3da66175598 402 SET_BIT(hopamp4->Instance->CSR, OPAMP_CSR_USERTRIM);
mbed_official 237:f3da66175598 403
mbed_official 237:f3da66175598 404 /* Enable calibration */
mbed_official 237:f3da66175598 405 SET_BIT (hopamp1->Instance->CSR, OPAMP_CSR_CALON);
mbed_official 237:f3da66175598 406 SET_BIT (hopamp2->Instance->CSR, OPAMP_CSR_CALON);
mbed_official 237:f3da66175598 407 SET_BIT (hopamp3->Instance->CSR, OPAMP_CSR_CALON);
mbed_official 237:f3da66175598 408 SET_BIT (hopamp4->Instance->CSR, OPAMP_CSR_CALON);
mbed_official 237:f3da66175598 409
mbed_official 237:f3da66175598 410 /* 1st calibration - N */
mbed_official 237:f3da66175598 411 /* Select 90% VREF */
mbed_official 237:f3da66175598 412 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_90VDDA);
mbed_official 237:f3da66175598 413 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_90VDDA);
mbed_official 237:f3da66175598 414 MODIFY_REG(hopamp3->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_90VDDA);
mbed_official 237:f3da66175598 415 MODIFY_REG(hopamp4->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_90VDDA);
mbed_official 237:f3da66175598 416
mbed_official 237:f3da66175598 417 /* Enable the opamps */
mbed_official 237:f3da66175598 418 SET_BIT (hopamp1->Instance->CSR, OPAMP_CSR_OPAMPxEN);
mbed_official 237:f3da66175598 419 SET_BIT (hopamp2->Instance->CSR, OPAMP_CSR_OPAMPxEN);
mbed_official 237:f3da66175598 420 SET_BIT (hopamp3->Instance->CSR, OPAMP_CSR_OPAMPxEN);
mbed_official 237:f3da66175598 421 SET_BIT (hopamp4->Instance->CSR, OPAMP_CSR_OPAMPxEN);
mbed_official 237:f3da66175598 422
mbed_official 237:f3da66175598 423 /* Init trimming counter */
mbed_official 237:f3da66175598 424 /* Medium value */
mbed_official 237:f3da66175598 425 trimmingvaluen1 = 16;
mbed_official 237:f3da66175598 426 trimmingvaluen2 = 16;
mbed_official 237:f3da66175598 427 trimmingvaluen3 = 16;
mbed_official 237:f3da66175598 428 trimmingvaluen4 = 16;
mbed_official 237:f3da66175598 429 delta = 8;
mbed_official 237:f3da66175598 430
mbed_official 237:f3da66175598 431 while (delta != 0)
mbed_official 237:f3da66175598 432 {
mbed_official 237:f3da66175598 433 /* Set candidate trimming */
mbed_official 237:f3da66175598 434 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen1<<OPAMP_INPUT_INVERTING);
mbed_official 237:f3da66175598 435 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen2<<OPAMP_INPUT_INVERTING);
mbed_official 237:f3da66175598 436 MODIFY_REG(hopamp3->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen3<<OPAMP_INPUT_INVERTING);
mbed_official 237:f3da66175598 437 MODIFY_REG(hopamp4->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen4<<OPAMP_INPUT_INVERTING);
mbed_official 237:f3da66175598 438
mbed_official 237:f3da66175598 439 /* OFFTRIMmax delay 2 ms as per datasheet (electrical characteristics */
mbed_official 237:f3da66175598 440 /* Offset trim time: during calibration, minimum time needed between */
mbed_official 237:f3da66175598 441 /* two steps to have 1 mV accuracy */
mbed_official 237:f3da66175598 442 HAL_Delay(2);
mbed_official 237:f3da66175598 443
mbed_official 237:f3da66175598 444 if ((hopamp1->Instance->CSR & OPAMP_CSR_OUTCAL) != RESET)
mbed_official 237:f3da66175598 445 {
mbed_official 237:f3da66175598 446 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
mbed_official 237:f3da66175598 447 trimmingvaluen1 += delta;
mbed_official 237:f3da66175598 448 }
mbed_official 237:f3da66175598 449 else
mbed_official 237:f3da66175598 450 {
mbed_official 237:f3da66175598 451 /* OPAMP_CSR_OUTCAL is LOW try lower trimming */
mbed_official 237:f3da66175598 452 trimmingvaluen1 -= delta;
mbed_official 237:f3da66175598 453 }
mbed_official 237:f3da66175598 454
mbed_official 237:f3da66175598 455 if ((hopamp2->Instance->CSR & OPAMP_CSR_OUTCAL) != RESET)
mbed_official 237:f3da66175598 456 {
mbed_official 237:f3da66175598 457 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
mbed_official 237:f3da66175598 458 trimmingvaluen2 += delta;
mbed_official 237:f3da66175598 459 }
mbed_official 237:f3da66175598 460 else
mbed_official 237:f3da66175598 461 {
mbed_official 237:f3da66175598 462 /* OPAMP_CSR_OUTCAL is LOW try lower trimming */
mbed_official 237:f3da66175598 463 trimmingvaluen2 -= delta;
mbed_official 237:f3da66175598 464 }
mbed_official 237:f3da66175598 465
mbed_official 237:f3da66175598 466 if ((hopamp3->Instance->CSR & OPAMP_CSR_OUTCAL) != RESET)
mbed_official 237:f3da66175598 467 {
mbed_official 237:f3da66175598 468 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
mbed_official 237:f3da66175598 469 trimmingvaluen3 += delta;
mbed_official 237:f3da66175598 470 }
mbed_official 237:f3da66175598 471 else
mbed_official 237:f3da66175598 472 {
mbed_official 237:f3da66175598 473 /* OPAMP_CSR_OUTCAL is LOW try lower trimming */
mbed_official 237:f3da66175598 474 trimmingvaluen3 -= delta;
mbed_official 237:f3da66175598 475 }
mbed_official 237:f3da66175598 476
mbed_official 237:f3da66175598 477 if ((hopamp4->Instance->CSR & OPAMP_CSR_OUTCAL) != RESET)
mbed_official 237:f3da66175598 478 {
mbed_official 237:f3da66175598 479 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
mbed_official 237:f3da66175598 480 trimmingvaluen4 += delta;
mbed_official 237:f3da66175598 481 }
mbed_official 237:f3da66175598 482 else
mbed_official 237:f3da66175598 483 {
mbed_official 237:f3da66175598 484 /* OPAMP_CSR_OUTCAL is LOW try lower trimming */
mbed_official 237:f3da66175598 485 trimmingvaluen4 -= delta;
mbed_official 237:f3da66175598 486 }
mbed_official 237:f3da66175598 487
mbed_official 237:f3da66175598 488 delta >>= 1;
mbed_official 237:f3da66175598 489 }
mbed_official 237:f3da66175598 490
mbed_official 237:f3da66175598 491 /* Still need to check if righ calibration is current value or un step below */
mbed_official 237:f3da66175598 492 /* Indeed the first value that causes the OUTCAL bit to change from 1 to 0 */
mbed_official 237:f3da66175598 493 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen1<<OPAMP_INPUT_INVERTING);
mbed_official 237:f3da66175598 494 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen2<<OPAMP_INPUT_INVERTING);
mbed_official 237:f3da66175598 495 MODIFY_REG(hopamp3->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen3<<OPAMP_INPUT_INVERTING);
mbed_official 237:f3da66175598 496 MODIFY_REG(hopamp4->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen4<<OPAMP_INPUT_INVERTING);
mbed_official 237:f3da66175598 497
mbed_official 237:f3da66175598 498 /* OFFTRIMmax delay 2 ms as per datasheet (electrical characteristics */
mbed_official 237:f3da66175598 499 /* Offset trim time: during calibration, minimum time needed between */
mbed_official 237:f3da66175598 500 /* two steps to have 1 mV accuracy */
mbed_official 237:f3da66175598 501 HAL_Delay(2);
mbed_official 237:f3da66175598 502
mbed_official 237:f3da66175598 503 if ((hopamp1->Instance->CSR & OPAMP_CSR_OUTCAL) != RESET)
mbed_official 237:f3da66175598 504 {
mbed_official 237:f3da66175598 505 /* OPAMP_CSR_OUTCAL is actually one value more */
mbed_official 237:f3da66175598 506 trimmingvaluen1++;
mbed_official 237:f3da66175598 507 /* Set right trimming */
mbed_official 237:f3da66175598 508 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen1<<OPAMP_INPUT_INVERTING);
mbed_official 237:f3da66175598 509 }
mbed_official 237:f3da66175598 510
mbed_official 237:f3da66175598 511 if ((hopamp2->Instance->CSR & OPAMP_CSR_OUTCAL) != RESET)
mbed_official 237:f3da66175598 512 {
mbed_official 237:f3da66175598 513 /* OPAMP_CSR_OUTCAL is actually one value more */
mbed_official 237:f3da66175598 514 trimmingvaluen2++;
mbed_official 237:f3da66175598 515 /* Set right trimming */
mbed_official 237:f3da66175598 516 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen2<<OPAMP_INPUT_INVERTING);
mbed_official 237:f3da66175598 517 }
mbed_official 237:f3da66175598 518
mbed_official 237:f3da66175598 519 if ((hopamp3->Instance->CSR & OPAMP_CSR_OUTCAL) != RESET)
mbed_official 237:f3da66175598 520 {
mbed_official 237:f3da66175598 521 /* OPAMP_CSR_OUTCAL is actually one value more */
mbed_official 237:f3da66175598 522 trimmingvaluen3++;
mbed_official 237:f3da66175598 523 /* Set right trimming */
mbed_official 237:f3da66175598 524 MODIFY_REG(hopamp3->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen3<<OPAMP_INPUT_INVERTING);
mbed_official 237:f3da66175598 525 }
mbed_official 237:f3da66175598 526
mbed_official 237:f3da66175598 527 if ((hopamp4->Instance->CSR & OPAMP_CSR_OUTCAL) != RESET)
mbed_official 237:f3da66175598 528 {
mbed_official 237:f3da66175598 529 /* OPAMP_CSR_OUTCAL is actually one value more */
mbed_official 237:f3da66175598 530 trimmingvaluen4++;
mbed_official 237:f3da66175598 531 /* Set right trimming */
mbed_official 237:f3da66175598 532 MODIFY_REG(hopamp4->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen4<<OPAMP_INPUT_INVERTING);
mbed_official 237:f3da66175598 533 }
mbed_official 237:f3da66175598 534
mbed_official 237:f3da66175598 535 /* 2nd calibration - P */
mbed_official 237:f3da66175598 536 /* Select 10% VREF */
mbed_official 237:f3da66175598 537 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_10VDDA);
mbed_official 237:f3da66175598 538 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_10VDDA);
mbed_official 237:f3da66175598 539 MODIFY_REG(hopamp3->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_10VDDA);
mbed_official 237:f3da66175598 540 MODIFY_REG(hopamp4->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_10VDDA);
mbed_official 237:f3da66175598 541
mbed_official 237:f3da66175598 542 /* Init trimming counter */
mbed_official 237:f3da66175598 543 /* Medium value */
mbed_official 237:f3da66175598 544 trimmingvaluep1 = 16;
mbed_official 237:f3da66175598 545 trimmingvaluep2 = 16;
mbed_official 237:f3da66175598 546 trimmingvaluep3 = 16;
mbed_official 237:f3da66175598 547 trimmingvaluep4 = 16;
mbed_official 237:f3da66175598 548
mbed_official 237:f3da66175598 549 delta = 8;
mbed_official 237:f3da66175598 550
mbed_official 237:f3da66175598 551 while (delta != 0)
mbed_official 237:f3da66175598 552 {
mbed_official 237:f3da66175598 553 /* Set candidate trimming */
mbed_official 237:f3da66175598 554 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep1<<OPAMP_INPUT_NONINVERTING);
mbed_official 237:f3da66175598 555 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep2<<OPAMP_INPUT_NONINVERTING);
mbed_official 237:f3da66175598 556 MODIFY_REG(hopamp3->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep3<<OPAMP_INPUT_NONINVERTING);
mbed_official 237:f3da66175598 557 MODIFY_REG(hopamp4->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep4<<OPAMP_INPUT_NONINVERTING);
mbed_official 237:f3da66175598 558
mbed_official 237:f3da66175598 559 /* OFFTRIMmax delay 2 ms as per datasheet (electrical characteristics */
mbed_official 237:f3da66175598 560 /* Offset trim time: during calibration, minimum time needed between */
mbed_official 237:f3da66175598 561 /* two steps to have 1 mV accuracy */
mbed_official 237:f3da66175598 562 HAL_Delay(2);
mbed_official 237:f3da66175598 563
mbed_official 237:f3da66175598 564 if ((hopamp1->Instance->CSR & OPAMP_CSR_OUTCAL) != RESET)
mbed_official 237:f3da66175598 565 {
mbed_official 237:f3da66175598 566 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
mbed_official 237:f3da66175598 567 trimmingvaluep1 += delta;
mbed_official 237:f3da66175598 568 }
mbed_official 237:f3da66175598 569 else
mbed_official 237:f3da66175598 570 {
mbed_official 237:f3da66175598 571 trimmingvaluep1 -= delta;
mbed_official 237:f3da66175598 572 }
mbed_official 237:f3da66175598 573
mbed_official 237:f3da66175598 574 if ((hopamp2->Instance->CSR & OPAMP_CSR_OUTCAL) != RESET)
mbed_official 237:f3da66175598 575 {
mbed_official 237:f3da66175598 576 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
mbed_official 237:f3da66175598 577 trimmingvaluep2 += delta;
mbed_official 237:f3da66175598 578 }
mbed_official 237:f3da66175598 579 else
mbed_official 237:f3da66175598 580 {
mbed_official 237:f3da66175598 581 trimmingvaluep2 -= delta;
mbed_official 237:f3da66175598 582 }
mbed_official 237:f3da66175598 583
mbed_official 237:f3da66175598 584 if ((hopamp3->Instance->CSR & OPAMP_CSR_OUTCAL) != RESET)
mbed_official 237:f3da66175598 585 {
mbed_official 237:f3da66175598 586 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
mbed_official 237:f3da66175598 587 trimmingvaluep3 += delta;
mbed_official 237:f3da66175598 588 }
mbed_official 237:f3da66175598 589 else
mbed_official 237:f3da66175598 590 {
mbed_official 237:f3da66175598 591 trimmingvaluep3 -= delta;
mbed_official 237:f3da66175598 592 }
mbed_official 237:f3da66175598 593
mbed_official 237:f3da66175598 594 if ((hopamp4->Instance->CSR & OPAMP_CSR_OUTCAL) != RESET)
mbed_official 237:f3da66175598 595 {
mbed_official 237:f3da66175598 596 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
mbed_official 237:f3da66175598 597 trimmingvaluep4 += delta;
mbed_official 237:f3da66175598 598 }
mbed_official 237:f3da66175598 599 else
mbed_official 237:f3da66175598 600 {
mbed_official 237:f3da66175598 601 trimmingvaluep4 -= delta;
mbed_official 237:f3da66175598 602 }
mbed_official 237:f3da66175598 603
mbed_official 237:f3da66175598 604 delta >>= 1;
mbed_official 237:f3da66175598 605 }
mbed_official 237:f3da66175598 606
mbed_official 237:f3da66175598 607 /* Still need to check if righ calibration is current value or un step below */
mbed_official 237:f3da66175598 608 /* Indeed the first value that causes the OUTCAL bit to change from 1 to 0 */
mbed_official 237:f3da66175598 609 /* Set candidate trimming */
mbed_official 237:f3da66175598 610 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep1<<OPAMP_INPUT_NONINVERTING);
mbed_official 237:f3da66175598 611 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep2<<OPAMP_INPUT_NONINVERTING);
mbed_official 237:f3da66175598 612 MODIFY_REG(hopamp3->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep3<<OPAMP_INPUT_NONINVERTING);
mbed_official 237:f3da66175598 613 MODIFY_REG(hopamp4->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep4<<OPAMP_INPUT_NONINVERTING);
mbed_official 237:f3da66175598 614
mbed_official 237:f3da66175598 615 /* OFFTRIMmax delay 2 ms as per datasheet (electrical characteristics */
mbed_official 237:f3da66175598 616 /* Offset trim time: during calibration, minimum time needed between */
mbed_official 237:f3da66175598 617 /* two steps to have 1 mV accuracy */
mbed_official 237:f3da66175598 618 HAL_Delay(2);
mbed_official 237:f3da66175598 619
mbed_official 237:f3da66175598 620 if ((hopamp1->Instance->CSR & OPAMP_CSR_OUTCAL) != RESET)
mbed_official 237:f3da66175598 621 {
mbed_official 237:f3da66175598 622 /* OPAMP_CSR_OUTCAL is actually one value more */
mbed_official 237:f3da66175598 623 trimmingvaluep1++;
mbed_official 237:f3da66175598 624 /* Set right trimming */
mbed_official 237:f3da66175598 625 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep1<<OPAMP_INPUT_NONINVERTING);
mbed_official 237:f3da66175598 626 }
mbed_official 237:f3da66175598 627
mbed_official 237:f3da66175598 628 if ((hopamp2->Instance->CSR & OPAMP_CSR_OUTCAL) != RESET)
mbed_official 237:f3da66175598 629 {
mbed_official 237:f3da66175598 630 /* OPAMP_CSR_OUTCAL is actually one value more */
mbed_official 237:f3da66175598 631 trimmingvaluep2++;
mbed_official 237:f3da66175598 632 /* Set right trimming */
mbed_official 237:f3da66175598 633 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep2<<OPAMP_INPUT_NONINVERTING);
mbed_official 237:f3da66175598 634 }
mbed_official 237:f3da66175598 635
mbed_official 237:f3da66175598 636 if ((hopamp3->Instance->CSR & OPAMP_CSR_OUTCAL) != RESET)
mbed_official 237:f3da66175598 637 {
mbed_official 237:f3da66175598 638 /* OPAMP_CSR_OUTCAL is actually one value more */
mbed_official 237:f3da66175598 639 trimmingvaluep3++;
mbed_official 237:f3da66175598 640 /* Set right trimming */
mbed_official 237:f3da66175598 641 MODIFY_REG(hopamp3->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep3<<OPAMP_INPUT_NONINVERTING);
mbed_official 237:f3da66175598 642 }
mbed_official 237:f3da66175598 643
mbed_official 237:f3da66175598 644 if ((hopamp4->Instance->CSR & OPAMP_CSR_OUTCAL) != RESET)
mbed_official 237:f3da66175598 645 {
mbed_official 237:f3da66175598 646 /* OPAMP_CSR_OUTCAL is actually one value more */
mbed_official 237:f3da66175598 647 trimmingvaluep4++;
mbed_official 237:f3da66175598 648 /* Set right trimming */
mbed_official 237:f3da66175598 649 MODIFY_REG(hopamp4->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep4<<OPAMP_INPUT_NONINVERTING);
mbed_official 237:f3da66175598 650 }
mbed_official 237:f3da66175598 651
mbed_official 237:f3da66175598 652 /* Disable calibration */
mbed_official 237:f3da66175598 653 CLEAR_BIT (hopamp1->Instance->CSR, OPAMP_CSR_CALON);
mbed_official 237:f3da66175598 654 CLEAR_BIT (hopamp2->Instance->CSR, OPAMP_CSR_CALON);
mbed_official 237:f3da66175598 655 CLEAR_BIT (hopamp3->Instance->CSR, OPAMP_CSR_CALON);
mbed_official 237:f3da66175598 656 CLEAR_BIT (hopamp4->Instance->CSR, OPAMP_CSR_CALON);
mbed_official 237:f3da66175598 657
mbed_official 237:f3da66175598 658 /* Disable the OPAMPs */
mbed_official 237:f3da66175598 659 CLEAR_BIT (hopamp1->Instance->CSR, OPAMP_CSR_OPAMPxEN);
mbed_official 237:f3da66175598 660 CLEAR_BIT (hopamp2->Instance->CSR, OPAMP_CSR_OPAMPxEN);
mbed_official 237:f3da66175598 661 CLEAR_BIT (hopamp3->Instance->CSR, OPAMP_CSR_OPAMPxEN);
mbed_official 237:f3da66175598 662 CLEAR_BIT (hopamp4->Instance->CSR, OPAMP_CSR_OPAMPxEN);
mbed_official 237:f3da66175598 663
mbed_official 375:3d36234a1087 664 /* Set normal operating mode back */
mbed_official 237:f3da66175598 665 CLEAR_BIT(hopamp1->Instance->CSR, OPAMP_CSR_FORCEVP);
mbed_official 237:f3da66175598 666 CLEAR_BIT(hopamp2->Instance->CSR, OPAMP_CSR_FORCEVP);
mbed_official 237:f3da66175598 667 CLEAR_BIT(hopamp3->Instance->CSR, OPAMP_CSR_FORCEVP);
mbed_official 237:f3da66175598 668 CLEAR_BIT(hopamp4->Instance->CSR, OPAMP_CSR_FORCEVP);
mbed_official 237:f3da66175598 669
mbed_official 237:f3da66175598 670 /* Self calibration is successful */
mbed_official 237:f3da66175598 671 /* Store calibration(user timming) results in init structure. */
mbed_official 237:f3da66175598 672 /* Select user timming mode */
mbed_official 237:f3da66175598 673
mbed_official 237:f3da66175598 674 /* Write calibration result N */
mbed_official 237:f3da66175598 675 hopamp1->Init.TrimmingValueN = trimmingvaluen1;
mbed_official 237:f3da66175598 676 hopamp2->Init.TrimmingValueN = trimmingvaluen2;
mbed_official 237:f3da66175598 677 hopamp3->Init.TrimmingValueN = trimmingvaluen3;
mbed_official 237:f3da66175598 678 hopamp4->Init.TrimmingValueN = trimmingvaluen4;
mbed_official 237:f3da66175598 679
mbed_official 237:f3da66175598 680 /* Write calibration result P */
mbed_official 237:f3da66175598 681 hopamp1->Init.TrimmingValueP = trimmingvaluep1;
mbed_official 237:f3da66175598 682 hopamp2->Init.TrimmingValueP = trimmingvaluep2;
mbed_official 237:f3da66175598 683 hopamp3->Init.TrimmingValueP = trimmingvaluep3;
mbed_official 237:f3da66175598 684 hopamp4->Init.TrimmingValueP = trimmingvaluep4;
mbed_official 237:f3da66175598 685
mbed_official 237:f3da66175598 686 /* Select user timming mode */
mbed_official 237:f3da66175598 687 /* And updated with calibrated settings */
mbed_official 237:f3da66175598 688 hopamp1->Init.UserTrimming = OPAMP_TRIMMING_USER;
mbed_official 237:f3da66175598 689 hopamp2->Init.UserTrimming = OPAMP_TRIMMING_USER;
mbed_official 237:f3da66175598 690 hopamp3->Init.UserTrimming = OPAMP_TRIMMING_USER;
mbed_official 237:f3da66175598 691 hopamp4->Init.UserTrimming = OPAMP_TRIMMING_USER;
mbed_official 237:f3da66175598 692
mbed_official 237:f3da66175598 693 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen1<<OPAMP_INPUT_INVERTING);
mbed_official 237:f3da66175598 694 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen2<<OPAMP_INPUT_INVERTING);
mbed_official 237:f3da66175598 695 MODIFY_REG(hopamp3->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen3<<OPAMP_INPUT_INVERTING);
mbed_official 237:f3da66175598 696 MODIFY_REG(hopamp4->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen4<<OPAMP_INPUT_INVERTING);
mbed_official 237:f3da66175598 697
mbed_official 237:f3da66175598 698 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep1<<OPAMP_INPUT_NONINVERTING);
mbed_official 237:f3da66175598 699 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep2<<OPAMP_INPUT_NONINVERTING);
mbed_official 237:f3da66175598 700 MODIFY_REG(hopamp3->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep3<<OPAMP_INPUT_NONINVERTING);
mbed_official 237:f3da66175598 701 MODIFY_REG(hopamp4->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep4<<OPAMP_INPUT_NONINVERTING);
mbed_official 237:f3da66175598 702
mbed_official 237:f3da66175598 703 }
mbed_official 237:f3da66175598 704
mbed_official 237:f3da66175598 705 else
mbed_official 237:f3da66175598 706 {
mbed_official 237:f3da66175598 707 /* At least one OPAMP can not be calibrated */
mbed_official 237:f3da66175598 708 status = HAL_ERROR;
mbed_official 237:f3da66175598 709 }
mbed_official 237:f3da66175598 710 }
mbed_official 237:f3da66175598 711
mbed_official 237:f3da66175598 712 return status;
mbed_official 237:f3da66175598 713 }
mbed_official 375:3d36234a1087 714 #endif /* STM32F303xE || STM32F398xx || */
mbed_official 375:3d36234a1087 715 /* STM32F303xC || STM32F358xx */
mbed_official 375:3d36234a1087 716
mbed_official 375:3d36234a1087 717 /**
mbed_official 375:3d36234a1087 718 * @}
mbed_official 375:3d36234a1087 719 */
mbed_official 237:f3da66175598 720
mbed_official 237:f3da66175598 721 /**
mbed_official 237:f3da66175598 722 * @}
mbed_official 237:f3da66175598 723 */
mbed_official 237:f3da66175598 724
mbed_official 237:f3da66175598 725 #endif /* HAL_OPAMP_MODULE_ENABLED */
mbed_official 237:f3da66175598 726 /**
mbed_official 237:f3da66175598 727 * @}
mbed_official 237:f3da66175598 728 */
mbed_official 237:f3da66175598 729
mbed_official 237:f3da66175598 730 /**
mbed_official 237:f3da66175598 731 * @}
mbed_official 237:f3da66175598 732 */
mbed_official 237:f3da66175598 733
mbed_official 237:f3da66175598 734 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/