/** | |
****************************************************************************** | |
* @file stm32l1xx_ll_opamp.c | |
* @author MCD Application Team | |
* @brief OPAMP LL module driver | |
****************************************************************************** | |
* @attention | |
* | |
* <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics</center></h2> | |
* | |
* Redistribution and use in source and binary forms, with or without modification, | |
* are permitted provided that the following conditions are met: | |
* 1. Redistributions of source code must retain the above copyright notice, | |
* this list of conditions and the following disclaimer. | |
* 2. Redistributions in binary form must reproduce the above copyright notice, | |
* this list of conditions and the following disclaimer in the documentation | |
* and/or other materials provided with the distribution. | |
* 3. Neither the name of STMicroelectronics nor the names of its contributors | |
* may be used to endorse or promote products derived from this software | |
* without specific prior written permission. | |
* | |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
* | |
****************************************************************************** | |
*/ | |
#if defined(USE_FULL_LL_DRIVER) | |
/* Includes ------------------------------------------------------------------*/ | |
#include "stm32l1xx_ll_opamp.h" | |
#ifdef USE_FULL_ASSERT | |
#include "stm32_assert.h" | |
#else | |
#define assert_param(expr) ((void)0U) | |
#endif | |
/** @addtogroup STM32L1xx_LL_Driver | |
* @{ | |
*/ | |
#if defined (OPAMP1) || defined (OPAMP2) || defined (OPAMP3) | |
/** @addtogroup OPAMP_LL OPAMP | |
* @{ | |
*/ | |
/* Private types -------------------------------------------------------------*/ | |
/* Private variables ---------------------------------------------------------*/ | |
/* Private constants ---------------------------------------------------------*/ | |
/* Private macros ------------------------------------------------------------*/ | |
/** @addtogroup OPAMP_LL_Private_Macros | |
* @{ | |
*/ | |
/* Check of parameters for configuration of OPAMP hierarchical scope: */ | |
/* OPAMP instance. */ | |
#define IS_LL_OPAMP_POWER_MODE(__POWER_MODE__) \ | |
( ((__POWER_MODE__) == LL_OPAMP_POWERMODE_NORMAL) \ | |
|| ((__POWER_MODE__) == LL_OPAMP_POWERMODE_LOWPOWER)) | |
#define IS_LL_OPAMP_FUNCTIONAL_MODE(__FUNCTIONAL_MODE__) \ | |
( ((__FUNCTIONAL_MODE__) == LL_OPAMP_MODE_STANDALONE) \ | |
|| ((__FUNCTIONAL_MODE__) == LL_OPAMP_MODE_FOLLOWER) \ | |
) | |
/* Note: Comparator non-inverting inputs parameters are different */ | |
/* depending on OPAMP instance. */ | |
#if defined(OPAMP3) | |
#define IS_LL_OPAMP_INPUT_NONINVERTING(__OPAMPX__, __INPUT_NONINVERTING__) \ | |
(((__OPAMPX__) == OPAMP1) \ | |
? ( \ | |
((__INPUT_NONINVERTING__) == LL_OPAMP_INPUT_NONINVERT_IO0) \ | |
|| ((__INPUT_NONINVERTING__) == LL_OPAMP_INPUT_NONINV_DAC1_CH1) \ | |
) \ | |
: \ | |
(((__OPAMPX__) == OPAMP2) \ | |
? ( \ | |
((__INPUT_NONINVERTING__) == LL_OPAMP_INPUT_NONINVERT_IO0) \ | |
|| ((__INPUT_NONINVERTING__) == LL_OPAMP_INPUT_NONINV_DAC1_CH1) \ | |
|| ((__INPUT_NONINVERTING__) == LL_OPAMP_INPUT_NONINV_DAC1_CH2) \ | |
) \ | |
: \ | |
( \ | |
((__INPUT_NONINVERTING__) == LL_OPAMP_INPUT_NONINVERT_IO0) \ | |
|| ((__INPUT_NONINVERTING__) == LL_OPAMP_INPUT_NONINV_DAC1_CH2_OPAMP3) \ | |
) \ | |
) \ | |
) | |
#else | |
#define IS_LL_OPAMP_INPUT_NONINVERTING(__OPAMPX__, __INPUT_NONINVERTING__) \ | |
(((__OPAMPX__) == OPAMP1) \ | |
? ( \ | |
((__INPUT_NONINVERTING__) == LL_OPAMP_INPUT_NONINVERT_IO0) \ | |
|| ((__INPUT_NONINVERTING__) == LL_OPAMP_INPUT_NONINV_DAC1_CH1) \ | |
) \ | |
: \ | |
( \ | |
((__INPUT_NONINVERTING__) == LL_OPAMP_INPUT_NONINVERT_IO0) \ | |
|| ((__INPUT_NONINVERTING__) == LL_OPAMP_INPUT_NONINV_DAC1_CH1) \ | |
|| ((__INPUT_NONINVERTING__) == LL_OPAMP_INPUT_NONINV_DAC1_CH2) \ | |
) \ | |
) | |
#endif | |
/* Note: Comparator non-inverting inputs parameters are the same on all */ | |
/* OPAMP instances. */ | |
/* However, comparator instance kept as macro parameter for */ | |
/* compatibility with other STM32 families. */ | |
#define IS_LL_OPAMP_INPUT_INVERTING(__OPAMPX__, __INPUT_INVERTING__) \ | |
( ((__INPUT_INVERTING__) == LL_OPAMP_INPUT_INVERT_IO0) \ | |
|| ((__INPUT_INVERTING__) == LL_OPAMP_INPUT_INVERT_IO1) \ | |
|| ((__INPUT_INVERTING__) == LL_OPAMP_INPUT_INVERT_CONNECT_NO) \ | |
) | |
/** | |
* @} | |
*/ | |
/* Private function prototypes -----------------------------------------------*/ | |
/* Exported functions --------------------------------------------------------*/ | |
/** @addtogroup OPAMP_LL_Exported_Functions | |
* @{ | |
*/ | |
/** @addtogroup OPAMP_LL_EF_Init | |
* @{ | |
*/ | |
/** | |
* @brief De-initialize registers of the selected OPAMP instance | |
* to their default reset values. | |
* @param OPAMPx OPAMP instance | |
* @retval An ErrorStatus enumeration value: | |
* - SUCCESS: OPAMP registers are de-initialized | |
* - ERROR: OPAMP registers are not de-initialized | |
*/ | |
ErrorStatus LL_OPAMP_DeInit(OPAMP_TypeDef* OPAMPx) | |
{ | |
ErrorStatus status = SUCCESS; | |
/* Check the parameters */ | |
assert_param(IS_OPAMP_ALL_INSTANCE(OPAMPx)); | |
MODIFY_REG(OPAMP->CSR, | |
(OPAMP_CSR_S3SEL1 | OPAMP_CSR_S4SEL1 | OPAMP_CSR_S5SEL1 | OPAMP_CSR_S6SEL1 | OPAMP_CSR_OPA1CAL_L | OPAMP_CSR_OPA1CAL_H | OPAMP_CSR_OPA1LPM) << __OPAMP_INSTANCE_BITOFFSET(OPAMPx) | |
| (OPAMP_CSR_ANAWSEL1) << __OPAMP_INSTANCE_DECIMAL(OPAMPx) | |
| (OPAMP_CSR_S7SEL2 * __OPAMP_IS_INSTANCE_OPAMP2(OPAMPx)) , | |
(OPAMP_CSR_OPA1PD) << __OPAMP_INSTANCE_BITOFFSET(OPAMPx) | |
); | |
return status; | |
} | |
/** | |
* @brief Initialize some features of OPAMP instance. | |
* @note This function reset bit of calibration mode to ensure | |
* to be in functional mode, in order to have OPAMP parameters | |
* (inputs selection, ...) set with the corresponding OPAMP mode | |
* to be effective. | |
* @note This function configures features of the selected OPAMP instance. | |
* Some features are also available at scope OPAMP common instance | |
* (common to several OPAMP instances). | |
* Refer to functions having argument "OPAMPxy_COMMON" as parameter. | |
* @param OPAMPx OPAMP instance | |
* @param OPAMP_InitStruct Pointer to a @ref LL_OPAMP_InitTypeDef structure | |
* @retval An ErrorStatus enumeration value: | |
* - SUCCESS: OPAMP registers are initialized | |
* - ERROR: OPAMP registers are not initialized | |
*/ | |
ErrorStatus LL_OPAMP_Init(OPAMP_TypeDef *OPAMPx, LL_OPAMP_InitTypeDef *OPAMP_InitStruct) | |
{ | |
/* Check the parameters */ | |
assert_param(IS_OPAMP_ALL_INSTANCE(OPAMPx)); | |
assert_param(IS_LL_OPAMP_POWER_MODE(OPAMP_InitStruct->PowerMode)); | |
assert_param(IS_LL_OPAMP_FUNCTIONAL_MODE(OPAMP_InitStruct->FunctionalMode)); | |
assert_param(IS_LL_OPAMP_INPUT_NONINVERTING(OPAMPx, OPAMP_InitStruct->InputNonInverting)); | |
/* Note: OPAMP inverting input can be used with OPAMP in mode standalone. */ | |
/* Otherwise (OPAMP in mode follower), OPAMP inverting input is */ | |
/* not used (not connected to GPIO pin). */ | |
if(OPAMP_InitStruct->FunctionalMode != LL_OPAMP_MODE_FOLLOWER) | |
{ | |
assert_param(IS_LL_OPAMP_INPUT_INVERTING(OPAMPx, OPAMP_InitStruct->InputInverting)); | |
} | |
/* Configuration of OPAMP instance : */ | |
/* - PowerMode */ | |
/* - Functional mode */ | |
/* - Input non-inverting */ | |
/* - Input inverting */ | |
/* Note: Bits OPAMP_CSR_OPAxCAL_y reset to ensure to be in functional mode */ | |
if(OPAMP_InitStruct->FunctionalMode != LL_OPAMP_MODE_FOLLOWER) | |
{ | |
MODIFY_REG(OPAMP->CSR, | |
(( | |
OPAMP_CSR_OPA1LPM | |
| OPAMP_CSR_S3SEL1 | |
| OPAMP_CSR_OPA1CAL_H | |
| OPAMP_CSR_OPA1CAL_L | |
| OPAMP_CSR_S5SEL1 | |
| OPAMP_CSR_S6SEL1 | |
| OPAMP_CSR_S4SEL1 | |
) << __OPAMP_INSTANCE_BITOFFSET(OPAMPx) | |
) | |
| ((OPAMP_CSR_ANAWSEL1) << __OPAMP_INSTANCE_DECIMAL(OPAMPx)) | |
| (OPAMP_CSR_S7SEL2 * __OPAMP_IS_INSTANCE_OPAMP2(OPAMPx)) | |
, | |
(( | |
(OPAMP_InitStruct->PowerMode & OPAMP_POWERMODE_CSR_BIT_MASK) | |
| OPAMP_InitStruct->FunctionalMode | |
| OPAMP_InitStruct->InputNonInverting | |
| (OPAMP_InitStruct->InputInverting & OPAMP_CSR_S4SEL1) | |
) << __OPAMP_INSTANCE_BITOFFSET(OPAMPx) | |
) | |
| ((OPAMP_InitStruct->InputInverting & OPAMP_CSR_ANAWSEL1) << __OPAMP_INSTANCE_DECIMAL(OPAMPx)) | |
| ((OPAMP_InitStruct->InputNonInverting & OPAMP_CSR_S7SEL2) * __OPAMP_IS_INSTANCE_OPAMP2(OPAMPx)) | |
); | |
} | |
else | |
{ | |
MODIFY_REG(OPAMP->CSR, | |
(( | |
OPAMP_CSR_OPA1LPM | |
| OPAMP_CSR_OPA1CAL_H | |
| OPAMP_CSR_OPA1CAL_L | |
| OPAMP_CSR_S5SEL1 | |
| OPAMP_CSR_S6SEL1 | |
| OPAMP_CSR_S4SEL1 | |
) << __OPAMP_INSTANCE_BITOFFSET(OPAMPx) | |
) | |
| ((OPAMP_CSR_ANAWSEL1) << __OPAMP_INSTANCE_DECIMAL(OPAMPx)) | |
| (OPAMP_CSR_S7SEL2 * __OPAMP_IS_INSTANCE_OPAMP2(OPAMPx)) | |
, | |
(( | |
(OPAMP_InitStruct->PowerMode & OPAMP_POWERMODE_CSR_BIT_MASK) | |
| OPAMP_InitStruct->FunctionalMode | |
| OPAMP_InitStruct->InputNonInverting | |
| OPAMP_CSR_S3SEL1 | |
) << __OPAMP_INSTANCE_BITOFFSET(OPAMPx) | |
) | |
| ((OPAMP_InitStruct->InputNonInverting & OPAMP_CSR_S7SEL2) * __OPAMP_IS_INSTANCE_OPAMP2(OPAMPx)) | |
); | |
} | |
return SUCCESS; | |
} | |
/** | |
* @brief Set each @ref LL_OPAMP_InitTypeDef field to default value. | |
* @param OPAMP_InitStruct pointer to a @ref LL_OPAMP_InitTypeDef structure | |
* whose fields will be set to default values. | |
* @retval None | |
*/ | |
void LL_OPAMP_StructInit(LL_OPAMP_InitTypeDef *OPAMP_InitStruct) | |
{ | |
/* Set OPAMP_InitStruct fields to default values */ | |
OPAMP_InitStruct->PowerMode = LL_OPAMP_POWERMODE_NORMAL; | |
OPAMP_InitStruct->FunctionalMode = LL_OPAMP_MODE_FOLLOWER; | |
OPAMP_InitStruct->InputNonInverting = LL_OPAMP_INPUT_NONINVERT_IO0; | |
/* Note: Parameter discarded if OPAMP in functional mode follower, */ | |
/* set anyway to its default value. */ | |
OPAMP_InitStruct->InputInverting = LL_OPAMP_INPUT_INVERT_CONNECT_NO; | |
} | |
/** | |
* @} | |
*/ | |
/** | |
* @} | |
*/ | |
/** | |
* @} | |
*/ | |
#endif /* OPAMP1 || OPAMP2 || OPAMP3 */ | |
/** | |
* @} | |
*/ | |
#endif /* USE_FULL_LL_DRIVER */ | |
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |