/**
******************************************************************************
* @file stm32l1xx_comp.c
* @author MCD Application Team
* @version V1.2.0
* @date 22-February-2013
* @brief This file provides firmware functions to manage the following
* functionalities of the comparators (COMP1 and COMP2) peripheral:
* + Comparators configuration
* + Window mode control
* + Internal Reference Voltage (VREFINT) output
*
* @verbatim
===============================================================================
##### How to use this driver #####
===============================================================================
[..] The device integrates two analog comparators COMP1 and COMP2:
(+) COMP1 is a fixed threshold (VREFINT) that shares the non inverting
input with the ADC channels.
(+) COMP2 is a rail-to-rail comparator whose the inverting input can be
selected among: DAC_OUT1, DAC_OUT2, 1/4 VREFINT, 1/2 VERFINT, 3/4
VREFINT, VREFINT, PB3 and whose the output can be redirected to
embedded timers: TIM2, TIM3, TIM4, TIM10.
(+) The two comparators COMP1 and COMP2 can be combined in window mode.
-@-
(#@) Comparator APB clock must be enabled to get write access
to comparator register using
RCC_APB1PeriphClockCmd(RCC_APB1Periph_COMP, ENABLE).
(#@) COMP1 comparator and ADC can't be used at the same time since
they share the same ADC switch matrix (analog switches).
(#@) When an I/O is used as comparator input, the corresponding GPIO
registers should be configured in analog mode.
(#@) Comparators outputs (CMP1OUT and CMP2OUT) are not mapped on
GPIO pin. They are only internal.
To get the comparator output level, use COMP_GetOutputLevel().
(#@) COMP1 and COMP2 outputs are internally connected to EXTI Line 21
and EXTI Line 22 respectively.
Interrupts can be used by configuring the EXTI Line using the
EXTI peripheral driver.
(#@) After enabling the comparator (COMP1 or COMP2), user should wait
for start-up time (tSTART) to get right output levels.
Please refer to product datasheet for more information on tSTART.
(#@) Comparators cannot be used to exit the device from Sleep or Stop
mode when the internal reference voltage is switched off using
the PWR_UltraLowPowerCmd() function (ULP bit in the PWR_CR register).
@endverbatim
******************************************************************************
* @attention
*
*
© COPYRIGHT 2013 STMicroelectronics
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32l1xx_comp.h"
/** @addtogroup STM32L1xx_StdPeriph_Driver
* @{
*/
/** @defgroup COMP
* @brief COMP driver modules.
* @{
*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
/** @defgroup COMP_Private_Functions
* @{
*/
/** @defgroup COMP_Group1 Initialization and Configuration functions
* @brief Initialization and Configuration functions.
*
@verbatim
===============================================================================
##### Initialization and Configuration functions #####
===============================================================================
@endverbatim
* @{
*/
/**
* @brief Deinitializes COMP peripheral registers to their default reset values.
* @param None
* @retval None
*/
void COMP_DeInit(void)
{
COMP->CSR = ((uint32_t)0x00000000); /*!< Set COMP->CSR to reset value */
}
/**
* @brief Initializes the COMP2 peripheral according to the specified parameters
* in the COMP_InitStruct.
* @note This function configures only COMP2.
* @note COMP2 comparator is enabled as soon as the INSEL[2:0] bits are
* different from "000".
* @param COMP_InitStruct: pointer to an COMP_InitTypeDef structure that contains
* the configuration information for the specified COMP peripheral.
* @retval None
*/
void COMP_Init(COMP_InitTypeDef* COMP_InitStruct)
{
uint32_t tmpreg = 0;
/* Check the parameters */
assert_param(IS_COMP_INVERTING_INPUT(COMP_InitStruct->COMP_InvertingInput));
assert_param(IS_COMP_OUTPUT(COMP_InitStruct->COMP_OutputSelect));
assert_param(IS_COMP_SPEED(COMP_InitStruct->COMP_Speed));
/*!< Get the COMP CSR value */
tmpreg = COMP->CSR;
/*!< Clear the INSEL[2:0], OUTSEL[1:0] and SPEED bits */
tmpreg &= (uint32_t) (~(uint32_t) (COMP_CSR_OUTSEL | COMP_CSR_INSEL | COMP_CSR_SPEED));
/*!< Configure COMP: speed, inversion input selection and output redirection */
/*!< Set SPEED bit according to COMP_InitStruct->COMP_Speed value */
/*!< Set INSEL bits according to COMP_InitStruct->COMP_InvertingInput value */
/*!< Set OUTSEL bits according to COMP_InitStruct->COMP_OutputSelect value */
tmpreg |= (uint32_t)((COMP_InitStruct->COMP_Speed | COMP_InitStruct->COMP_InvertingInput
| COMP_InitStruct->COMP_OutputSelect));
/*!< The COMP2 comparator is enabled as soon as the INSEL[2:0] bits value are
different from "000" */
/*!< Write to COMP_CSR register */
COMP->CSR = tmpreg;
}
/**
* @brief Enable or disable the COMP1 peripheral.
* @note After enabling COMP1, the following functions should be called to
* connect the selected GPIO input to COMP1 non inverting input:
* @note Enable switch control mode using SYSCFG_RISwitchControlModeCmd()
* @note Close VCOMP switch using SYSCFG_RIIOSwitchConfig()
* @note Close the I/O switch number n corresponding to the I/O
* using SYSCFG_RIIOSwitchConfig()
* @param NewState: new state of the COMP1 peripheral.
* This parameter can be: ENABLE or DISABLE.
* @note This function enables/disables only the COMP1.
* @retval None
*/
void COMP_Cmd(FunctionalState NewState)
{
/* Check the parameter */
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
/* Enable the COMP1 */
COMP->CSR |= (uint32_t) COMP_CSR_CMP1EN;
}
else
{
/* Disable the COMP1 */
COMP->CSR &= (uint32_t)(~COMP_CSR_CMP1EN);
}
}
/**
* @brief Return the output level (high or low) of the selected comparator.
* @note Comparator output is low when the noninverting input is at a lower
* voltage than the inverting input.
* @note Comparator output is high when the noninverting input is at a higher
* voltage than the inverting input.
* @note Comparators outputs aren't available on GPIO (outputs levels are
* only internal). The COMP1 and COMP2 outputs are connected internally
* to the EXTI Line 21 and Line 22 respectively.
* @param COMP_Selection: the selected comparator.
* This parameter can be one of the following values:
* @arg COMP_Selection_COMP1: COMP1 selected
* @arg COMP_Selection_COMP2: COMP2 selected
* @retval Returns the selected comparator output level.
*/
uint8_t COMP_GetOutputLevel(uint32_t COMP_Selection)
{
uint8_t compout = 0x0;
/* Check the parameters */
assert_param(IS_COMP_ALL_PERIPH(COMP_Selection));
/* Check if Comparator 1 is selected */
if(COMP_Selection == COMP_Selection_COMP1)
{
/* Check if comparator 1 output level is high */
if((COMP->CSR & COMP_CSR_CMP1OUT) != (uint8_t) RESET)
{
/* Get Comparator 1 output level */
compout = (uint8_t) COMP_OutputLevel_High;
}
/* comparator 1 output level is low */
else
{
/* Get Comparator 1 output level */
compout = (uint8_t) COMP_OutputLevel_Low;
}
}
/* Comparator 2 is selected */
else
{
/* Check if comparator 2 output level is high */
if((COMP->CSR & COMP_CSR_CMP2OUT) != (uint8_t) RESET)
{
/* Get Comparator output level */
compout = (uint8_t) COMP_OutputLevel_High;
}
/* comparator 2 output level is low */
else
{
/* Get Comparator 2 output level */
compout = (uint8_t) COMP_OutputLevel_Low;
}
}
/* Return the comparator output level */
return (uint8_t)(compout);
}
/**
* @brief Close or Open the SW1 switch.
* @param NewState: new state of the SW1 switch.
* This parameter can be: ENABLE or DISABLE.
* @note ENABLE to close the SW1 switch
* @note DISABLE to open the SW1 switch
* @retval None.
*/
void COMP_SW1SwitchConfig(FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
/* Close SW1 switch */
COMP->CSR |= (uint32_t) COMP_CSR_SW1;
}
else
{
/* Open SW1 switch */
COMP->CSR &= (uint32_t)(~COMP_CSR_SW1);
}
}
/**
* @}
*/
/** @defgroup COMP_Group2 Window mode control function
* @brief Window mode control function.
*
@verbatim
===============================================================================
##### Window mode control function #####
===============================================================================
@endverbatim
* @{
*/
/**
* @brief Enables or disables the window mode.
* In window mode:
* @note COMP1 inverting input is fixed to VREFINT defining the first
* threshold.
* @note COMP2 inverting input is configurable (DAC_OUT1, DAC_OUT2, VREFINT
* sub-multiples, PB3) defining the second threshold.
* @note COMP1 and COMP2 non inverting inputs are connected together.
* @note In window mode, only the Group 6 (PB4 or PB5) can be used as
* noninverting inputs.
* @param NewState: new state of the window mode.
* This parameter can be ENABLE or DISABLE.
* @retval None
*/
void COMP_WindowCmd(FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
/* Enable the window mode */
COMP->CSR |= (uint32_t) COMP_CSR_WNDWE;
}
else
{
/* Disable the window mode */
COMP->CSR &= (uint32_t)(~COMP_CSR_WNDWE);
}
}
/**
* @}
*/
/** @defgroup COMP_Group3 Internal Reference Voltage output function
* @brief Internal Reference Voltage (VREFINT) output function.
*
@verbatim
===============================================================================
##### Internal Reference Voltage (VREFINT) output function #####
===============================================================================
@endverbatim
* @{
*/
/**
* @brief Enables or disables the output of internal reference voltage (VREFINT).
* The VREFINT output can be routed to any I/O in group 3: CH8 (PB0) or
* CH9 (PB1).
* To correctly use this function, the SYSCFG_RIIOSwitchConfig() function
* should be called after.
* @param NewState: new state of the Vrefint output.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void COMP_VrefintOutputCmd(FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
/* Enable the output of internal reference voltage */
COMP->CSR |= (uint32_t) COMP_CSR_VREFOUTEN;
}
else
{
/* Disable the output of internal reference voltage */
COMP->CSR &= (uint32_t) (~COMP_CSR_VREFOUTEN);
}
}
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/