stm32g4xx_hal_opamp_ex.c 43 KB

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