/**
|
******************************************************************************
|
* @file stm32l1xx_comp.c
|
* @author MCD Application Team
|
* @version V1.3.1
|
* @date 20-April-2015
|
* @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
|
*
|
* <h2><center>© COPYRIGHT 2015 STMicroelectronics</center></h2>
|
*
|
* 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****/
|