STM32L4xx_HAL_Driver  1.14.0
stm32l4xx_hal_opamp.c
Go to the documentation of this file.
1 
209 /* Includes ------------------------------------------------------------------*/
210 #include "stm32l4xx_hal.h"
211 
221 #ifdef HAL_OPAMP_MODULE_ENABLED
222 
223 /* Private types -------------------------------------------------------------*/
224 /* Private variables ---------------------------------------------------------*/
225 /* Private constants ---------------------------------------------------------*/
230 /* CSR register reset value */
231 #define OPAMP_CSR_RESET_VALUE ((uint32_t)0x00000000)
232 
233 #define OPAMP_CSR_RESET_BITS (OPAMP_CSR_OPAMPxEN | OPAMP_CSR_OPALPM | OPAMP_CSR_OPAMODE \
234  | OPAMP_CSR_PGGAIN | OPAMP_CSR_VMSEL | OPAMP_CSR_VPSEL \
235  | OPAMP_CSR_CALON | OPAMP_CSR_USERTRIM)
236 
237 /* CSR Init masks */
238 #define OPAMP_CSR_INIT_MASK_PGA (OPAMP_CSR_OPALPM | OPAMP_CSR_OPAMODE| OPAMP_CSR_PGGAIN \
239  | OPAMP_CSR_VMSEL | OPAMP_CSR_VPSEL | OPAMP_CSR_USERTRIM)
240 
241 #define OPAMP_CSR_INIT_MASK_FOLLOWER (OPAMP_CSR_OPALPM | OPAMP_CSR_OPAMODE| OPAMP_CSR_VPSEL \
242  | OPAMP_CSR_USERTRIM)
243 
244 #define OPAMP_CSR_INIT_MASK_STANDALONE (OPAMP_CSR_OPALPM | OPAMP_CSR_OPAMODE| OPAMP_CSR_VPSEL \
245  | OPAMP_CSR_VMSEL | OPAMP_CSR_USERTRIM)
246 
247 
252 /* Private macros ------------------------------------------------------------*/
253 /* Private functions ---------------------------------------------------------*/
254 /* Exported functions --------------------------------------------------------*/
255 
280 HAL_StatusTypeDef HAL_OPAMP_Init(OPAMP_HandleTypeDef *hopamp)
281 {
282  HAL_StatusTypeDef status = HAL_OK;
283  uint32_t updateotrlpotr;
284 
285  /* Check the OPAMP handle allocation and lock status */
286  /* Init not allowed if calibration is ongoing */
287  if(hopamp == NULL)
288  {
289  return HAL_ERROR;
290  }
291  else if(hopamp->State == HAL_OPAMP_STATE_BUSYLOCKED)
292  {
293  return HAL_ERROR;
294  }
295  else if(hopamp->State == HAL_OPAMP_STATE_CALIBBUSY)
296  {
297  return HAL_ERROR;
298  }
299  else
300  {
301  /* Check the parameter */
302  assert_param(IS_OPAMP_ALL_INSTANCE(hopamp->Instance));
303 
304  /* Set OPAMP parameters */
305  assert_param(IS_OPAMP_POWER_SUPPLY_RANGE(hopamp->Init.PowerSupplyRange));
306  assert_param(IS_OPAMP_POWERMODE(hopamp->Init.PowerMode));
307  assert_param(IS_OPAMP_FUNCTIONAL_NORMALMODE(hopamp->Init.Mode));
308  assert_param(IS_OPAMP_NONINVERTING_INPUT(hopamp->Init.NonInvertingInput));
309 
310  if(hopamp->State == HAL_OPAMP_STATE_RESET)
311  {
312 #if (USE_HAL_OPAMP_REGISTER_CALLBACKS == 1)
313  if(hopamp->MspInitCallback == NULL)
314  {
315  hopamp->MspInitCallback = HAL_OPAMP_MspInit;
316  }
317 #endif /* USE_HAL_OPAMP_REGISTER_CALLBACKS */
318  }
319 
320  if ((hopamp->Init.Mode) == OPAMP_STANDALONE_MODE)
321  {
322  assert_param(IS_OPAMP_INVERTING_INPUT_STANDALONE(hopamp->Init.InvertingInput));
323  }
324 
325  if ((hopamp->Init.Mode) == OPAMP_PGA_MODE)
326  {
327  assert_param(IS_OPAMP_INVERTING_INPUT_PGA(hopamp->Init.InvertingInput));
328  }
329 
330  if ((hopamp->Init.Mode) == OPAMP_PGA_MODE)
331  {
332  assert_param(IS_OPAMP_PGA_GAIN(hopamp->Init.PgaGain));
333  }
334 
335  assert_param(IS_OPAMP_TRIMMING(hopamp->Init.UserTrimming));
336  if ((hopamp->Init.UserTrimming) == OPAMP_TRIMMING_USER)
337  {
338  if (hopamp->Init.PowerMode == OPAMP_POWERMODE_NORMAL)
339  {
340  assert_param(IS_OPAMP_TRIMMINGVALUE(hopamp->Init.TrimmingValueP));
341  assert_param(IS_OPAMP_TRIMMINGVALUE(hopamp->Init.TrimmingValueN));
342  }
343  else
344  {
345  assert_param(IS_OPAMP_TRIMMINGVALUE(hopamp->Init.TrimmingValuePLowPower));
346  assert_param(IS_OPAMP_TRIMMINGVALUE(hopamp->Init.TrimmingValueNLowPower));
347  }
348  }
349 
350  if(hopamp->State == HAL_OPAMP_STATE_RESET)
351  {
352  /* Allocate lock resource and initialize it */
353  hopamp->Lock = HAL_UNLOCKED;
354  }
355 
356 #if (USE_HAL_OPAMP_REGISTER_CALLBACKS == 1)
357  hopamp->MspInitCallback(hopamp);
358 #else
359  /* Call MSP init function */
360  HAL_OPAMP_MspInit(hopamp);
361 #endif /* USE_HAL_OPAMP_REGISTER_CALLBACKS */
362 
363  /* Set operating mode */
364  CLEAR_BIT(hopamp->Instance->CSR, OPAMP_CSR_CALON);
365 
366  if (hopamp->Init.Mode == OPAMP_PGA_MODE)
367  {
368  MODIFY_REG(hopamp->Instance->CSR, OPAMP_CSR_INIT_MASK_PGA, \
369  hopamp->Init.PowerMode | \
370  hopamp->Init.Mode | \
371  hopamp->Init.PgaGain | \
372  hopamp->Init.InvertingInput | \
373  hopamp->Init.NonInvertingInput | \
374  hopamp->Init.UserTrimming);
375  }
376 
377  if (hopamp->Init.Mode == OPAMP_FOLLOWER_MODE)
378  {
379  /* In Follower mode InvertingInput is Not Applicable */
380  MODIFY_REG(hopamp->Instance->CSR, OPAMP_CSR_INIT_MASK_FOLLOWER, \
381  hopamp->Init.PowerMode | \
382  hopamp->Init.Mode | \
383  hopamp->Init.NonInvertingInput | \
384  hopamp->Init.UserTrimming);
385  }
386 
387  if (hopamp->Init.Mode == OPAMP_STANDALONE_MODE)
388  {
389  MODIFY_REG(hopamp->Instance->CSR, OPAMP_CSR_INIT_MASK_STANDALONE, \
390  hopamp->Init.PowerMode | \
391  hopamp->Init.Mode | \
392  hopamp->Init.InvertingInput | \
393  hopamp->Init.NonInvertingInput | \
394  hopamp->Init.UserTrimming);
395  }
396 
397  if (hopamp->Init.UserTrimming == OPAMP_TRIMMING_USER)
398  {
399  /* Set power mode and associated calibration parameters */
400  if (hopamp->Init.PowerMode != OPAMP_POWERMODE_LOWPOWER)
401  {
402  /* OPAMP_POWERMODE_NORMAL */
403  /* Set calibration mode (factory or user) and values for */
404  /* transistors differential pair high (PMOS) and low (NMOS) for */
405  /* normal mode. */
406  updateotrlpotr = (((hopamp->Init.TrimmingValueP) << (OPAMP_INPUT_NONINVERTING)) \
407  | (hopamp->Init.TrimmingValueN));
408  MODIFY_REG(hopamp->Instance->OTR, OPAMP_OTR_TRIMOFFSETN | OPAMP_OTR_TRIMOFFSETP, updateotrlpotr);
409  }
410  else
411  {
412  /* OPAMP_POWERMODE_LOWPOWER */
413  /* transistors differential pair high (PMOS) and low (NMOS) for */
414  /* low power mode. */
415  updateotrlpotr = (((hopamp->Init.TrimmingValuePLowPower) << (OPAMP_INPUT_NONINVERTING)) \
416  | (hopamp->Init.TrimmingValueNLowPower));
417  MODIFY_REG(hopamp->Instance->LPOTR, OPAMP_OTR_TRIMOFFSETN | OPAMP_OTR_TRIMOFFSETP, updateotrlpotr);
418  }
419  }
420 
421  /* Configure the power supply range */
422  /* The OPAMP_CSR_OPARANGE is common configuration for all OPAMPs */
423  /* bit OPAMP1_CSR_OPARANGE is used for both OPAMPs */
424  MODIFY_REG(OPAMP1->CSR, OPAMP1_CSR_OPARANGE, hopamp->Init.PowerSupplyRange);
425 
426  /* Update the OPAMP state*/
427  if (hopamp->State == HAL_OPAMP_STATE_RESET)
428  {
429  /* From RESET state to READY State */
430  hopamp->State = HAL_OPAMP_STATE_READY;
431  }
432  /* else: remain in READY or BUSY state (no update) */
433  return status;
434  }
435 }
436 
444 HAL_StatusTypeDef HAL_OPAMP_DeInit(OPAMP_HandleTypeDef *hopamp)
445 {
446  HAL_StatusTypeDef status = HAL_OK;
447 
448  /* Check the OPAMP handle allocation */
449  /* DeInit not allowed if calibration is ongoing */
450  if(hopamp == NULL)
451  {
452  status = HAL_ERROR;
453  }
454  else if(hopamp->State == HAL_OPAMP_STATE_CALIBBUSY)
455  {
456  status = HAL_ERROR;
457  }
458  else
459  {
460  /* Check the parameter */
461  assert_param(IS_OPAMP_ALL_INSTANCE(hopamp->Instance));
462 
463  /* Set OPAMP_CSR register to reset value */
464  /* Mind that OPAMP1_CSR_OPARANGE of CSR of OPAMP1 remains unchanged (applies to both OPAMPs) */
465  /* OPAMP shall be disabled first separately */
466  CLEAR_BIT(hopamp->Instance->CSR, OPAMP_CSR_OPAMPxEN);
467  MODIFY_REG(hopamp->Instance->CSR, OPAMP_CSR_RESET_BITS, OPAMP_CSR_RESET_VALUE);
468 
469 #if (USE_HAL_OPAMP_REGISTER_CALLBACKS == 1)
470  if(hopamp->MspDeInitCallback == NULL)
471  {
472  hopamp->MspDeInitCallback = HAL_OPAMP_MspDeInit;
473  }
474  /* DeInit the low level hardware */
475  hopamp->MspDeInitCallback(hopamp);
476 #else
477  /* DeInit the low level hardware: GPIO, CLOCK and NVIC */
478  HAL_OPAMP_MspDeInit(hopamp);
479 #endif /* USE_HAL_OPAMP_REGISTER_CALLBACKS */
480  /* Update the OPAMP state*/
481  hopamp->State = HAL_OPAMP_STATE_RESET;
482 
483  /* Process unlocked */
484  __HAL_UNLOCK(hopamp);
485  }
486  return status;
487 }
488 
495 {
496  /* Prevent unused argument(s) compilation warning */
497  UNUSED(hopamp);
498 
499  /* NOTE : This function should not be modified, when the callback is needed,
500  the function "HAL_OPAMP_MspInit()" must be implemented in the user file.
501  */
502 }
503 
510 {
511  /* Prevent unused argument(s) compilation warning */
512  UNUSED(hopamp);
513 
514  /* NOTE : This function should not be modified, when the callback is needed,
515  the function "HAL_OPAMP_MspDeInit()" must be implemented in the user file.
516  */
517 }
518 
545 HAL_StatusTypeDef HAL_OPAMP_Start(OPAMP_HandleTypeDef *hopamp)
546 {
547  HAL_StatusTypeDef status = HAL_OK;
548 
549  /* Check the OPAMP handle allocation */
550  /* Check if OPAMP locked */
551  if(hopamp == NULL)
552  {
553  status = HAL_ERROR;
554  }
555  else if(hopamp->State == HAL_OPAMP_STATE_BUSYLOCKED)
556  {
557  status = HAL_ERROR;
558  }
559  else
560  {
561  /* Check the parameter */
562  assert_param(IS_OPAMP_ALL_INSTANCE(hopamp->Instance));
563 
564  if(hopamp->State == HAL_OPAMP_STATE_READY)
565  {
566  /* Enable the selected opamp */
567  SET_BIT (hopamp->Instance->CSR, OPAMP_CSR_OPAMPxEN);
568 
569  /* Update the OPAMP state*/
570  /* From HAL_OPAMP_STATE_READY to HAL_OPAMP_STATE_BUSY */
571  hopamp->State = HAL_OPAMP_STATE_BUSY;
572  }
573  else
574  {
575  status = HAL_ERROR;
576  }
577 
578  }
579  return status;
580 }
581 
587 HAL_StatusTypeDef HAL_OPAMP_Stop(OPAMP_HandleTypeDef *hopamp)
588 {
589  HAL_StatusTypeDef status = HAL_OK;
590 
591  /* Check the OPAMP handle allocation */
592  /* Check if OPAMP locked */
593  /* Check if OPAMP calibration ongoing */
594  if(hopamp == NULL)
595  {
596  status = HAL_ERROR;
597  }
598  else if(hopamp->State == HAL_OPAMP_STATE_BUSYLOCKED)
599  {
600  status = HAL_ERROR;
601  }
602  else if(hopamp->State == HAL_OPAMP_STATE_CALIBBUSY)
603  {
604  status = HAL_ERROR;
605  }
606  else
607  {
608  /* Check the parameter */
609  assert_param(IS_OPAMP_ALL_INSTANCE(hopamp->Instance));
610 
611  if(hopamp->State == HAL_OPAMP_STATE_BUSY)
612  {
613  /* Disable the selected opamp */
614  CLEAR_BIT (hopamp->Instance->CSR, OPAMP_CSR_OPAMPxEN);
615 
616  /* Update the OPAMP state*/
617  /* From HAL_OPAMP_STATE_BUSY to HAL_OPAMP_STATE_READY*/
618  hopamp->State = HAL_OPAMP_STATE_READY;
619  }
620  else
621  {
622  status = HAL_ERROR;
623  }
624  }
625  return status;
626 }
627 
642 {
643 
644  HAL_StatusTypeDef status = HAL_OK;
645 
646  uint32_t trimmingvaluen;
647  uint32_t trimmingvaluep;
648  uint32_t delta;
649  uint32_t opampmode;
650 
651  __IO uint32_t* tmp_opamp_reg_trimming; /* Selection of register of trimming depending on power mode: OTR or LPOTR */
652 
653  /* Check the OPAMP handle allocation */
654  /* Check if OPAMP locked */
655  if(hopamp == NULL)
656  {
657  status = HAL_ERROR;
658  }
659  else if(hopamp->State == HAL_OPAMP_STATE_BUSYLOCKED)
660  {
661  status = HAL_ERROR;
662  }
663  else
664  {
665  /* Check if OPAMP in calibration mode and calibration not yet enable */
666  if(hopamp->State == HAL_OPAMP_STATE_READY)
667  {
668  /* Check the parameter */
669  assert_param(IS_OPAMP_ALL_INSTANCE(hopamp->Instance));
670  assert_param(IS_OPAMP_POWERMODE(hopamp->Init.PowerMode));
671 
672  /* Save OPAMP mode as in */
673  /* STM32L471xx STM32L475xx STM32L476xx STM32L485xx STM32L486xx */
674  /* the calibration is not working in PGA mode */
675  opampmode = READ_BIT(hopamp->Instance->CSR,OPAMP_CSR_OPAMODE);
676 
677  /* Use of standalone mode */
678  MODIFY_REG(hopamp->Instance->CSR, OPAMP_CSR_OPAMODE, OPAMP_STANDALONE_MODE);
679 
680  /* user trimming values are used for offset calibration */
681  SET_BIT(hopamp->Instance->CSR, OPAMP_CSR_USERTRIM);
682 
683  /* Select trimming settings depending on power mode */
684  if (hopamp->Init.PowerMode == OPAMP_POWERMODE_NORMAL)
685  {
686  tmp_opamp_reg_trimming = &hopamp->Instance->OTR;
687  }
688  else
689  {
690  tmp_opamp_reg_trimming = &hopamp->Instance->LPOTR;
691  }
692 
693  /* Enable calibration */
694  SET_BIT (hopamp->Instance->CSR, OPAMP_CSR_CALON);
695 
696  /* 1st calibration - N */
697  CLEAR_BIT (hopamp->Instance->CSR, OPAMP_CSR_CALSEL);
698 
699  /* Enable the selected opamp */
700  SET_BIT (hopamp->Instance->CSR, OPAMP_CSR_OPAMPxEN);
701 
702  /* Init trimming counter */
703  /* Medium value */
704  trimmingvaluen = 16U;
705  delta = 8U;
706 
707  while (delta != 0U)
708  {
709  /* Set candidate trimming */
710  /* OPAMP_POWERMODE_NORMAL */
711  MODIFY_REG(*tmp_opamp_reg_trimming, OPAMP_OTR_TRIMOFFSETN, trimmingvaluen);
712 
713  /* OFFTRIMmax delay 1 ms as per datasheet (electrical characteristics */
714  /* Offset trim time: during calibration, minimum time needed between */
715  /* two steps to have 1 mV accuracy */
716  HAL_Delay(OPAMP_TRIMMING_DELAY);
717 
718  if (READ_BIT(hopamp->Instance->CSR, OPAMP_CSR_CALOUT) != 0U)
719  {
720  /* OPAMP_CSR_CALOUT is HIGH try higher trimming */
721  trimmingvaluen -= delta;
722  }
723  else
724  {
725  /* OPAMP_CSR_CALOUT is LOW try lower trimming */
726  trimmingvaluen += delta;
727  }
728  /* Divide range by 2 to continue dichotomy sweep */
729  delta >>= 1U;
730  }
731 
732  /* Still need to check if right calibration is current value or one step below */
733  /* Indeed the first value that causes the OUTCAL bit to change from 0 to 1 */
734  /* Set candidate trimming */
735  MODIFY_REG(*tmp_opamp_reg_trimming, OPAMP_OTR_TRIMOFFSETN, trimmingvaluen);
736 
737  /* OFFTRIMmax delay 1 ms as per datasheet (electrical characteristics */
738  /* Offset trim time: during calibration, minimum time needed between */
739  /* two steps to have 1 mV accuracy */
740  HAL_Delay(OPAMP_TRIMMING_DELAY);
741 
742  if ((READ_BIT(hopamp->Instance->CSR, OPAMP_CSR_CALOUT)) == 0U)
743  {
744  /* Trimming value is actually one value more */
745  trimmingvaluen++;
746  /* Set right trimming */
747  MODIFY_REG(*tmp_opamp_reg_trimming, OPAMP_OTR_TRIMOFFSETN, trimmingvaluen);
748  }
749 
750  /* 2nd calibration - P */
751  SET_BIT (hopamp->Instance->CSR, OPAMP_CSR_CALSEL);
752 
753  /* Init trimming counter */
754  /* Medium value */
755  trimmingvaluep = 16U;
756  delta = 8U;
757 
758  while (delta != 0U)
759  {
760  /* Set candidate trimming */
761  /* OPAMP_POWERMODE_NORMAL */
762  MODIFY_REG(*tmp_opamp_reg_trimming, OPAMP_OTR_TRIMOFFSETP, (trimmingvaluep<<OPAMP_INPUT_NONINVERTING));
763 
764  /* OFFTRIMmax delay 1 ms as per datasheet (electrical characteristics */
765  /* Offset trim time: during calibration, minimum time needed between */
766  /* two steps to have 1 mV accuracy */
767  HAL_Delay(OPAMP_TRIMMING_DELAY);
768 
769  if (READ_BIT(hopamp->Instance->CSR, OPAMP_CSR_CALOUT) != 0U)
770  {
771  /* OPAMP_CSR_CALOUT is HIGH try higher trimming */
772  trimmingvaluep += delta;
773  }
774  else
775  {
776  /* OPAMP_CSR_CALOUT is LOW try lower trimming */
777  trimmingvaluep -= delta;
778  }
779 
780  /* Divide range by 2 to continue dichotomy sweep */
781  delta >>= 1U;
782  }
783 
784  /* Still need to check if right calibration is current value or one step below */
785  /* Indeed the first value that causes the OUTCAL bit to change from 1 to 0 */
786  /* Set candidate trimming */
787  MODIFY_REG(*tmp_opamp_reg_trimming, OPAMP_OTR_TRIMOFFSETP, (trimmingvaluep<<OPAMP_INPUT_NONINVERTING));
788 
789  /* OFFTRIMmax delay 1 ms as per datasheet (electrical characteristics */
790  /* Offset trim time: during calibration, minimum time needed between */
791  /* two steps to have 1 mV accuracy */
792  HAL_Delay(OPAMP_TRIMMING_DELAY);
793 
794  if (READ_BIT(hopamp->Instance->CSR, OPAMP_CSR_CALOUT) != 0U)
795  {
796  /* Trimming value is actually one value more */
797  trimmingvaluep++;
798  MODIFY_REG(*tmp_opamp_reg_trimming, OPAMP_OTR_TRIMOFFSETP, (trimmingvaluep<<OPAMP_INPUT_NONINVERTING));
799  }
800 
801  /* Disable the OPAMP */
802  CLEAR_BIT (hopamp->Instance->CSR, OPAMP_CSR_OPAMPxEN);
803 
804  /* Disable calibration & set normal mode (operating mode) */
805  CLEAR_BIT (hopamp->Instance->CSR, OPAMP_CSR_CALON);
806 
807  /* Self calibration is successful */
808  /* Store calibration(user trimming) results in init structure. */
809 
810  /* Set user trimming mode */
811  hopamp->Init.UserTrimming = OPAMP_TRIMMING_USER;
812 
813  /* Affect calibration parameters depending on mode normal/low power */
814  if (hopamp->Init.PowerMode != OPAMP_POWERMODE_LOWPOWER)
815  {
816  /* Write calibration result N */
817  hopamp->Init.TrimmingValueN = trimmingvaluen;
818  /* Write calibration result P */
819  hopamp->Init.TrimmingValueP = trimmingvaluep;
820  }
821  else
822  {
823  /* Write calibration result N */
824  hopamp->Init.TrimmingValueNLowPower = trimmingvaluen;
825  /* Write calibration result P */
826  hopamp->Init.TrimmingValuePLowPower = trimmingvaluep;
827  }
828 
829  /* Restore OPAMP mode after calibration */
830  MODIFY_REG(hopamp->Instance->CSR, OPAMP_CSR_OPAMODE, opampmode);
831  }
832  else
833  {
834  /* OPAMP can not be calibrated from this mode */
835  status = HAL_ERROR;
836  }
837  }
838  return status;
839 }
840 
870 HAL_StatusTypeDef HAL_OPAMP_Lock(OPAMP_HandleTypeDef *hopamp)
871 {
872  HAL_StatusTypeDef status = HAL_OK;
873 
874  /* Check the OPAMP handle allocation */
875  /* Check if OPAMP locked */
876  /* OPAMP can be locked when enabled and running in normal mode */
877  /* It is meaningless otherwise */
878  if(hopamp == NULL)
879  {
880  status = HAL_ERROR;
881  }
882  else if(hopamp->State == HAL_OPAMP_STATE_BUSY)
883  {
884  /* Check the parameter */
885  assert_param(IS_OPAMP_ALL_INSTANCE(hopamp->Instance));
886 
887  /* OPAMP state changed to locked */
888  hopamp->State = HAL_OPAMP_STATE_BUSYLOCKED;
889  }
890  else
891  {
892  status = HAL_ERROR;
893  }
894  return status;
895 }
896 
920 {
921  HAL_OPAMP_TrimmingValueTypeDef trimmingvalue;
922  __IO uint32_t* tmp_opamp_reg_trimming; /* Selection of register of trimming depending on power mode: OTR or LPOTR */
923 
924  /* Check the OPAMP handle allocation */
925  /* Value can be retrieved in HAL_OPAMP_STATE_READY state */
926  if(hopamp == NULL)
927  {
928  return OPAMP_FACTORYTRIMMING_DUMMY;
929  }
930 
931  /* Check the OPAMP handle allocation */
932  /* Value can be retrieved in HAL_OPAMP_STATE_READY state */
933  if(hopamp->State == HAL_OPAMP_STATE_READY)
934  {
935  /* Check the parameter */
936  assert_param(IS_OPAMP_ALL_INSTANCE(hopamp->Instance));
937  assert_param(IS_OPAMP_FACTORYTRIMMING(trimmingoffset));
938  assert_param(IS_OPAMP_POWERMODE(hopamp->Init.PowerMode));
939 
940  /* Check the trimming mode */
941  if (READ_BIT(hopamp->Instance->CSR,OPAMP_CSR_USERTRIM) != 0U)
942  {
943  /* This function must called when OPAMP init parameter "UserTrimming" */
944  /* is set to trimming factory, and before OPAMP calibration (function */
945  /* "HAL_OPAMP_SelfCalibrate()"). */
946  /* Otherwise, factory trimming value cannot be retrieved and error */
947  /* status is returned. */
948  trimmingvalue = OPAMP_FACTORYTRIMMING_DUMMY;
949  }
950  else
951  {
952  /* Select trimming settings depending on power mode */
953  if (hopamp->Init.PowerMode == OPAMP_POWERMODE_NORMAL)
954  {
955  tmp_opamp_reg_trimming = &OPAMP->OTR;
956  }
957  else
958  {
959  tmp_opamp_reg_trimming = &OPAMP->LPOTR;
960  }
961 
962  /* Get factory trimming */
963  if (trimmingoffset == OPAMP_FACTORYTRIMMING_P)
964  {
965  /* OPAMP_FACTORYTRIMMING_P */
966  trimmingvalue = ((*tmp_opamp_reg_trimming) & OPAMP_OTR_TRIMOFFSETP) >> OPAMP_INPUT_NONINVERTING;
967  }
968  else
969  {
970  /* OPAMP_FACTORYTRIMMING_N */
971  trimmingvalue = (*tmp_opamp_reg_trimming) & OPAMP_OTR_TRIMOFFSETN;
972  }
973  }
974  }
975  else
976  {
977  return OPAMP_FACTORYTRIMMING_DUMMY;
978  }
979  return trimmingvalue;
980 }
981 
1007 {
1008  /* Check the OPAMP handle allocation */
1009  if(hopamp == NULL)
1010  {
1011  return HAL_OPAMP_STATE_RESET;
1012  }
1013 
1014  /* Check the parameter */
1015  assert_param(IS_OPAMP_ALL_INSTANCE(hopamp->Instance));
1016 
1017  /* Return OPAMP handle state */
1018  return hopamp->State;
1019 }
1020 
1025 #if (USE_HAL_OPAMP_REGISTER_CALLBACKS == 1)
1026 
1038 {
1039  HAL_StatusTypeDef status = HAL_OK;
1040 
1041  if(pCallback == NULL)
1042  {
1043  return HAL_ERROR;
1044  }
1045 
1046  /* Process locked */
1047  __HAL_LOCK(hopamp);
1048 
1049  if(hopamp->State == HAL_OPAMP_STATE_READY)
1050  {
1051  switch (CallbackID)
1052  {
1054  hopamp->MspInitCallback = pCallback;
1055  break;
1057  hopamp->MspDeInitCallback = pCallback;
1058  break;
1059  default :
1060  /* update return status */
1061  status = HAL_ERROR;
1062  break;
1063  }
1064  }
1065  else if (hopamp->State == HAL_OPAMP_STATE_RESET)
1066  {
1067  switch (CallbackID)
1068  {
1070  hopamp->MspInitCallback = pCallback;
1071  break;
1073  hopamp->MspDeInitCallback = pCallback;
1074  break;
1075  default :
1076  /* update return status */
1077  status = HAL_ERROR;
1078  break;
1079  }
1080  }
1081  else
1082  {
1083  /* update return status */
1084  status = HAL_ERROR;
1085  }
1086 
1087  /* Release Lock */
1088  __HAL_UNLOCK(hopamp);
1089  return status;
1090 }
1091 
1105 {
1106  HAL_StatusTypeDef status = HAL_OK;
1107 
1108  /* Process locked */
1109  __HAL_LOCK(hopamp);
1110 
1111  if(hopamp->State == HAL_OPAMP_STATE_READY)
1112  {
1113  switch (CallbackID)
1114  {
1116  hopamp->MspInitCallback = HAL_OPAMP_MspInit;
1117  break;
1119  hopamp->MspDeInitCallback = HAL_OPAMP_MspDeInit;
1120  break;
1121  case HAL_OPAMP_ALL_CB_ID :
1122  hopamp->MspInitCallback = HAL_OPAMP_MspInit;
1123  hopamp->MspDeInitCallback = HAL_OPAMP_MspDeInit;
1124  break;
1125  default :
1126  /* update return status */
1127  status = HAL_ERROR;
1128  break;
1129  }
1130  }
1131  else if (hopamp->State == HAL_OPAMP_STATE_RESET)
1132  {
1133  switch (CallbackID)
1134  {
1136  hopamp->MspInitCallback = HAL_OPAMP_MspInit;
1137  break;
1139  hopamp->MspDeInitCallback = HAL_OPAMP_MspDeInit;
1140  break;
1141  default :
1142  /* update return status */
1143  status = HAL_ERROR;
1144  break;
1145  }
1146  }
1147  else
1148  {
1149  /* update return status */
1150  status = HAL_ERROR;
1151  }
1152 
1153  /* Release Lock */
1154  __HAL_UNLOCK(hopamp);
1155  return status;
1156 }
1157 
1158 #endif /* USE_HAL_OPAMP_REGISTER_CALLBACKS */
1159 
1160 
1169 #endif /* HAL_OPAMP_MODULE_ENABLED */
1170 
1178 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
void(* pOPAMP_CallbackTypeDef)(OPAMP_HandleTypeDef *hopamp)
HAL OPAMP Callback pointer definition.
This file contains all the functions prototypes for the HAL module driver.
HAL_StatusTypeDef HAL_OPAMP_Stop(OPAMP_HandleTypeDef *hopamp)
Stop the OPAMP.
void HAL_Delay(uint32_t Delay)
This function provides minimum delay (in milliseconds) based on variable incremented.
__HAL_UNLOCK(hrtc)
CLEAR_BIT(hrtc->Instance->CR, RTC_CR_WUTE)
__HAL_LOCK(hrtc)
struct __OPAMP_HandleTypeDef else typedef struct endif OPAMP_HandleTypeDef
OPAMP Handle Structure definition.
return HAL_OK
void HAL_OPAMP_MspDeInit(OPAMP_HandleTypeDef *hopamp)
DeInitialize OPAMP MSP.
void HAL_OPAMP_MspInit(OPAMP_HandleTypeDef *hopamp)
Initialize the OPAMP MSP.
HAL_StatusTypeDef HAL_OPAMP_DeInit(OPAMP_HandleTypeDef *hopamp)
DeInitialize the OPAMP peripheral.
HAL_OPAMP_TrimmingValueTypeDef HAL_OPAMP_GetTrimOffset(OPAMP_HandleTypeDef *hopamp, uint32_t trimmingoffset)
Return the OPAMP factory trimming value.
HAL_StatusTypeDef HAL_OPAMP_RegisterCallback(OPAMP_HandleTypeDef *hopamp, HAL_OPAMP_CallbackIDTypeDef CallbackID, pOPAMP_CallbackTypeDef pCallback)
Register a User OPAMP Callback To be used instead of the weak (surcharged) predefined callback...
HAL_StatusTypeDef HAL_OPAMP_Init(OPAMP_HandleTypeDef *hopamp)
Initializes the OPAMP according to the specified parameters in the OPAMP_InitTypeDef and initialize t...
MODIFY_REG(hrtc->Instance->CR, RTC_CR_WUCKSEL,(uint32_t) WakeUpClock)
HAL_OPAMP_StateTypeDef HAL_OPAMP_GetState(OPAMP_HandleTypeDef *hopamp)
Return the OPAMP handle state.
HAL_OPAMP_CallbackIDTypeDef
HAL OPAMP Callback ID enumeration definition.
uint32_t HAL_OPAMP_TrimmingValueTypeDef
HAl_OPAMP_TrimmingValueTypeDef definition.
HAL_StatusTypeDef HAL_OPAMP_Start(OPAMP_HandleTypeDef *hopamp)
Start the OPAMP.
HAL_StatusTypeDef HAL_OPAMP_UnRegisterCallback(OPAMP_HandleTypeDef *hopamp, HAL_OPAMP_CallbackIDTypeDef CallbackID)
Unregister a User OPAMP Callback OPAMP Callback is redirected to the weak (surcharged) predefined cal...
HAL_StatusTypeDef HAL_OPAMP_Lock(OPAMP_HandleTypeDef *hopamp)
Lock the selected OPAMP configuration.
HAL_StatusTypeDef HAL_OPAMP_SelfCalibrate(OPAMP_HandleTypeDef *hopamp)
Run the self calibration of one OPAMP.
HAL_OPAMP_StateTypeDef
HAL State structures definition.
assert_param(IS_RTC_WAKEUP_CLOCK(WakeUpClock))