added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
bogdanm
Date:
Thu Oct 01 15:25:22 2015 +0300
Revision:
0:9b334a45a8ff
Child:
50:a417edff4437
Initial commit on mbed-dev

Replaces mbed-src (now inactive)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 0:9b334a45a8ff 1 /***************************************************************************//**
bogdanm 0:9b334a45a8ff 2 * @file em_acmp.c
bogdanm 0:9b334a45a8ff 3 * @brief Analog Comparator (ACMP) Peripheral API
bogdanm 0:9b334a45a8ff 4 * @version 3.20.12
bogdanm 0:9b334a45a8ff 5 *******************************************************************************
bogdanm 0:9b334a45a8ff 6 * @section License
bogdanm 0:9b334a45a8ff 7 * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b>
bogdanm 0:9b334a45a8ff 8 *******************************************************************************
bogdanm 0:9b334a45a8ff 9 *
bogdanm 0:9b334a45a8ff 10 * Permission is granted to anyone to use this software for any purpose,
bogdanm 0:9b334a45a8ff 11 * including commercial applications, and to alter it and redistribute it
bogdanm 0:9b334a45a8ff 12 * freely, subject to the following restrictions:
bogdanm 0:9b334a45a8ff 13 *
bogdanm 0:9b334a45a8ff 14 * 1. The origin of this software must not be misrepresented; you must not
bogdanm 0:9b334a45a8ff 15 * claim that you wrote the original software.
bogdanm 0:9b334a45a8ff 16 * 2. Altered source versions must be plainly marked as such, and must not be
bogdanm 0:9b334a45a8ff 17 * misrepresented as being the original software.
bogdanm 0:9b334a45a8ff 18 * 3. This notice may not be removed or altered from any source distribution.
bogdanm 0:9b334a45a8ff 19 *
bogdanm 0:9b334a45a8ff 20 * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no
bogdanm 0:9b334a45a8ff 21 * obligation to support this Software. Silicon Labs is providing the
bogdanm 0:9b334a45a8ff 22 * Software "AS IS", with no express or implied warranties of any kind,
bogdanm 0:9b334a45a8ff 23 * including, but not limited to, any implied warranties of merchantability
bogdanm 0:9b334a45a8ff 24 * or fitness for any particular purpose or warranties against infringement
bogdanm 0:9b334a45a8ff 25 * of any proprietary rights of a third party.
bogdanm 0:9b334a45a8ff 26 *
bogdanm 0:9b334a45a8ff 27 * Silicon Labs will not be liable for any consequential, incidental, or
bogdanm 0:9b334a45a8ff 28 * special damages, or any other relief, or for any claim by any third party,
bogdanm 0:9b334a45a8ff 29 * arising from your use of this Software.
bogdanm 0:9b334a45a8ff 30 *
bogdanm 0:9b334a45a8ff 31 ******************************************************************************/
bogdanm 0:9b334a45a8ff 32
bogdanm 0:9b334a45a8ff 33
bogdanm 0:9b334a45a8ff 34 #include "em_acmp.h"
bogdanm 0:9b334a45a8ff 35 #if defined(ACMP_COUNT) && (ACMP_COUNT > 0)
bogdanm 0:9b334a45a8ff 36
bogdanm 0:9b334a45a8ff 37 #include <stdbool.h>
bogdanm 0:9b334a45a8ff 38 #include "em_bitband.h"
bogdanm 0:9b334a45a8ff 39 #include "em_assert.h"
bogdanm 0:9b334a45a8ff 40
bogdanm 0:9b334a45a8ff 41 /***************************************************************************//**
bogdanm 0:9b334a45a8ff 42 * @addtogroup EM_Library
bogdanm 0:9b334a45a8ff 43 * @{
bogdanm 0:9b334a45a8ff 44 ******************************************************************************/
bogdanm 0:9b334a45a8ff 45
bogdanm 0:9b334a45a8ff 46 /***************************************************************************//**
bogdanm 0:9b334a45a8ff 47 * @addtogroup ACMP
bogdanm 0:9b334a45a8ff 48 * @brief Analog comparator (ACMP) Peripheral API
bogdanm 0:9b334a45a8ff 49 * @{
bogdanm 0:9b334a45a8ff 50 ******************************************************************************/
bogdanm 0:9b334a45a8ff 51
bogdanm 0:9b334a45a8ff 52 /*******************************************************************************
bogdanm 0:9b334a45a8ff 53 ******************************* DEFINES ***********************************
bogdanm 0:9b334a45a8ff 54 ******************************************************************************/
bogdanm 0:9b334a45a8ff 55
bogdanm 0:9b334a45a8ff 56 /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */
bogdanm 0:9b334a45a8ff 57
bogdanm 0:9b334a45a8ff 58
bogdanm 0:9b334a45a8ff 59 /** Validation of ACMP register block pointer reference
bogdanm 0:9b334a45a8ff 60 * for assert statements. */
bogdanm 0:9b334a45a8ff 61 #if (ACMP_COUNT == 1)
bogdanm 0:9b334a45a8ff 62 #define ACMP_REF_VALID(ref) ((ref) == ACMP0)
bogdanm 0:9b334a45a8ff 63 #elif (ACMP_COUNT == 2)
bogdanm 0:9b334a45a8ff 64 #define ACMP_REF_VALID(ref) (((ref) == ACMP0) || ((ref) == ACMP1))
bogdanm 0:9b334a45a8ff 65 #else
bogdanm 0:9b334a45a8ff 66 #error Undefined number of analog comparators (ACMP).
bogdanm 0:9b334a45a8ff 67 #endif
bogdanm 0:9b334a45a8ff 68
bogdanm 0:9b334a45a8ff 69 /** @endcond */
bogdanm 0:9b334a45a8ff 70
bogdanm 0:9b334a45a8ff 71 /*******************************************************************************
bogdanm 0:9b334a45a8ff 72 ************************** GLOBAL FUNCTIONS *******************************
bogdanm 0:9b334a45a8ff 73 ******************************************************************************/
bogdanm 0:9b334a45a8ff 74
bogdanm 0:9b334a45a8ff 75 /***************************************************************************//**
bogdanm 0:9b334a45a8ff 76 * @brief
bogdanm 0:9b334a45a8ff 77 * Sets up the ACMP for use in capacative sense applications.
bogdanm 0:9b334a45a8ff 78 *
bogdanm 0:9b334a45a8ff 79 * @details
bogdanm 0:9b334a45a8ff 80 * This function sets up the ACMP for use in capacacitve sense applications.
bogdanm 0:9b334a45a8ff 81 * To use the capacative sense functionality in the ACMP you need to use
bogdanm 0:9b334a45a8ff 82 * the PRS output of the ACMP module to count the number of oscillations
bogdanm 0:9b334a45a8ff 83 * in the capacative sense circuit (possibly using a TIMER).
bogdanm 0:9b334a45a8ff 84 *
bogdanm 0:9b334a45a8ff 85 * @note
bogdanm 0:9b334a45a8ff 86 * A basic example of capacative sensing can be found in the STK BSP
bogdanm 0:9b334a45a8ff 87 * (capsense demo).
bogdanm 0:9b334a45a8ff 88 *
bogdanm 0:9b334a45a8ff 89 * @param[in] acmp
bogdanm 0:9b334a45a8ff 90 * Pointer to ACMP peripheral register block.
bogdanm 0:9b334a45a8ff 91 *
bogdanm 0:9b334a45a8ff 92 * @param[in] init
bogdanm 0:9b334a45a8ff 93 * Pointer to initialization structure used to configure ACMP for capacative
bogdanm 0:9b334a45a8ff 94 * sensing operation.
bogdanm 0:9b334a45a8ff 95 ******************************************************************************/
bogdanm 0:9b334a45a8ff 96 void ACMP_CapsenseInit(ACMP_TypeDef *acmp, const ACMP_CapsenseInit_TypeDef *init)
bogdanm 0:9b334a45a8ff 97 {
bogdanm 0:9b334a45a8ff 98 /* Make sure the module exists on the selected chip */
bogdanm 0:9b334a45a8ff 99 EFM_ASSERT(ACMP_REF_VALID(acmp));
bogdanm 0:9b334a45a8ff 100
bogdanm 0:9b334a45a8ff 101 /* Make sure that vddLevel is within bounds */
bogdanm 0:9b334a45a8ff 102 EFM_ASSERT(init->vddLevel < 64);
bogdanm 0:9b334a45a8ff 103
bogdanm 0:9b334a45a8ff 104 /* Make sure biasprog is within bounds */
bogdanm 0:9b334a45a8ff 105 EFM_ASSERT(init->biasProg < 16);
bogdanm 0:9b334a45a8ff 106
bogdanm 0:9b334a45a8ff 107 /* Set control register. No need to set interrupt modes */
bogdanm 0:9b334a45a8ff 108 acmp->CTRL = (init->fullBias << _ACMP_CTRL_FULLBIAS_SHIFT)
bogdanm 0:9b334a45a8ff 109 | (init->halfBias << _ACMP_CTRL_HALFBIAS_SHIFT)
bogdanm 0:9b334a45a8ff 110 | (init->biasProg << _ACMP_CTRL_BIASPROG_SHIFT)
bogdanm 0:9b334a45a8ff 111 | (init->warmTime << _ACMP_CTRL_WARMTIME_SHIFT)
bogdanm 0:9b334a45a8ff 112 | (init->hysteresisLevel << _ACMP_CTRL_HYSTSEL_SHIFT);
bogdanm 0:9b334a45a8ff 113
bogdanm 0:9b334a45a8ff 114 /* Select capacative sensing mode by selecting a resistor and enabling it */
bogdanm 0:9b334a45a8ff 115 acmp->INPUTSEL = (init->resistor << _ACMP_INPUTSEL_CSRESSEL_SHIFT)
bogdanm 0:9b334a45a8ff 116 | ACMP_INPUTSEL_CSRESEN
bogdanm 0:9b334a45a8ff 117 | (init->lowPowerReferenceEnabled << _ACMP_INPUTSEL_LPREF_SHIFT)
bogdanm 0:9b334a45a8ff 118 | (init->vddLevel << _ACMP_INPUTSEL_VDDLEVEL_SHIFT)
bogdanm 0:9b334a45a8ff 119 | ACMP_INPUTSEL_NEGSEL_CAPSENSE;
bogdanm 0:9b334a45a8ff 120
bogdanm 0:9b334a45a8ff 121 /* Enable ACMP if requested.
bogdanm 0:9b334a45a8ff 122 * Note: BITBAND_Peripheral() function is used for setting/clearing single
bogdanm 0:9b334a45a8ff 123 * bit peripheral register bitfields. */
bogdanm 0:9b334a45a8ff 124 BITBAND_Peripheral(&(acmp->CTRL),
bogdanm 0:9b334a45a8ff 125 (uint32_t)_ACMP_CTRL_EN_SHIFT,
bogdanm 0:9b334a45a8ff 126 (uint32_t)init->enable);
bogdanm 0:9b334a45a8ff 127 }
bogdanm 0:9b334a45a8ff 128
bogdanm 0:9b334a45a8ff 129 /***************************************************************************//**
bogdanm 0:9b334a45a8ff 130 * @brief
bogdanm 0:9b334a45a8ff 131 * Sets the ACMP channel used for capacative sensing.
bogdanm 0:9b334a45a8ff 132 *
bogdanm 0:9b334a45a8ff 133 * @note
bogdanm 0:9b334a45a8ff 134 * A basic example of capacative sensing can be found in the STK BSP
bogdanm 0:9b334a45a8ff 135 * (capsense demo).
bogdanm 0:9b334a45a8ff 136 *
bogdanm 0:9b334a45a8ff 137 * @param[in] acmp
bogdanm 0:9b334a45a8ff 138 * Pointer to ACMP peripheral register block.
bogdanm 0:9b334a45a8ff 139 *
bogdanm 0:9b334a45a8ff 140 * @param[in] channel
bogdanm 0:9b334a45a8ff 141 * The ACMP channel to use for capacative sensing (Possel).
bogdanm 0:9b334a45a8ff 142 ******************************************************************************/
bogdanm 0:9b334a45a8ff 143 void ACMP_CapsenseChannelSet(ACMP_TypeDef *acmp, ACMP_Channel_TypeDef channel)
bogdanm 0:9b334a45a8ff 144 {
bogdanm 0:9b334a45a8ff 145 /* Make sure that only external channels are used */
bogdanm 0:9b334a45a8ff 146 EFM_ASSERT(channel <= _ACMP_INPUTSEL_POSSEL_CH7);
bogdanm 0:9b334a45a8ff 147
bogdanm 0:9b334a45a8ff 148 /* Set channel as positive channel in ACMP */
bogdanm 0:9b334a45a8ff 149 SET_BIT_FIELD(acmp->INPUTSEL, _ACMP_INPUTSEL_POSSEL_MASK, channel,
bogdanm 0:9b334a45a8ff 150 _ACMP_INPUTSEL_POSSEL_SHIFT);
bogdanm 0:9b334a45a8ff 151 }
bogdanm 0:9b334a45a8ff 152
bogdanm 0:9b334a45a8ff 153 /***************************************************************************//**
bogdanm 0:9b334a45a8ff 154 * @brief
bogdanm 0:9b334a45a8ff 155 * Disables the ACMP.
bogdanm 0:9b334a45a8ff 156 *
bogdanm 0:9b334a45a8ff 157 * @param[in] acmp
bogdanm 0:9b334a45a8ff 158 * Pointer to ACMP peripheral register block.
bogdanm 0:9b334a45a8ff 159 ******************************************************************************/
bogdanm 0:9b334a45a8ff 160 void ACMP_Disable(ACMP_TypeDef *acmp)
bogdanm 0:9b334a45a8ff 161 {
bogdanm 0:9b334a45a8ff 162 acmp->CTRL &= ~ACMP_CTRL_EN;
bogdanm 0:9b334a45a8ff 163 }
bogdanm 0:9b334a45a8ff 164
bogdanm 0:9b334a45a8ff 165 /***************************************************************************//**
bogdanm 0:9b334a45a8ff 166 * @brief
bogdanm 0:9b334a45a8ff 167 * Enables the ACMP.
bogdanm 0:9b334a45a8ff 168 *
bogdanm 0:9b334a45a8ff 169 * @param[in] acmp
bogdanm 0:9b334a45a8ff 170 * Pointer to ACMP peripheral register block.
bogdanm 0:9b334a45a8ff 171 ******************************************************************************/
bogdanm 0:9b334a45a8ff 172 void ACMP_Enable(ACMP_TypeDef *acmp)
bogdanm 0:9b334a45a8ff 173 {
bogdanm 0:9b334a45a8ff 174 acmp->CTRL |= ACMP_CTRL_EN;
bogdanm 0:9b334a45a8ff 175 }
bogdanm 0:9b334a45a8ff 176
bogdanm 0:9b334a45a8ff 177 /***************************************************************************//**
bogdanm 0:9b334a45a8ff 178 * @brief
bogdanm 0:9b334a45a8ff 179 * Reset ACMP to same state as after a HW reset.
bogdanm 0:9b334a45a8ff 180 *
bogdanm 0:9b334a45a8ff 181 * @note
bogdanm 0:9b334a45a8ff 182 * The ROUTE register is NOT reset by this function, in order to allow for
bogdanm 0:9b334a45a8ff 183 * centralized setup of this feature.
bogdanm 0:9b334a45a8ff 184 *
bogdanm 0:9b334a45a8ff 185 * @param[in] acmp
bogdanm 0:9b334a45a8ff 186 * Pointer to the ACMP peripheral register block.
bogdanm 0:9b334a45a8ff 187 ******************************************************************************/
bogdanm 0:9b334a45a8ff 188 void ACMP_Reset(ACMP_TypeDef *acmp)
bogdanm 0:9b334a45a8ff 189 {
bogdanm 0:9b334a45a8ff 190 /* Make sure the module exists on the selected chip */
bogdanm 0:9b334a45a8ff 191 EFM_ASSERT(ACMP_REF_VALID(acmp));
bogdanm 0:9b334a45a8ff 192
bogdanm 0:9b334a45a8ff 193 acmp->CTRL = _ACMP_CTRL_RESETVALUE;
bogdanm 0:9b334a45a8ff 194 acmp->INPUTSEL = _ACMP_INPUTSEL_RESETVALUE;
bogdanm 0:9b334a45a8ff 195 acmp->IEN = _ACMP_IEN_RESETVALUE;
bogdanm 0:9b334a45a8ff 196 acmp->IFC = _ACMP_IF_MASK;
bogdanm 0:9b334a45a8ff 197 }
bogdanm 0:9b334a45a8ff 198
bogdanm 0:9b334a45a8ff 199 /***************************************************************************//**
bogdanm 0:9b334a45a8ff 200 * @brief
bogdanm 0:9b334a45a8ff 201 * Sets up GPIO output from the ACMP.
bogdanm 0:9b334a45a8ff 202 *
bogdanm 0:9b334a45a8ff 203 * @note
bogdanm 0:9b334a45a8ff 204 * GPIO must be enabled in the CMU before this function call, i.e.
bogdanm 0:9b334a45a8ff 205 * @verbatim CMU_ClockEnable(cmuClock_GPIO, true); @endverbatim
bogdanm 0:9b334a45a8ff 206 *
bogdanm 0:9b334a45a8ff 207 * @param[in] acmp
bogdanm 0:9b334a45a8ff 208 * Pointer to the ACMP peripheral register block.
bogdanm 0:9b334a45a8ff 209 *
bogdanm 0:9b334a45a8ff 210 * @param location
bogdanm 0:9b334a45a8ff 211 * The pin location to use. See the datasheet for location to pin mappings.
bogdanm 0:9b334a45a8ff 212 *
bogdanm 0:9b334a45a8ff 213 * @param enable
bogdanm 0:9b334a45a8ff 214 * Enable or disable pin output.
bogdanm 0:9b334a45a8ff 215 *
bogdanm 0:9b334a45a8ff 216 * @param invert
bogdanm 0:9b334a45a8ff 217 * Invert output.
bogdanm 0:9b334a45a8ff 218 ******************************************************************************/
bogdanm 0:9b334a45a8ff 219 void ACMP_GPIOSetup(ACMP_TypeDef *acmp, uint32_t location, bool enable, bool invert)
bogdanm 0:9b334a45a8ff 220 {
bogdanm 0:9b334a45a8ff 221 /* Sanity checking of location */
bogdanm 0:9b334a45a8ff 222 #if defined( _ACMP_ROUTE_LOCATION_LOC3 )
bogdanm 0:9b334a45a8ff 223 EFM_ASSERT(location <= _ACMP_ROUTE_LOCATION_LOC3);
bogdanm 0:9b334a45a8ff 224
bogdanm 0:9b334a45a8ff 225 #elif defined( _ACMP_ROUTE_LOCATION_LOC2 )
bogdanm 0:9b334a45a8ff 226 EFM_ASSERT(location <= _ACMP_ROUTE_LOCATION_LOC2);
bogdanm 0:9b334a45a8ff 227
bogdanm 0:9b334a45a8ff 228 #elif defined( _ACMP_ROUTE_LOCATION_LOC1 )
bogdanm 0:9b334a45a8ff 229 EFM_ASSERT(location <= _ACMP_ROUTE_LOCATION_LOC1);
bogdanm 0:9b334a45a8ff 230
bogdanm 0:9b334a45a8ff 231 #else
bogdanm 0:9b334a45a8ff 232 #error Illegal pin location (ACMP).
bogdanm 0:9b334a45a8ff 233 #endif
bogdanm 0:9b334a45a8ff 234
bogdanm 0:9b334a45a8ff 235
bogdanm 0:9b334a45a8ff 236 /* Set GPIO inversion */
bogdanm 0:9b334a45a8ff 237 SET_BIT_FIELD(acmp->CTRL, _ACMP_CTRL_GPIOINV_MASK, invert,
bogdanm 0:9b334a45a8ff 238 _ACMP_CTRL_GPIOINV_SHIFT);
bogdanm 0:9b334a45a8ff 239
bogdanm 0:9b334a45a8ff 240 acmp->ROUTE = (location << _ACMP_ROUTE_LOCATION_SHIFT)
bogdanm 0:9b334a45a8ff 241 | (enable << _ACMP_ROUTE_ACMPPEN_SHIFT);
bogdanm 0:9b334a45a8ff 242 }
bogdanm 0:9b334a45a8ff 243
bogdanm 0:9b334a45a8ff 244 /***************************************************************************//**
bogdanm 0:9b334a45a8ff 245 * @brief
bogdanm 0:9b334a45a8ff 246 * Sets which channels should be used in ACMP comparisons.
bogdanm 0:9b334a45a8ff 247 *
bogdanm 0:9b334a45a8ff 248 * @param[in] acmp
bogdanm 0:9b334a45a8ff 249 * Pointer to the ACMP peripheral register block.
bogdanm 0:9b334a45a8ff 250 *
bogdanm 0:9b334a45a8ff 251 * @param negSel
bogdanm 0:9b334a45a8ff 252 * Channel to use on the negative input to the ACMP.
bogdanm 0:9b334a45a8ff 253 *
bogdanm 0:9b334a45a8ff 254 * @param posSel
bogdanm 0:9b334a45a8ff 255 * Channel to use on the positive input to the ACMP.
bogdanm 0:9b334a45a8ff 256 ******************************************************************************/
bogdanm 0:9b334a45a8ff 257 void ACMP_ChannelSet(ACMP_TypeDef *acmp, ACMP_Channel_TypeDef negSel,
bogdanm 0:9b334a45a8ff 258 ACMP_Channel_TypeDef posSel)
bogdanm 0:9b334a45a8ff 259 {
bogdanm 0:9b334a45a8ff 260 /* Sanity checking of ACMP inputs */
bogdanm 0:9b334a45a8ff 261 EFM_ASSERT(posSel <= _ACMP_INPUTSEL_POSSEL_CH7);
bogdanm 0:9b334a45a8ff 262
bogdanm 0:9b334a45a8ff 263 #if defined(_ACMP_INPUTSEL_NEGSEL_DAC0CH1)
bogdanm 0:9b334a45a8ff 264 EFM_ASSERT(negSel <= _ACMP_INPUTSEL_NEGSEL_DAC0CH1);
bogdanm 0:9b334a45a8ff 265 #elif defined(_ACMP_INPUTSEL_NEGSEL_CAPSENSE)
bogdanm 0:9b334a45a8ff 266 EFM_ASSERT(negSel <= _ACMP_INPUTSEL_NEGSEL_CAPSENSE);
bogdanm 0:9b334a45a8ff 267 #else
bogdanm 0:9b334a45a8ff 268 #error Illegal negative input selection (ACMP).
bogdanm 0:9b334a45a8ff 269 #endif
bogdanm 0:9b334a45a8ff 270
bogdanm 0:9b334a45a8ff 271 acmp->INPUTSEL = (acmp->INPUTSEL & ~(_ACMP_INPUTSEL_POSSEL_MASK |
bogdanm 0:9b334a45a8ff 272 _ACMP_INPUTSEL_NEGSEL_MASK))
bogdanm 0:9b334a45a8ff 273 | (negSel << _ACMP_INPUTSEL_NEGSEL_SHIFT)
bogdanm 0:9b334a45a8ff 274 | (posSel << _ACMP_INPUTSEL_POSSEL_SHIFT);
bogdanm 0:9b334a45a8ff 275 }
bogdanm 0:9b334a45a8ff 276
bogdanm 0:9b334a45a8ff 277 /***************************************************************************//**
bogdanm 0:9b334a45a8ff 278 * @brief
bogdanm 0:9b334a45a8ff 279 *
bogdanm 0:9b334a45a8ff 280 *
bogdanm 0:9b334a45a8ff 281 * @param[in] acmp
bogdanm 0:9b334a45a8ff 282 * Pointer to the ACMP peripheral register block.
bogdanm 0:9b334a45a8ff 283 *
bogdanm 0:9b334a45a8ff 284 * @param[in] init
bogdanm 0:9b334a45a8ff 285 * Pointer to initialization structure used to configure ACMP for capacative
bogdanm 0:9b334a45a8ff 286 * sensing operation.
bogdanm 0:9b334a45a8ff 287 ******************************************************************************/
bogdanm 0:9b334a45a8ff 288 void ACMP_Init(ACMP_TypeDef *acmp, const ACMP_Init_TypeDef *init)
bogdanm 0:9b334a45a8ff 289 {
bogdanm 0:9b334a45a8ff 290 /* Make sure the module exists on the selected chip */
bogdanm 0:9b334a45a8ff 291 EFM_ASSERT(ACMP_REF_VALID(acmp));
bogdanm 0:9b334a45a8ff 292
bogdanm 0:9b334a45a8ff 293 /* Make sure biasprog is within bounds */
bogdanm 0:9b334a45a8ff 294 EFM_ASSERT(init->biasProg < 16);
bogdanm 0:9b334a45a8ff 295
bogdanm 0:9b334a45a8ff 296 /* Set control register. No need to set interrupt modes */
bogdanm 0:9b334a45a8ff 297 acmp->CTRL = (init->fullBias << _ACMP_CTRL_FULLBIAS_SHIFT)
bogdanm 0:9b334a45a8ff 298 | (init->halfBias << _ACMP_CTRL_HALFBIAS_SHIFT)
bogdanm 0:9b334a45a8ff 299 | (init->biasProg << _ACMP_CTRL_BIASPROG_SHIFT)
bogdanm 0:9b334a45a8ff 300 | (init->interruptOnFallingEdge << _ACMP_CTRL_IFALL_SHIFT)
bogdanm 0:9b334a45a8ff 301 | (init->interruptOnRisingEdge << _ACMP_CTRL_IRISE_SHIFT)
bogdanm 0:9b334a45a8ff 302 | (init->warmTime << _ACMP_CTRL_WARMTIME_SHIFT)
bogdanm 0:9b334a45a8ff 303 | (init->hysteresisLevel << _ACMP_CTRL_HYSTSEL_SHIFT)
bogdanm 0:9b334a45a8ff 304 | (init->inactiveValue << _ACMP_CTRL_INACTVAL_SHIFT);
bogdanm 0:9b334a45a8ff 305
bogdanm 0:9b334a45a8ff 306 acmp->INPUTSEL = (init->lowPowerReferenceEnabled << _ACMP_INPUTSEL_LPREF_SHIFT)
bogdanm 0:9b334a45a8ff 307 | (init->vddLevel << _ACMP_INPUTSEL_VDDLEVEL_SHIFT);
bogdanm 0:9b334a45a8ff 308
bogdanm 0:9b334a45a8ff 309 /* Enable ACMP if requested.
bogdanm 0:9b334a45a8ff 310 * Note: BITBAND_Peripheral() function is used for setting/clearing single
bogdanm 0:9b334a45a8ff 311 * bit peripheral register bitfields. */
bogdanm 0:9b334a45a8ff 312 BITBAND_Peripheral(&(acmp->CTRL),
bogdanm 0:9b334a45a8ff 313 (uint32_t)_ACMP_CTRL_EN_SHIFT,
bogdanm 0:9b334a45a8ff 314 (uint32_t)init->enable);
bogdanm 0:9b334a45a8ff 315 }
bogdanm 0:9b334a45a8ff 316
bogdanm 0:9b334a45a8ff 317
bogdanm 0:9b334a45a8ff 318 /** @} (end addtogroup ACMP) */
bogdanm 0:9b334a45a8ff 319 /** @} (end addtogroup EM_Library) */
bogdanm 0:9b334a45a8ff 320 #endif /* defined(ACMP_COUNT) && (ACMP_COUNT > 0) */