openblt/Target/Demo/ARMCM4_XMC4_XMC4700_Relax_K.../Boot/lib/xmclib/src/xmc_acmp.c

120 lines
6.9 KiB
C

/**
* @file xmc_acmp.c
* @date 2015-06-20
*
* @cond
*********************************************************************************************************************
* XMClib v2.1.8 - XMC Peripheral Driver Library
*
* Copyright (c) 2015-2016, 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 <br>
* 2015-02-20:
* - Removed unused declarations<br>
* 2015-05-08:
* - Fixed sequence problem of low power mode in XMC_ACMP_Init() API<br>
* - Fixed wrong register setting in XMC_ACMP_SetInput() API<br>
* - Removed return type variable and by default comparator enable from XMC_ACMP_Init() API. <br>
* Additional call to XMC_ACMP_EnableComparator() API needed to start Comparator after Init.<br>
* 2015-06-04:
* - Removed return type variable and by default comparator enable from XMC_ACMP_Init() API. <br>
* - Divided XMC_ACMP_SetInput into two 3 APIs to reduce the code size and complexity as stated below<br>
* (a)XMC_ACMP_EnableReferenceDivider <br>
* (b)XMC_ACMP_DisableReferenceDivider <br>
* (c)XMC_ACMP_SetInput <br>
* - 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 definition of GetDriverVersion API
* @endcond
*
*/
/*********************************************************************************************************************
* HEADER FILES
********************************************************************************************************************/
#include <xmc_acmp.h>
/* If ACMP is available*/
#if defined (COMPARATOR)
/*********************************************************************************************************************
* MACROS
********************************************************************************************************************/
#define XMC_ACMP_INSTANCE_1 (1U) /* Instance number for Slice-1 */
/*********************************************************************************************************************
* API IMPLEMENTATION
********************************************************************************************************************/
/* API to initialize an instance of ACMP module */
void XMC_ACMP_Init(XMC_ACMP_t *const peripheral, uint32_t instance, const XMC_ACMP_CONFIG_t *const config)
{
XMC_ASSERT("XMC_ACMP_Init:NULL Configuration", (config != (XMC_ACMP_CONFIG_t *)NULL))
XMC_ASSERT("XMC_ACMP_Init:Wrong module pointer", XMC_ACMP_CHECK_MODULE_PTR(peripheral))
XMC_ASSERT("XMC_ACMP_Init:Wrong instance number", XMC_ACMP_CHECK_INSTANCE(instance) )
/*
* Initializes the comparator with configuration supplied. Low power node setting is retained during initialization.
* All the instances passed are handled with low power setting, to avoid conditional check for ACMP0 instance.
* This reduces the code size. No side effects, because this register bit field is empty for other instances.
*/
peripheral->ANACMP[instance] = ((peripheral->ANACMP[instance] & (uint32_t)COMPARATOR_ANACMP0_CMP_LPWR_Msk)) |
(uint32_t)config->anacmp;
}
/* API to select INP source */
void XMC_ACMP_SetInput(XMC_ACMP_t *const peripheral, uint32_t instance, XMC_ACMP_INP_SOURCE_t source)
{
XMC_ASSERT("XMC_ACMP_SetInput:Wrong module pointer", XMC_ACMP_CHECK_MODULE_PTR(peripheral))
XMC_ASSERT("XMC_ACMP_SetInput:Wrong instance number", ((instance != XMC_ACMP_INSTANCE_1) &&
XMC_ACMP_CHECK_INSTANCE(instance)) )
XMC_ASSERT("XMC_ACMP_SetInput:Wrong input source", ((source == XMC_ACMP_INP_SOURCE_STANDARD_PORT) ||
(source == XMC_ACMP_INP_SOURCE_ACMP1_INP_PORT)) )
/*
* Three options of Input Setting are listed below
* 1. The comparator inputs aren't connected to other comparator inputs
* 2. Can program the comparators to connect ACMP0.INP to ACMP1.INP in XMC1200 AA or XMC1300 AA
* Can program the comparators to connect ACMP0.INN to ACMP1.INP in XMC1200 AB or XMC1300 AB or XMC1400 AA
* 3. Can program the comparators to connect ACMP2.INP to ACMP1.INP
* 4. Can program the comparators to connect ACMP3.INP to ACMP1.INP in XMC1400
*/
peripheral->ANACMP[instance] = ((peripheral->ANACMP[instance] & (uint32_t)(~COMPARATOR_ANACMP0_ACMP0_SEL_Msk))) |
(uint32_t)source;
}
#endif /* #ifdef ACMP_AVAILABLE */