File indexing completed on 2025-05-11 08:23:08
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 #include "stm32h7xx_hal.h"
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038 #ifdef HAL_OPAMP_MODULE_ENABLED
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080 HAL_StatusTypeDef HAL_OPAMPEx_SelfCalibrateAll(OPAMP_HandleTypeDef *hopamp1, OPAMP_HandleTypeDef *hopamp2)
0081 {
0082 HAL_StatusTypeDef status = HAL_OK;
0083
0084 uint32_t trimmingvaluen1;
0085 uint32_t trimmingvaluep1;
0086 uint32_t trimmingvaluen2;
0087 uint32_t trimmingvaluep2;
0088
0089
0090 __IO uint32_t* tmp_opamp1_reg_trimming;
0091 __IO uint32_t* tmp_opamp2_reg_trimming;
0092
0093 uint32_t delta;
0094 uint32_t opampmode1;
0095 uint32_t opampmode2;
0096
0097 if((hopamp1 == NULL) || (hopamp2 == NULL))
0098 {
0099 status = HAL_ERROR;
0100 }
0101
0102 else if(hopamp1->State != HAL_OPAMP_STATE_READY)
0103 {
0104 status = HAL_ERROR;
0105 }
0106 else if(hopamp2->State != HAL_OPAMP_STATE_READY)
0107 {
0108 status = HAL_ERROR;
0109 }
0110 else
0111 {
0112
0113 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp1->Instance));
0114 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp2->Instance));
0115
0116 assert_param(IS_OPAMP_POWERMODE(hopamp1->Init.PowerMode));
0117 assert_param(IS_OPAMP_POWERMODE(hopamp2->Init.PowerMode));
0118
0119
0120
0121 SET_BIT(hopamp1->Instance->CSR, OPAMP_CSR_FORCEVP);
0122 SET_BIT(hopamp2->Instance->CSR, OPAMP_CSR_FORCEVP);
0123
0124
0125 opampmode1 = READ_BIT(hopamp1->Instance->CSR,OPAMP_CSR_VMSEL);
0126 opampmode2 = READ_BIT(hopamp2->Instance->CSR,OPAMP_CSR_VMSEL);
0127
0128
0129 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_VMSEL, OPAMP_STANDALONE_MODE);
0130 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_VMSEL, OPAMP_STANDALONE_MODE);
0131
0132
0133 SET_BIT(hopamp1->Instance->CSR, OPAMP_CSR_USERTRIM);
0134 SET_BIT(hopamp2->Instance->CSR, OPAMP_CSR_USERTRIM);
0135
0136
0137 if (hopamp1->Init.PowerMode == OPAMP_POWERMODE_NORMAL)
0138 {
0139 tmp_opamp1_reg_trimming = &OPAMP1->OTR;
0140 }
0141 else
0142 {
0143 tmp_opamp1_reg_trimming = &OPAMP1->HSOTR;
0144 }
0145
0146 if (hopamp2->Init.PowerMode == OPAMP_POWERMODE_NORMAL)
0147 {
0148 tmp_opamp2_reg_trimming = &OPAMP2->OTR;
0149 }
0150 else
0151 {
0152 tmp_opamp2_reg_trimming = &OPAMP2->HSOTR;
0153 }
0154
0155
0156 SET_BIT (hopamp1->Instance->CSR, OPAMP_CSR_CALON);
0157 SET_BIT (hopamp2->Instance->CSR, OPAMP_CSR_CALON);
0158
0159
0160
0161 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_90VDDA);
0162 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_90VDDA);
0163
0164
0165 SET_BIT (hopamp1->Instance->CSR, OPAMP_CSR_OPAMPxEN);
0166 SET_BIT (hopamp2->Instance->CSR, OPAMP_CSR_OPAMPxEN);
0167
0168
0169
0170 trimmingvaluen1 = 16U;
0171 trimmingvaluen2 = 16U;
0172 delta = 8U;
0173
0174 while (delta != 0U)
0175 {
0176
0177
0178 MODIFY_REG(*tmp_opamp1_reg_trimming, OPAMP_OTR_TRIMOFFSETN, trimmingvaluen1);
0179 MODIFY_REG(*tmp_opamp2_reg_trimming, OPAMP_OTR_TRIMOFFSETN, trimmingvaluen2);
0180
0181
0182
0183
0184 HAL_Delay(OPAMP_TRIMMING_DELAY);
0185
0186 if (READ_BIT(hopamp1->Instance->CSR, OPAMP_CSR_CALOUT)!= 0U)
0187 {
0188
0189 trimmingvaluen1 += delta;
0190 }
0191 else
0192 {
0193
0194 trimmingvaluen1 -= delta;
0195 }
0196
0197 if (READ_BIT(hopamp2->Instance->CSR, OPAMP_CSR_CALOUT)!= 0U)
0198 {
0199
0200 trimmingvaluen2 += delta;
0201 }
0202 else
0203 {
0204
0205 trimmingvaluen2 -= delta;
0206 }
0207
0208 delta >>= 1U;
0209 }
0210
0211
0212
0213
0214 MODIFY_REG(*tmp_opamp1_reg_trimming, OPAMP_OTR_TRIMOFFSETN, trimmingvaluen1);
0215 MODIFY_REG(*tmp_opamp2_reg_trimming, OPAMP_OTR_TRIMOFFSETN, trimmingvaluen2);
0216
0217
0218
0219
0220 HAL_Delay(OPAMP_TRIMMING_DELAY);
0221
0222 if ((READ_BIT(hopamp1->Instance->CSR, OPAMP_CSR_CALOUT)) != 0U)
0223 {
0224
0225 trimmingvaluen1++;
0226 MODIFY_REG(*tmp_opamp1_reg_trimming, OPAMP_OTR_TRIMOFFSETN, trimmingvaluen1);
0227 }
0228
0229 if ((READ_BIT(hopamp2->Instance->CSR, OPAMP_CSR_CALOUT)) != 0U)
0230 {
0231
0232 trimmingvaluen2++;
0233 MODIFY_REG(*tmp_opamp2_reg_trimming, OPAMP_OTR_TRIMOFFSETN, trimmingvaluen2);
0234 }
0235
0236
0237
0238 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_10VDDA);
0239 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_CALSEL, OPAMP_VREF_10VDDA);
0240
0241
0242
0243 trimmingvaluep1 = 16U;
0244 trimmingvaluep2 = 16U;
0245 delta = 8U;
0246
0247 while (delta != 0U)
0248 {
0249
0250
0251 MODIFY_REG(*tmp_opamp1_reg_trimming, OPAMP_OTR_TRIMOFFSETP, (trimmingvaluep1<<OPAMP_INPUT_NONINVERTING));
0252 MODIFY_REG(*tmp_opamp2_reg_trimming, OPAMP_OTR_TRIMOFFSETP, (trimmingvaluep2<<OPAMP_INPUT_NONINVERTING));
0253
0254
0255
0256
0257 HAL_Delay(OPAMP_TRIMMING_DELAY);
0258
0259 if (READ_BIT(hopamp1->Instance->CSR, OPAMP_CSR_CALOUT)!= 0U)
0260 {
0261
0262 trimmingvaluep1 += delta;
0263 }
0264 else
0265 {
0266
0267 trimmingvaluep1 -= delta;
0268 }
0269
0270 if (READ_BIT(hopamp2->Instance->CSR, OPAMP_CSR_CALOUT)!= 0U)
0271 {
0272
0273 trimmingvaluep2 += delta;
0274 }
0275 else
0276 {
0277
0278 trimmingvaluep2 -= delta;
0279 }
0280
0281 delta >>= 1U;
0282 }
0283
0284
0285
0286
0287 MODIFY_REG(*tmp_opamp1_reg_trimming, OPAMP_OTR_TRIMOFFSETP, (trimmingvaluep1<<OPAMP_INPUT_NONINVERTING));
0288 MODIFY_REG(*tmp_opamp2_reg_trimming, OPAMP_OTR_TRIMOFFSETP, (trimmingvaluep2<<OPAMP_INPUT_NONINVERTING));
0289
0290
0291
0292
0293 HAL_Delay(OPAMP_TRIMMING_DELAY);
0294
0295 if (READ_BIT(hopamp1->Instance->CSR, OPAMP_CSR_CALOUT)!= 0U)
0296 {
0297
0298 trimmingvaluep1++;
0299 MODIFY_REG(*tmp_opamp1_reg_trimming, OPAMP_OTR_TRIMOFFSETP, (trimmingvaluep1<<OPAMP_INPUT_NONINVERTING));
0300 }
0301
0302 if (READ_BIT(hopamp2->Instance->CSR, OPAMP_CSR_CALOUT)!= 0U)
0303 {
0304
0305 trimmingvaluep2++;
0306 MODIFY_REG(*tmp_opamp2_reg_trimming, OPAMP_OTR_TRIMOFFSETP, (trimmingvaluep2<<OPAMP_INPUT_NONINVERTING));
0307 }
0308
0309
0310 CLEAR_BIT (hopamp1->Instance->CSR, OPAMP_CSR_CALON);
0311 CLEAR_BIT (hopamp2->Instance->CSR, OPAMP_CSR_CALON);
0312
0313
0314 CLEAR_BIT (hopamp1->Instance->CSR, OPAMP_CSR_OPAMPxEN);
0315 CLEAR_BIT (hopamp2->Instance->CSR, OPAMP_CSR_OPAMPxEN);
0316
0317
0318
0319
0320
0321 hopamp1->Init.UserTrimming = OPAMP_TRIMMING_USER;
0322 hopamp2->Init.UserTrimming = OPAMP_TRIMMING_USER;
0323
0324
0325 if (hopamp1->Init.PowerMode != OPAMP_POWERMODE_HIGHSPEED)
0326 {
0327
0328 hopamp1->Init.TrimmingValueN = trimmingvaluen1;
0329
0330 hopamp1->Init.TrimmingValueP = trimmingvaluep1;
0331 }
0332 else
0333 {
0334
0335 hopamp1->Init.TrimmingValueNHighSpeed = trimmingvaluen1;
0336
0337 hopamp1->Init.TrimmingValuePHighSpeed = trimmingvaluep1;
0338 }
0339
0340 if (hopamp2->Init.PowerMode != OPAMP_POWERMODE_HIGHSPEED)
0341 {
0342
0343 hopamp2->Init.TrimmingValueN = trimmingvaluen2;
0344
0345 hopamp2->Init.TrimmingValueP = trimmingvaluep2;
0346 }
0347 else
0348 {
0349
0350 hopamp2->Init.TrimmingValueNHighSpeed = trimmingvaluen2;
0351
0352 hopamp2->Init.TrimmingValuePHighSpeed = trimmingvaluep2;
0353
0354 }
0355
0356 hopamp1->State = HAL_OPAMP_STATE_READY;
0357 hopamp2->State = HAL_OPAMP_STATE_READY;
0358
0359
0360 MODIFY_REG(hopamp1->Instance->CSR, OPAMP_CSR_VMSEL, opampmode1);
0361 MODIFY_REG(hopamp2->Instance->CSR, OPAMP_CSR_VMSEL, opampmode2);
0362 }
0363
0364 return status;
0365 }
0366
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379
0380
0381
0382
0383
0384
0385
0386
0387
0388
0389
0390
0391
0392 HAL_StatusTypeDef HAL_OPAMPEx_Unlock(OPAMP_HandleTypeDef* hopamp)
0393 {
0394 HAL_StatusTypeDef status = HAL_OK;
0395
0396
0397
0398 if(hopamp == NULL)
0399 {
0400 status = HAL_ERROR;
0401 }
0402
0403
0404 else if(hopamp->State == HAL_OPAMP_STATE_BUSYLOCKED)
0405 {
0406
0407 assert_param(IS_OPAMP_ALL_INSTANCE(hopamp->Instance));
0408
0409
0410 hopamp->State = HAL_OPAMP_STATE_BUSY;
0411 }
0412 else
0413 {
0414 status = HAL_ERROR;
0415 }
0416
0417 return status;
0418 }
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432
0433
0434
0435
0436 #endif
0437