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