/** * @file xmc_acmp.h * @date 2015-09-02 * * @cond ********************************************************************************************************************* * XMClib v2.1.16 - XMC Peripheral Driver Library * * Copyright (c) 2015-2017, Infineon Technologies AG * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification,are permitted provided that the * following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list of conditions and the following * disclaimer. * * 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. * * Neither the name of the copyright holders 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. * * To improve the quality of the software, users are encouraged to share modifications, enhancements or bug fixes with * Infineon Technologies AG dave@infineon.com). ********************************************************************************************************************* * * Change History * -------------- * * 2014-12-10: * - Initial version * 2015-02-20: * - Removed unused declarations
* 2015-05-08: * - Fixed sequence problem of low power mode in XMC_ACMP_Init() API
* - Fixed wrong register setting in XMC_ACMP_SetInput() API
* - Removed return type variable and by default comparator enable from XMC_ACMP_Init() API.
* Additional call to XMC_ACMP_EnableComparator() API needed to start Comparator after Init.
* 2015-06-04: * - Removed return type variable and by default comparator enable from XMC_ACMP_Init() API.
* - Divided XMC_ACMP_SetInput into two 3 APIs to reduce the code size and complexity as stated below
* (a)XMC_ACMP_EnableReferenceDivider
* (b)XMC_ACMP_DisableReferenceDivider
* (c)XMC_ACMP_SetInput
* - Optimized enable and disable API's and moved to header file as static inline APIs. * - XMC_ACMP_t typedef changed to structure which overrides the standard header file structure. * 2015-06-20: * - Removed version macros and declaration of GetDriverVersion API * 2015-06-26: * - API help documentation modified. * 2015-09-02: * - API help documentation modified for XMC1400 device support. * @endcond * */ #ifndef XMC_ACMP_H #define XMC_ACMP_H /** * @addtogroup XMClib XMC Peripheral Library * @{ */ /** * @addtogroup ACMP * @brief Analog Comparator(ACMP) low level driver for XMC1 family of microcontrollers.
* * The ACMP module consists of minimum of 3 analog comparators. Each analog comparator has two inputs, INP and INN. * Input INP is compared with input INN in the pad voltage domain. * It generates a digital comparator output signal. The digital comparator output signal is shifted down from VDDP * power supply voltage level to VDDC core voltage level. The ACMP module provides the following functionalities.\n * -# Monitor external voltage level * -# Operates in low power mode * -# Provides Inverted ouput option\n * \par The ACMP low level driver funtionalities *
    *
  1. Initializes an instance of analog comparator module with the @ref XMC_ACMP_CONFIG_t configuration structure * using the API XMC_ACMP_Init().
  2. *
  3. Programs the source of input(INP) specified by @ref XMC_ACMP_INP_SOURCE_t parameter using the API * XMC_ACMP_SetInput().
  4. *
  5. Sets the low power mode of operation using XMC_ACMP_SetLowPowerMode() API.
  6. *
* @{ */ /********************************************************************************************************************* * HEADER FILES ********************************************************************************************************************/ #include /********************************************************************************************************************* * MACROS ********************************************************************************************************************/ /* If ACMP is available*/ #if defined (COMPARATOR) #define XMC_ACMP0 (XMC_ACMP_t*)COMPARATOR /**< Comparator module base address defined*/ #if UC_SERIES == XMC14 #define XMC_ACMP_MAX_INSTANCES (4U) /* Maximum number of Analog Comparators available*/ #else #define XMC_ACMP_MAX_INSTANCES (3U) /* Maximum number of Analog Comparators available*/ #endif /* Checks if the pointer being passed is valid*/ #define XMC_ACMP_CHECK_MODULE_PTR(PTR) (((PTR)== (XMC_ACMP_t*)COMPARATOR)) /* Checks if the instance being addressed is valid*/ #define XMC_ACMP_CHECK_INSTANCE(INST) (((INST)< XMC_ACMP_MAX_INSTANCES)) /********************************************************************************************************************* * ENUMS ********************************************************************************************************************/ /** * Defines the return value of an API. */ typedef enum XMC_ACMP_STATUS { XMC_ACMP_STATUS_SUCCESS = 0U, /**< API completes the execution successfully */ XMC_ACMP_STATUS_ERROR , /**< API cannot fulfill the request */ } XMC_ACMP_STATUS_t; /** * Defines the hysteresis voltage levels to reduce noise sensitivity. */ typedef enum XMC_ACMP_HYSTERESIS { XMC_ACMP_HYSTERESIS_OFF = 0U, /**< No hysteresis */ XMC_ACMP_HYSTERESIS_10 , /**< Hysteresis = 10mv */ XMC_ACMP_HYSTERESIS_15 , /**< Hysteresis = 15mv */ XMC_ACMP_HYSTERESIS_20 /**< Hysteresis = 20mv */ } XMC_ACMP_HYSTERESIS_t; /** * Defines the comparator output status options. */ typedef enum XMC_ACMP_COMP_OUT { XMC_ACMP_COMP_OUT_NO_INVERSION = 0U, /**< ACMP output is HIGH when, Input Positive(INP) greater than Input Negative(INN). Vplus > Vminus */ XMC_ACMP_COMP_OUT_INVERSION /**< ACMP output is HIGH when, Input Negative(INN) greater than Input Positive(INP). Vminus > Vplus*/ } XMC_ACMP_COMP_OUT_t; /** * Defines the analog comparator input connection method. */ typedef enum XMC_ACMP_INP_SOURCE { XMC_ACMP_INP_SOURCE_STANDARD_PORT = 0U, /**< Input is connected to port */ XMC_ACMP_INP_SOURCE_ACMP1_INP_PORT = (uint16_t)(COMPARATOR_ANACMP0_ACMP0_SEL_Msk) /**< Input is connected to port and ACMP1 INP */ } XMC_ACMP_INP_SOURCE_t; /********************************************************************************************************************* * DATA STRUCTURES ********************************************************************************************************************/ /*Anonymous structure/union guard start*/ #if defined(__CC_ARM) #pragma push #pragma anon_unions #elif defined(__TASKING__) #pragma warning 586 #endif /** * ACMP module */ typedef struct { __IO uint32_t ORCCTRL; __I uint32_t RESERVED[726]; __IO uint32_t ANACMP[XMC_ACMP_MAX_INSTANCES]; } XMC_ACMP_t; /** * Structure for initializing the ACMP module. It configures the ANACMP register of the respective input. */ typedef struct XMC_ACMP_CONFIG { union { struct { uint32_t : 1; uint32_t filter_disable : 1; /**< Comparator filter option for removing glitches. By default this option is selected in ANACMP register. Setting this option disables the filter */ uint32_t : 1; uint32_t output_invert : 1; /**< Option to invert the comparator output. Use XMC_@ref XMC_ACMP_COMP_OUT_t type*/ uint32_t hysteresis : 2; /**< Hysteresis voltage to reduce noise sensitivity. Select the voltage levels from the values defined in @ref XMC_ACMP_HYSTERESIS_t. */ uint32_t : 26; }; uint32_t anacmp; }; } XMC_ACMP_CONFIG_t; /*Anonymous structure/union guard end*/ #if defined(__CC_ARM) #pragma pop #elif defined(__TASKING__) #pragma warning restore #endif #ifdef __cplusplus extern "C" { #endif /********************************************************************************************************************* * API Prototypes ********************************************************************************************************************/ /** * @param peripheral Constant pointer to analog comparator module, of @ref XMC_ACMP_t type. Use @ref XMC_ACMP0 macro. * @param instance ACMP instance number.
* Range:
0 - ACMP0
* 1 - ACMP1
* 2 - ACMP2
* 3 - ACMP3 - Only applicable for XMC1400 devices
* * @param config Pointer to configuration data. Refer data structure @ref XMC_ACMP_CONFIG_t for settings. * @return * None
* * \parDescription:
* Initializes an instance of analog comparator module.
\n * Configures the ANACMP resister with hysteresis, comparator filter and inverted comparator output. * * \parRelated APIs:
* None. */ void XMC_ACMP_Init(XMC_ACMP_t *const peripheral, uint32_t instance, const XMC_ACMP_CONFIG_t *const config); /** * @param peripheral Constant pointer to analog comparator module, of @ref XMC_ACMP_t type. Use @ref XMC_ACMP0 macro. * @param instance ACMP instance number.
* Range:
0 - ACMP0
* 1 - ACMP1
* 2 - ACMP2
* 3 - ACMP3 - Only applicable for XMC1400 devices
* @return * None
* * \parDescription:
* Enables an instance of ACMP module.
\n * Starts the comparator by setting CMP_EN bit of respective ANACMP \a instance register. The \a instance number * determines which analog comparator to be switched on. Call this API after the successful completion of the comparator * initilization and input selection. * * \parRelated APIs:
* XMC_ACMP_DisableComparator().
*/ __STATIC_INLINE void XMC_ACMP_EnableComparator(XMC_ACMP_t *const peripheral, uint32_t instance) { XMC_ASSERT("XMC_ACMP_EnableComparator:Wrong module pointer", XMC_ACMP_CHECK_MODULE_PTR(peripheral)) XMC_ASSERT("XMC_ACMP_EnableComparator:Wrong instance number", XMC_ACMP_CHECK_INSTANCE(instance) ) peripheral->ANACMP[instance] |= (uint16_t)COMPARATOR_ANACMP0_CMP_EN_Msk; } /** * @param peripheral Constant pointer to analog comparator module, of @ref XMC_ACMP_t type. Use @ref XMC_ACMP0 macro. * @param instance ACMP instance number.
* Range:
0 - ACMP0
* 1 - ACMP1
* 2 - ACMP2
* 3 - ACMP3 - Only applicable for XMC1400 devices
* @return * None
* \parDescription:
* Disables an instance of ACMP module.
\n * Stops the comparator by resetting CMP_EN bit of respective ANACMP \a instance register. The \a instance number * determines which analog comparator to be switched off. * * \parRelated APIs:
* XMC_ACMP_EnableComparator(). */ __STATIC_INLINE void XMC_ACMP_DisableComparator(XMC_ACMP_t *const peripheral, uint32_t instance) { XMC_ASSERT("XMC_ACMP_DisableComparator:Wrong module pointer", XMC_ACMP_CHECK_MODULE_PTR(peripheral)) XMC_ASSERT("XMC_ACMP_DisableComparator:Wrong instance number", XMC_ACMP_CHECK_INSTANCE(instance) ) peripheral->ANACMP[instance] &= (uint16_t)(~((uint32_t)COMPARATOR_ANACMP0_CMP_EN_Msk)); } /** * @param None * @return * None
* * \parDescription:
* Enables the reference divider for analog comparator instance 1.
\n * ACMP1 input INP is driven by an internal reference voltage by setting DIV_EN bit of ANACMP1 register. * Other comparator instances can also share this reference divider option by calling the XMC_ACMP_SetInput() API. * * \parRelated APIs:
* XMC_ACMP_SetInput(). */ __STATIC_INLINE void XMC_ACMP_EnableReferenceDivider(void) { /* Enable the divider switch and connect the divided reference to ACMP1.INP */ COMPARATOR->ANACMP1 |= (uint16_t)(COMPARATOR_ANACMP1_REF_DIV_EN_Msk); } /** * @param None * @return * None
* * \parDescription:
* Disables the reference divider for analog comparator instance 1.
\n * ACMP1 input INP is disconnected from the reference divider. This is achieved by reseting DIV_EN bit of ANACMP1 * register. * * \parRelated APIs:
* None. */ __STATIC_INLINE void XMC_ACMP_DisableReferenceDivider(void) { /* Disable the divider switch and use ACMP1.INP as standard port*/ COMPARATOR->ANACMP1 &= (uint16_t)(~(COMPARATOR_ANACMP1_REF_DIV_EN_Msk)); } /** * @param peripheral Constant pointer to analog comparator module, of @ref XMC_ACMP_t type. Use @ref XMC_ACMP0 macro. * @param instance ACMP instance number.
* Range:
0 - ACMP0
* 2 - ACMP2
* 3 - ACMP3 - Only applicable for XMC1400 devices
* @param source ACMP input source selection options.
* Range:
XMC_ACMP_INP_SOURCE_STANDARD_PORT - Input is connected to port
* XMC_ACMP_INP_SOURCE_ACMP1_INP_PORT - Input is connected to port and ACMP1 INP
* @return * None
* * \parDescription:
* Sets the analog comparartor input selection for ACMP0, ACMP2 instances.
\n * Apart from ACMP1 instance, each ACMP instances can be connected to its own port and ACMP1 INP. * Calling @ref XMC_ACMP_EnableReferenceDivider() API, after this API can share the reference divider to one of the * comparartor input as explained in the following options.
* The hardware options to set input are listed below.
*
    *
  1. The comparator inputs aren't connected to other ACMP1 comparator inputs.
  2. *
  3. Can program the comparator-0 to connect ACMP0.INP to ACMP1.INP in XMC1200 AA or XMC1300 AA
  4. *
  5. Can program the comparator-0 to connect ACMP0.INN to ACMP1.INP in XMC1200 AB or XMC1300 AB or XMC1400 AA
  6. *
  7. Can program the comparator-2 to connect ACMP2.INP to ACMP1.INP
  8. *

* Directly accessed registers are ANACMP0, ANACMP2 according to the availability of instance in the devices. * * \parRelated APIs:
* @ref XMC_ACMP_EnableReferenceDivider.
* @ref XMC_ACMP_DisableReferenceDivider. */ void XMC_ACMP_SetInput(XMC_ACMP_t *const peripheral, uint32_t instance, const XMC_ACMP_INP_SOURCE_t source); /** * @param None * @return * None
* * \parDescription:
* Set the comparartors to operate in low power mode, by setting the LPWR bit of ANACMP0 register.
\n * The low power mode is controlled by ACMP0 instance. Low power mode is applicable for all instances of the * comparator. In low power mode, blanking time will be introduced to ensure the stability of comparartor output. This * will slow down the comparator operation. * * \parRelated APIs:
* XMC_ACMP_ClearLowPowerMode(). */ __STATIC_INLINE void XMC_ACMP_SetLowPowerMode(void) { COMPARATOR->ANACMP0 |= (uint16_t)COMPARATOR_ANACMP0_CMP_LPWR_Msk; } /** * @param None * @return * None
* * \parDescription:
* Exits the low power mode by reseting LPWR bit of ANACMP0 register.
\n * The low power mode is controlled by ACMP0 module. Low power mode is applicable for all instances of the * comparator. To re-enable the low power mode, call the related API @ref XMC_ACMP_SetLowPowerMode(). * * \parRelated APIs:
* XMC_ACMP_SetLowPowerMode(). */ __STATIC_INLINE void XMC_ACMP_ClearLowPowerMode(void) { COMPARATOR->ANACMP0 &= (uint16_t)(~(uint16_t)COMPARATOR_ANACMP0_CMP_LPWR_Msk); } /** * @} */ /** * @} */ #ifdef __cplusplus } #endif #endif /* If ACMP is available*/ #endif /* XMC_ACMP_H */