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