1 /**
2 ******************************************************************************
3 * @file stm32g4xx_hal_opamp_ex.c
4 * @author MCD Application Team
5 * @brief Extended OPAMP HAL module driver.
6 *
7 * This file provides firmware functions to manage the following
8 * functionalities of the operational amplifiers peripheral:
9 * + Extended Initialization and de-initialization functions
10 * + Extended Peripheral Control functions
11 *
12 @verbatim
13 ******************************************************************************
14 * @attention
15 *
16 * Copyright (c) 2019 STMicroelectronics.
17 * All rights reserved.
18 *
19 * This software is licensed under terms that can be found in the LICENSE file
20 * in the root directory of this software component.
21 * If no LICENSE file comes with this software, it is provided AS-IS.
22 *
23 ******************************************************************************
24 */
25
26 /* Includes ------------------------------------------------------------------*/
27 #include "stm32g4xx_hal.h"
28
29 /** @addtogroup STM32G4xx_HAL_Driver
30 * @{
31 */
32
33 #if defined (OPAMP1) || defined (OPAMP2) || defined (OPAMP3) || defined (OPAMP4) || defined (OPAMP5) || defined (OPAMP6)
34 #ifdef HAL_OPAMP_MODULE_ENABLED
35
36 /** @defgroup OPAMPEx OPAMPEx
37 * @brief OPAMP Extended HAL module driver
38 * @{
39 */
40
41
42 /* Private typedef -----------------------------------------------------------*/
43 /* Private define ------------------------------------------------------------*/
44 /* Private macro -------------------------------------------------------------*/
45 /* Private variables ---------------------------------------------------------*/
46 /* Private function prototypes -----------------------------------------------*/
47 /* Exported functions --------------------------------------------------------*/
48
49 /** @defgroup OPAMPEx_Exported_Functions OPAMP Extended Exported Functions
50 * @{
51 */
52
53
54 /** @defgroup OPAMPEx_Exported_Functions_Group1 Extended Input and Output operation functions
55 * @brief Extended Self calibration functions
56 *
57 @verbatim
58 ===============================================================================
59 ##### Extended IO operation functions #####
60 ===============================================================================
61 [..]
62 (+) OPAMP Self calibration.
63
64 @endverbatim
65 * @{
66 */
67
68 /**
69 * @brief Run the self calibration of up to 6 OPAMPs in parallel.
70 * @note Calibration is performed in the mode specified in OPAMP init
71 * structure (mode normal or high-speed).
72 * @param hopamp1 handle
73 * @param hopamp2 handle
74 * @param hopamp3 handle
75 * @param hopamp4 handle (1)
76 * @param hopamp5 handle (1)
77 * @param hopamp6 handle (1)
78 * (1) Parameter not present on STM32GBK1CB/STM32G411xB/STM32G411xC/STM32G431xx/STM32G441xx/STM32G471xx devices.
79 * @retval HAL status
80 * @note Updated offset trimming values (PMOS & NMOS), user trimming is enabled
81 * @note Calibration runs about 25 ms.
82 */
83
84 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
HAL_OPAMPEx_SelfCalibrateAll(OPAMP_HandleTypeDef * hopamp1,OPAMP_HandleTypeDef * hopamp2,OPAMP_HandleTypeDef * hopamp3,OPAMP_HandleTypeDef * hopamp4,OPAMP_HandleTypeDef * hopamp5,OPAMP_HandleTypeDef * hopamp6)85 HAL_StatusTypeDef HAL_OPAMPEx_SelfCalibrateAll(OPAMP_HandleTypeDef *hopamp1, OPAMP_HandleTypeDef *hopamp2,
86 OPAMP_HandleTypeDef *hopamp3, OPAMP_HandleTypeDef *hopamp4,
87 OPAMP_HandleTypeDef *hopamp5, OPAMP_HandleTypeDef *hopamp6)
88 #elif defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx)
89 HAL_StatusTypeDef HAL_OPAMPEx_SelfCalibrateAll(OPAMP_HandleTypeDef *hopamp1, OPAMP_HandleTypeDef *hopamp2,
90 OPAMP_HandleTypeDef *hopamp3)
91 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
92 HAL_StatusTypeDef HAL_OPAMPEx_SelfCalibrateAll(OPAMP_HandleTypeDef *hopamp1, OPAMP_HandleTypeDef *hopamp2,
93 OPAMP_HandleTypeDef *hopamp3, OPAMP_HandleTypeDef *hopamp6)
94 #elif defined(STM32G411xB) || defined(STM32G411xC)
95 HAL_StatusTypeDef HAL_OPAMPEx_SelfCalibrateAll(OPAMP_HandleTypeDef *hopamp1)
96 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
97 {
98 uint32_t trimmingvaluen1;
99 uint32_t trimmingvaluep1;
100 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
101 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
102 defined(STM32G491xx) || defined(STM32G4A1xx)
103 uint32_t trimmingvaluen2;
104 uint32_t trimmingvaluep2;
105 uint32_t trimmingvaluen3;
106 uint32_t trimmingvaluep3;
107 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
108 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
109 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
110 uint32_t trimmingvaluen4;
111 uint32_t trimmingvaluep4;
112 uint32_t trimmingvaluen5;
113 uint32_t trimmingvaluep5;
114 uint32_t trimmingvaluen6;
115 uint32_t trimmingvaluep6;
116 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
117 uint32_t trimmingvaluen6;
118 uint32_t trimmingvaluep6;
119 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
120
121 uint32_t delta;
122
123 if ((hopamp1 == NULL)
124 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
125 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
126 defined(STM32G491xx) || defined(STM32G4A1xx)
127 || (hopamp2 == NULL) || (hopamp3 == NULL)
128 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
129 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
130 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
131 || (hopamp4 == NULL) || (hopamp5 == NULL) || (hopamp6 == NULL)
132 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
133 || (hopamp6 == NULL)
134 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
135 )
136 {
137 return HAL_ERROR;
138 }
139 else if (hopamp1->State != HAL_OPAMP_STATE_READY)
140 {
141 return HAL_ERROR;
142 }
143 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
144 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
145 defined(STM32G491xx) || defined(STM32G4A1xx)
146 else if (hopamp2->State != HAL_OPAMP_STATE_READY)
147 {
148 return HAL_ERROR;
149 }
150 else if (hopamp3->State != HAL_OPAMP_STATE_READY)
151 {
152 return HAL_ERROR;
153 }
154 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
155 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
156 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
157 else if (hopamp4->State != HAL_OPAMP_STATE_READY)
158 {
159 return HAL_ERROR;
160 }
161 else if (hopamp5->State != HAL_OPAMP_STATE_READY)
162 {
163 return HAL_ERROR;
164 }
165 else if (hopamp6->State != HAL_OPAMP_STATE_READY)
166 {
167 return HAL_ERROR;
168 }
169 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
170 else if (hopamp6->State != HAL_OPAMP_STATE_READY)
171 {
172 return HAL_ERROR;
173 }
174 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
175 else
176 {
177
178 /* Check the parameter */
179 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp1->Instance));
180 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
181 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
182 defined(STM32G491xx) || defined(STM32G4A1xx)
183 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp2->Instance));
184 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp3->Instance));
185 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
186 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
187 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
188 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp4->Instance));
189 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp5->Instance));
190 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp6->Instance));
191 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
192 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp6->Instance));
193 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
194
195 /* Set Calibration mode */
196 /* Non-inverting input connected to calibration reference voltage. */
197 SET_BIT(hopamp1->Instance->CSR, OPAMP_CSR_FORCEVP);
198 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
199 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
200 defined(STM32G491xx) || defined(STM32G4A1xx)
201 SET_BIT(hopamp2->Instance->CSR, OPAMP_CSR_FORCEVP);
202 SET_BIT(hopamp3->Instance->CSR, OPAMP_CSR_FORCEVP);
203 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
204 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
205 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
206 SET_BIT(hopamp4->Instance->CSR, OPAMP_CSR_FORCEVP);
207 SET_BIT(hopamp5->Instance->CSR, OPAMP_CSR_FORCEVP);
208 SET_BIT(hopamp6->Instance->CSR, OPAMP_CSR_FORCEVP);
209 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
210 SET_BIT(hopamp6->Instance->CSR, OPAMP_CSR_FORCEVP);
211 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
212
213 /* user trimming values are used for offset calibration */
214 SET_BIT(hopamp1->Instance->CSR, OPAMP_CSR_USERTRIM);
215 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
216 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
217 defined(STM32G491xx) || defined(STM32G4A1xx)
218 SET_BIT(hopamp2->Instance->CSR, OPAMP_CSR_USERTRIM);
219 SET_BIT(hopamp3->Instance->CSR, OPAMP_CSR_USERTRIM);
220 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
221 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
222 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
223 SET_BIT(hopamp4->Instance->CSR, OPAMP_CSR_USERTRIM);
224 SET_BIT(hopamp5->Instance->CSR, OPAMP_CSR_USERTRIM);
225 SET_BIT(hopamp6->Instance->CSR, OPAMP_CSR_USERTRIM);
226 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
227 SET_BIT(hopamp6->Instance->CSR, OPAMP_CSR_USERTRIM);
228 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
229
230 /* Enable calibration */
231 SET_BIT(hopamp1->Instance->CSR, OPAMP_CSR_CALON);
232 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
233 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
234 defined(STM32G491xx) || defined(STM32G4A1xx)
235 SET_BIT(hopamp2->Instance->CSR, OPAMP_CSR_CALON);
236 SET_BIT(hopamp3->Instance->CSR, OPAMP_CSR_CALON);
237 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
238 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
239 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
240 SET_BIT(hopamp4->Instance->CSR, OPAMP_CSR_CALON);
241 SET_BIT(hopamp5->Instance->CSR, OPAMP_CSR_CALON);
242 SET_BIT(hopamp6->Instance->CSR, OPAMP_CSR_CALON);
243 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
244 SET_BIT(hopamp6->Instance->CSR, OPAMP_CSR_CALON);
245 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
246
247 /* 1st calibration - N */
248 /* Select 90% VREF */
249 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_90VDDA);
250 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
251 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
252 defined(STM32G491xx) || defined(STM32G4A1xx)
253 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_90VDDA);
254 MODIFY_REG(hopamp3->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_90VDDA);
255 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
256 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
257 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
258 MODIFY_REG(hopamp4->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_90VDDA);
259 MODIFY_REG(hopamp5->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_90VDDA);
260 MODIFY_REG(hopamp6->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_90VDDA);
261 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
262 MODIFY_REG(hopamp6->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_90VDDA);
263 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
264
265 /* Enable the opamps */
266 SET_BIT(hopamp1->Instance->CSR, OPAMP_CSR_OPAMPxEN);
267 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
268 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
269 defined(STM32G491xx) || defined(STM32G4A1xx)
270 SET_BIT(hopamp2->Instance->CSR, OPAMP_CSR_OPAMPxEN);
271 SET_BIT(hopamp3->Instance->CSR, OPAMP_CSR_OPAMPxEN);
272 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
273 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
274 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
275 SET_BIT(hopamp4->Instance->CSR, OPAMP_CSR_OPAMPxEN);
276 SET_BIT(hopamp5->Instance->CSR, OPAMP_CSR_OPAMPxEN);
277 SET_BIT(hopamp6->Instance->CSR, OPAMP_CSR_OPAMPxEN);
278 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
279 SET_BIT(hopamp6->Instance->CSR, OPAMP_CSR_OPAMPxEN);
280 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
281
282 /* Init trimming counter */
283 /* Medium value */
284 trimmingvaluen1 = 16UL;
285 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
286 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
287 defined(STM32G491xx) || defined(STM32G4A1xx)
288 trimmingvaluen2 = 16UL;
289 trimmingvaluen3 = 16UL;
290 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
291 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
292 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
293 trimmingvaluen4 = 16UL;
294 trimmingvaluen5 = 16UL;
295 trimmingvaluen6 = 16UL;
296 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
297 trimmingvaluen6 = 16UL;
298 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
299 delta = 8UL;
300
301 while (delta != 0UL)
302 {
303 /* Set candidate trimming */
304 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen1 << OPAMP_INPUT_INVERTING);
305 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
306 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
307 defined(STM32G491xx) || defined(STM32G4A1xx)
308 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen2 << OPAMP_INPUT_INVERTING);
309 MODIFY_REG(hopamp3->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen3 << OPAMP_INPUT_INVERTING);
310 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
311 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
312 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
313 MODIFY_REG(hopamp4->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen4 << OPAMP_INPUT_INVERTING);
314 MODIFY_REG(hopamp5->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen5 << OPAMP_INPUT_INVERTING);
315 MODIFY_REG(hopamp6->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen6 << OPAMP_INPUT_INVERTING);
316 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
317 MODIFY_REG(hopamp6->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen6 << OPAMP_INPUT_INVERTING);
318 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
319
320 /* OFFTRIMmax delay 2 ms as per datasheet (electrical characteristics */
321 /* Offset trim time: during calibration, minimum time needed between */
322 /* two steps to have 1 mV accuracy */
323 HAL_Delay(2);
324
325 if ((hopamp1->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
326 {
327 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
328 trimmingvaluen1 += delta;
329 }
330 else
331 {
332 /* OPAMP_CSR_OUTCAL is LOW try lower trimming */
333 trimmingvaluen1 -= delta;
334 }
335 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
336 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
337 defined(STM32G491xx) || defined(STM32G4A1xx)
338 if ((hopamp2->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
339 {
340 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
341 trimmingvaluen2 += delta;
342 }
343 else
344 {
345 /* OPAMP_CSR_OUTCAL is LOW try lower trimming */
346 trimmingvaluen2 -= delta;
347 }
348
349 if ((hopamp3->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
350 {
351 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
352 trimmingvaluen3 += delta;
353 }
354 else
355 {
356 /* OPAMP_CSR_OUTCAL is LOW try lower trimming */
357 trimmingvaluen3 -= delta;
358 }
359
360 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
361 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
362 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
363 if ((hopamp4->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
364 {
365 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
366 trimmingvaluen4 += delta;
367 }
368 else
369 {
370 /* OPAMP_CSR_OUTCAL is LOW try lower trimming */
371 trimmingvaluen4 -= delta;
372 }
373
374 if ((hopamp5->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
375 {
376 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
377 trimmingvaluen5 += delta;
378 }
379 else
380 {
381 /* OPAMP_CSR_OUTCAL is LOW try lower trimming */
382 trimmingvaluen5 -= delta;
383 }
384
385 if ((hopamp6->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
386 {
387 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
388 trimmingvaluen6 += delta;
389 }
390 else
391 {
392 /* OPAMP_CSR_OUTCAL is LOW try lower trimming */
393 trimmingvaluen6 -= delta;
394 }
395
396 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
397 if ((hopamp6->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
398 {
399 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
400 trimmingvaluen6 += delta;
401 }
402 else
403 {
404 /* OPAMP_CSR_OUTCAL is LOW try lower trimming */
405 trimmingvaluen6 -= delta;
406 }
407 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
408
409 delta >>= 1;
410 }
411
412 /* Still need to check if righ calibration is current value or un step below */
413 /* Indeed the first value that causes the OUTCAL bit to change from 1 to 0 */
414 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen1 << OPAMP_INPUT_INVERTING);
415 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
416 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
417 defined(STM32G491xx) || defined(STM32G4A1xx)
418 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen2 << OPAMP_INPUT_INVERTING);
419 MODIFY_REG(hopamp3->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen3 << OPAMP_INPUT_INVERTING);
420 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
421 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
422 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
423 MODIFY_REG(hopamp4->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen4 << OPAMP_INPUT_INVERTING);
424 MODIFY_REG(hopamp5->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen5 << OPAMP_INPUT_INVERTING);
425 MODIFY_REG(hopamp6->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen6 << OPAMP_INPUT_INVERTING);
426 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
427 MODIFY_REG(hopamp6->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen6 << OPAMP_INPUT_INVERTING);
428 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
429
430 /* OFFTRIMmax delay 2 ms as per datasheet (electrical characteristics */
431 /* Offset trim time: during calibration, minimum time needed between */
432 /* two steps to have 1 mV accuracy */
433 HAL_Delay(2);
434
435 if ((hopamp1->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
436 {
437 /* OPAMP_CSR_OUTCAL is actually one value more */
438 trimmingvaluen1++;
439 /* Set right trimming */
440 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen1 << OPAMP_INPUT_INVERTING);
441 }
442 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
443 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
444 defined(STM32G491xx) || defined(STM32G4A1xx)
445 if ((hopamp2->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
446 {
447 /* OPAMP_CSR_OUTCAL is actually one value more */
448 trimmingvaluen2++;
449 /* Set right trimming */
450 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen2 << OPAMP_INPUT_INVERTING);
451 }
452
453 if ((hopamp3->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
454 {
455 /* OPAMP_CSR_OUTCAL is actually one value more */
456 trimmingvaluen3++;
457 /* Set right trimming */
458 MODIFY_REG(hopamp3->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen3 << OPAMP_INPUT_INVERTING);
459 }
460
461 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
462 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
463 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
464 if ((hopamp4->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
465 {
466 /* OPAMP_CSR_OUTCAL is actually one value more */
467 trimmingvaluen4++;
468 /* Set right trimming */
469 MODIFY_REG(hopamp4->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen4 << OPAMP_INPUT_INVERTING);
470 }
471
472 if ((hopamp5->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
473 {
474 /* OPAMP_CSR_OUTCAL is actually one value more */
475 trimmingvaluen5++;
476 /* Set right trimming */
477 MODIFY_REG(hopamp5->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen5 << OPAMP_INPUT_INVERTING);
478 }
479
480 if ((hopamp6->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
481 {
482 /* OPAMP_CSR_OUTCAL is actually one value more */
483 trimmingvaluen6++;
484 /* Set right trimming */
485 MODIFY_REG(hopamp6->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen6 << OPAMP_INPUT_INVERTING);
486 }
487
488 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
489 if ((hopamp6->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
490 {
491 /* OPAMP_CSR_OUTCAL is actually one value more */
492 trimmingvaluen6++;
493 /* Set right trimming */
494 MODIFY_REG(hopamp6->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen6 << OPAMP_INPUT_INVERTING);
495 }
496 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
497
498 /* 2nd calibration - P */
499 /* Select 10% VREF */
500 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_10VDDA);
501 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
502 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
503 defined(STM32G491xx) || defined(STM32G4A1xx)
504 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_10VDDA);
505 MODIFY_REG(hopamp3->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_10VDDA);
506 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
507 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
508 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
509 MODIFY_REG(hopamp4->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_10VDDA);
510 MODIFY_REG(hopamp5->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_10VDDA);
511 MODIFY_REG(hopamp6->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_10VDDA);
512 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
513 MODIFY_REG(hopamp6->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_10VDDA);
514 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
515
516 /* Init trimming counter */
517 /* Medium value */
518 trimmingvaluep1 = 16UL;
519 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
520 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
521 defined(STM32G491xx) || defined(STM32G4A1xx)
522 trimmingvaluep2 = 16UL;
523 trimmingvaluep3 = 16UL;
524 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
525 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
526 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
527 trimmingvaluep4 = 16UL;
528 trimmingvaluep5 = 16UL;
529 trimmingvaluep6 = 16UL;
530 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
531 trimmingvaluep6 = 16UL;
532 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
533
534 delta = 8UL;
535
536 while (delta != 0UL)
537 {
538 /* Set candidate trimming */
539 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep1 << OPAMP_INPUT_NONINVERTING);
540 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
541 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
542 defined(STM32G491xx) || defined(STM32G4A1xx)
543 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep2 << OPAMP_INPUT_NONINVERTING);
544 MODIFY_REG(hopamp3->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep3 << OPAMP_INPUT_NONINVERTING);
545 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
546 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
547 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
548 MODIFY_REG(hopamp4->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep4 << OPAMP_INPUT_NONINVERTING);
549 MODIFY_REG(hopamp5->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep5 << OPAMP_INPUT_NONINVERTING);
550 MODIFY_REG(hopamp6->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep6 << OPAMP_INPUT_NONINVERTING);
551 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
552 MODIFY_REG(hopamp6->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep6 << OPAMP_INPUT_NONINVERTING);
553 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
554
555 /* OFFTRIMmax delay 2 ms as per datasheet (electrical characteristics */
556 /* Offset trim time: during calibration, minimum time needed between */
557 /* two steps to have 1 mV accuracy */
558 HAL_Delay(2);
559
560 if ((hopamp1->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
561 {
562 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
563 trimmingvaluep1 += delta;
564 }
565 else
566 {
567 trimmingvaluep1 -= delta;
568 }
569
570 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
571 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
572 defined(STM32G491xx) || defined(STM32G4A1xx)
573 if ((hopamp2->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
574 {
575 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
576 trimmingvaluep2 += delta;
577 }
578 else
579 {
580 trimmingvaluep2 -= delta;
581 }
582
583 if ((hopamp3->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
584 {
585 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
586 trimmingvaluep3 += delta;
587 }
588 else
589 {
590 trimmingvaluep3 -= delta;
591 }
592
593 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
594 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
595 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
596 if ((hopamp4->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
597 {
598 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
599 trimmingvaluep4 += delta;
600 }
601 else
602 {
603 trimmingvaluep4 -= delta;
604 }
605
606 if ((hopamp5->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
607 {
608 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
609 trimmingvaluep5 += delta;
610 }
611 else
612 {
613 trimmingvaluep5 -= delta;
614 }
615
616 if ((hopamp6->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
617 {
618 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
619 trimmingvaluep6 += delta;
620 }
621 else
622 {
623 trimmingvaluep6 -= delta;
624 }
625
626 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
627 if ((hopamp6->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
628 {
629 /* OPAMP_CSR_OUTCAL is HIGH try higher trimming */
630 trimmingvaluep6 += delta;
631 }
632 else
633 {
634 trimmingvaluep6 -= delta;
635 }
636 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
637
638 delta >>= 1;
639 }
640
641 /* Still need to check if righ calibration is current value or un step below */
642 /* Indeed the first value that causes the OUTCAL bit to change from 1 to 0 */
643 /* Set candidate trimming */
644 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep1 << OPAMP_INPUT_NONINVERTING);
645 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
646 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
647 defined(STM32G491xx) || defined(STM32G4A1xx)
648 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep2 << OPAMP_INPUT_NONINVERTING);
649 MODIFY_REG(hopamp3->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep3 << OPAMP_INPUT_NONINVERTING);
650 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
651 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
652 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
653 MODIFY_REG(hopamp4->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep4 << OPAMP_INPUT_NONINVERTING);
654 MODIFY_REG(hopamp5->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep5 << OPAMP_INPUT_NONINVERTING);
655 MODIFY_REG(hopamp6->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep6 << OPAMP_INPUT_NONINVERTING);
656 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
657 MODIFY_REG(hopamp6->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep6 << OPAMP_INPUT_NONINVERTING);
658 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
659
660 /* OFFTRIMmax delay 2 ms as per datasheet (electrical characteristics */
661 /* Offset trim time: during calibration, minimum time needed between */
662 /* two steps to have 1 mV accuracy */
663 HAL_Delay(2);
664
665 if ((hopamp1->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
666 {
667 /* Trimming value is actually one value more */
668 trimmingvaluep1++;
669 /* Set right trimming */
670 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep1 << OPAMP_INPUT_NONINVERTING);
671 }
672
673 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
674 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
675 defined(STM32G491xx) || defined(STM32G4A1xx)
676 if ((hopamp2->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
677 {
678 /* Trimming value is actually one value more */
679 trimmingvaluep2++;
680 /* Set right trimming */
681 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep2 << OPAMP_INPUT_NONINVERTING);
682 }
683
684 if ((hopamp3->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
685 {
686 /* Trimming value is actually one value more */
687 trimmingvaluep3++;
688 /* Set right trimming */
689 MODIFY_REG(hopamp3->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep3 << OPAMP_INPUT_NONINVERTING);
690 }
691
692 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
693 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
694 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
695 if ((hopamp4->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
696 {
697 /* Trimming value is actually one value more */
698 trimmingvaluep4++;
699 /* Set right trimming */
700 MODIFY_REG(hopamp4->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep4 << OPAMP_INPUT_NONINVERTING);
701 }
702
703 if ((hopamp5->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
704 {
705 /* Trimming value is actually one value more */
706 trimmingvaluep5++;
707 /* Set right trimming */
708 MODIFY_REG(hopamp5->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep5 << OPAMP_INPUT_NONINVERTING);
709 }
710
711 if ((hopamp6->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
712 {
713 /* Trimming value is actually one value more */
714 trimmingvaluep6++;
715 /* Set right trimming */
716 MODIFY_REG(hopamp6->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep6 << OPAMP_INPUT_NONINVERTING);
717 }
718
719 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
720 if ((hopamp6->Instance->CSR & OPAMP_CSR_OUTCAL) != 0UL)
721 {
722 /* Trimming value is actually one value more */
723 trimmingvaluep6++;
724 /* Set right trimming */
725 MODIFY_REG(hopamp6->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep6 << OPAMP_INPUT_NONINVERTING);
726 }
727 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
728
729 /* Disable calibration */
730 CLEAR_BIT(hopamp1->Instance->CSR, OPAMP_CSR_CALON);
731 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
732 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
733 defined(STM32G491xx) || defined(STM32G4A1xx)
734 CLEAR_BIT(hopamp2->Instance->CSR, OPAMP_CSR_CALON);
735 CLEAR_BIT(hopamp3->Instance->CSR, OPAMP_CSR_CALON);
736 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
737 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
738 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
739 CLEAR_BIT(hopamp4->Instance->CSR, OPAMP_CSR_CALON);
740 CLEAR_BIT(hopamp5->Instance->CSR, OPAMP_CSR_CALON);
741 CLEAR_BIT(hopamp6->Instance->CSR, OPAMP_CSR_CALON);
742 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
743 CLEAR_BIT(hopamp6->Instance->CSR, OPAMP_CSR_CALON);
744 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
745
746 /* Disable the OPAMPs */
747 CLEAR_BIT(hopamp1->Instance->CSR, OPAMP_CSR_OPAMPxEN);
748 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
749 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
750 defined(STM32G491xx) || defined(STM32G4A1xx)
751 CLEAR_BIT(hopamp2->Instance->CSR, OPAMP_CSR_OPAMPxEN);
752 CLEAR_BIT(hopamp3->Instance->CSR, OPAMP_CSR_OPAMPxEN);
753 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
754 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
755 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
756 CLEAR_BIT(hopamp4->Instance->CSR, OPAMP_CSR_OPAMPxEN);
757 CLEAR_BIT(hopamp5->Instance->CSR, OPAMP_CSR_OPAMPxEN);
758 CLEAR_BIT(hopamp6->Instance->CSR, OPAMP_CSR_OPAMPxEN);
759 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
760 CLEAR_BIT(hopamp6->Instance->CSR, OPAMP_CSR_OPAMPxEN);
761 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
762
763 /* Set normal operating mode back */
764 CLEAR_BIT(hopamp1->Instance->CSR, OPAMP_CSR_FORCEVP);
765 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
766 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
767 defined(STM32G491xx) || defined(STM32G4A1xx)
768 CLEAR_BIT(hopamp2->Instance->CSR, OPAMP_CSR_FORCEVP);
769 CLEAR_BIT(hopamp3->Instance->CSR, OPAMP_CSR_FORCEVP);
770 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
771 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
772 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
773 CLEAR_BIT(hopamp4->Instance->CSR, OPAMP_CSR_FORCEVP);
774 CLEAR_BIT(hopamp5->Instance->CSR, OPAMP_CSR_FORCEVP);
775 CLEAR_BIT(hopamp6->Instance->CSR, OPAMP_CSR_FORCEVP);
776 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
777 CLEAR_BIT(hopamp6->Instance->CSR, OPAMP_CSR_FORCEVP);
778 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
779
780 /* Self calibration is successful */
781 /* Store calibration(user timing) results in init structure. */
782 /* Select user timing mode */
783
784 /* Write calibration result N */
785 hopamp1->Init.TrimmingValueN = trimmingvaluen1;
786 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
787 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
788 defined(STM32G491xx) || defined(STM32G4A1xx)
789 hopamp2->Init.TrimmingValueN = trimmingvaluen2;
790 hopamp3->Init.TrimmingValueN = trimmingvaluen3;
791 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
792 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
793 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
794 hopamp4->Init.TrimmingValueN = trimmingvaluen4;
795 hopamp5->Init.TrimmingValueN = trimmingvaluen5;
796 hopamp6->Init.TrimmingValueN = trimmingvaluen6;
797 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
798 hopamp6->Init.TrimmingValueN = trimmingvaluen6;
799 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
800
801 /* Write calibration result P */
802 hopamp1->Init.TrimmingValueP = trimmingvaluep1;
803 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
804 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
805 defined(STM32G491xx) || defined(STM32G4A1xx)
806 hopamp2->Init.TrimmingValueP = trimmingvaluep2;
807 hopamp3->Init.TrimmingValueP = trimmingvaluep3;
808 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
809 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
810 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
811 hopamp4->Init.TrimmingValueP = trimmingvaluep4;
812 hopamp5->Init.TrimmingValueP = trimmingvaluep5;
813 hopamp6->Init.TrimmingValueP = trimmingvaluep6;
814 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
815 hopamp6->Init.TrimmingValueP = trimmingvaluep6;
816 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
817
818 /* Select user timing mode */
819 /* And updated with calibrated settings */
820 hopamp1->Init.UserTrimming = OPAMP_TRIMMING_USER;
821 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
822 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
823 defined(STM32G491xx) || defined(STM32G4A1xx)
824 hopamp2->Init.UserTrimming = OPAMP_TRIMMING_USER;
825 hopamp3->Init.UserTrimming = OPAMP_TRIMMING_USER;
826 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
827 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
828 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
829 hopamp4->Init.UserTrimming = OPAMP_TRIMMING_USER;
830 hopamp5->Init.UserTrimming = OPAMP_TRIMMING_USER;
831 hopamp6->Init.UserTrimming = OPAMP_TRIMMING_USER;
832 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
833 hopamp6->Init.UserTrimming = OPAMP_TRIMMING_USER;
834 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
835
836 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen1 << OPAMP_INPUT_INVERTING);
837 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
838 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
839 defined(STM32G491xx) || defined(STM32G4A1xx)
840 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen2 << OPAMP_INPUT_INVERTING);
841 MODIFY_REG(hopamp3->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen3 << OPAMP_INPUT_INVERTING);
842 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
843 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
844 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
845 MODIFY_REG(hopamp4->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen4 << OPAMP_INPUT_INVERTING);
846 MODIFY_REG(hopamp5->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen5 << OPAMP_INPUT_INVERTING);
847 MODIFY_REG(hopamp6->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen6 << OPAMP_INPUT_INVERTING);
848 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
849 MODIFY_REG(hopamp6->Instance->CSR, OPAMP_CSR_TRIMOFFSETN, trimmingvaluen6 << OPAMP_INPUT_INVERTING);
850 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
851
852 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep1 << OPAMP_INPUT_NONINVERTING);
853 #if defined(STM32GBK1CB) || defined(STM32G431xx) || defined(STM32G441xx) || defined(STM32G471xx) || \
854 defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx) || \
855 defined(STM32G491xx) || defined(STM32G4A1xx)
856 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep2 << OPAMP_INPUT_NONINVERTING);
857 MODIFY_REG(hopamp3->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep3 << OPAMP_INPUT_NONINVERTING);
858 #endif /* STM32GBK1CB || STM32G431xx || STM32G441xx || STM32G471xx || STM32G473xx || STM32G474xx || \
859 STM32G483xx || STM32G484xx || STM32G491xx || STM32G4A1xx */
860 #if defined(STM32G473xx) || defined(STM32G474xx) || defined(STM32G483xx) || defined(STM32G484xx)
861 MODIFY_REG(hopamp4->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep4 << OPAMP_INPUT_NONINVERTING);
862 MODIFY_REG(hopamp5->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep5 << OPAMP_INPUT_NONINVERTING);
863 MODIFY_REG(hopamp6->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep6 << OPAMP_INPUT_NONINVERTING);
864 #elif defined(STM32G491xx) || defined(STM32G4A1xx)
865 MODIFY_REG(hopamp6->Instance->CSR, OPAMP_CSR_TRIMOFFSETP, trimmingvaluep6 << OPAMP_INPUT_NONINVERTING);
866 #endif /* STM32G473xx || STM32G474xx || STM32G483xx || STM32G484xx */
867
868 }
869
870 return HAL_OK;
871 }
872
873 /**
874 * @}
875 */
876
877 /**
878 * @}
879 */
880
881 /**
882 * @}
883 */
884
885 #endif /* HAL_OPAMP_MODULE_ENABLED */
886 #endif /* OPAMP1 || OPAMP2 || OPAMP3 || OPAMP4 || OPAMP5 || OPAMP6 */
887
888 /**
889 * @}
890 */
891
892