added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
mbed_official
Date:
Fri Jan 15 07:45:16 2016 +0000
Revision:
50:a417edff4437
Parent:
0:9b334a45a8ff
Child:
144:ef7eb2e8f9f7
Synchronized with git revision 6010f32619bfcbb01cc73747d4ff9040863482d9

Full URL: https://github.com/mbedmicro/mbed/commit/6010f32619bfcbb01cc73747d4ff9040863482d9/

Remove doubling of buffer size in realiseEndpoint()

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
mbed_official 50:a417edff4437 4 * @version 4.2.1
bogdanm 0:9b334a45a8ff 5 *******************************************************************************
bogdanm 0:9b334a45a8ff 6 * @section License
mbed_official 50:a417edff4437 7 * <b>(C) Copyright 2015 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>
mbed_official 50:a417edff4437 38 #include "em_bus.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
mbed_official 50:a417edff4437 69 /** The maximum value that can be inserted in the route location register
mbed_official 50:a417edff4437 70 * for the specific device. */
mbed_official 50:a417edff4437 71 #if defined(_ACMP_ROUTE_LOCATION_LOC3)
mbed_official 50:a417edff4437 72 #define _ACMP_ROUTE_LOCATION_MAX _ACMP_ROUTE_LOCATION_LOC3
mbed_official 50:a417edff4437 73 #elif defined(_ACMP_ROUTE_LOCATION_LOC2)
mbed_official 50:a417edff4437 74 #define _ACMP_ROUTE_LOCATION_MAX _ACMP_ROUTE_LOCATION_LOC2
mbed_official 50:a417edff4437 75 #elif defined(_ACMP_ROUTE_LOCATION_LOC1)
mbed_official 50:a417edff4437 76 #define _ACMP_ROUTE_LOCATION_MAX _ACMP_ROUTE_LOCATION_LOC1
mbed_official 50:a417edff4437 77 #elif defined(_ACMP_ROUTELOC0_OUTLOC_LOC31)
mbed_official 50:a417edff4437 78 #define _ACMP_ROUTE_LOCATION_MAX _ACMP_ROUTELOC0_OUTLOC_LOC31
mbed_official 50:a417edff4437 79 #else
mbed_official 50:a417edff4437 80 #error Undefined max route locations
mbed_official 50:a417edff4437 81 #endif
mbed_official 50:a417edff4437 82
bogdanm 0:9b334a45a8ff 83 /** @endcond */
bogdanm 0:9b334a45a8ff 84
bogdanm 0:9b334a45a8ff 85 /*******************************************************************************
bogdanm 0:9b334a45a8ff 86 ************************** GLOBAL FUNCTIONS *******************************
bogdanm 0:9b334a45a8ff 87 ******************************************************************************/
bogdanm 0:9b334a45a8ff 88
bogdanm 0:9b334a45a8ff 89 /***************************************************************************//**
bogdanm 0:9b334a45a8ff 90 * @brief
bogdanm 0:9b334a45a8ff 91 * Sets up the ACMP for use in capacative sense applications.
bogdanm 0:9b334a45a8ff 92 *
bogdanm 0:9b334a45a8ff 93 * @details
bogdanm 0:9b334a45a8ff 94 * This function sets up the ACMP for use in capacacitve sense applications.
bogdanm 0:9b334a45a8ff 95 * To use the capacative sense functionality in the ACMP you need to use
bogdanm 0:9b334a45a8ff 96 * the PRS output of the ACMP module to count the number of oscillations
bogdanm 0:9b334a45a8ff 97 * in the capacative sense circuit (possibly using a TIMER).
bogdanm 0:9b334a45a8ff 98 *
bogdanm 0:9b334a45a8ff 99 * @note
bogdanm 0:9b334a45a8ff 100 * A basic example of capacative sensing can be found in the STK BSP
bogdanm 0:9b334a45a8ff 101 * (capsense demo).
bogdanm 0:9b334a45a8ff 102 *
bogdanm 0:9b334a45a8ff 103 * @param[in] acmp
bogdanm 0:9b334a45a8ff 104 * Pointer to ACMP peripheral register block.
bogdanm 0:9b334a45a8ff 105 *
bogdanm 0:9b334a45a8ff 106 * @param[in] init
bogdanm 0:9b334a45a8ff 107 * Pointer to initialization structure used to configure ACMP for capacative
bogdanm 0:9b334a45a8ff 108 * sensing operation.
bogdanm 0:9b334a45a8ff 109 ******************************************************************************/
bogdanm 0:9b334a45a8ff 110 void ACMP_CapsenseInit(ACMP_TypeDef *acmp, const ACMP_CapsenseInit_TypeDef *init)
bogdanm 0:9b334a45a8ff 111 {
bogdanm 0:9b334a45a8ff 112 /* Make sure the module exists on the selected chip */
bogdanm 0:9b334a45a8ff 113 EFM_ASSERT(ACMP_REF_VALID(acmp));
bogdanm 0:9b334a45a8ff 114
bogdanm 0:9b334a45a8ff 115 /* Make sure that vddLevel is within bounds */
mbed_official 50:a417edff4437 116 #if defined(_ACMP_INPUTSEL_VDDLEVEL_MASK)
bogdanm 0:9b334a45a8ff 117 EFM_ASSERT(init->vddLevel < 64);
mbed_official 50:a417edff4437 118 #else
mbed_official 50:a417edff4437 119 EFM_ASSERT(init->vddLevelLow < 64);
mbed_official 50:a417edff4437 120 EFM_ASSERT(init->vddLevelHigh < 64);
mbed_official 50:a417edff4437 121 #endif
bogdanm 0:9b334a45a8ff 122
bogdanm 0:9b334a45a8ff 123 /* Make sure biasprog is within bounds */
mbed_official 50:a417edff4437 124 EFM_ASSERT(init->biasProg <=
mbed_official 50:a417edff4437 125 (_ACMP_CTRL_BIASPROG_MASK >> _ACMP_CTRL_BIASPROG_SHIFT));
bogdanm 0:9b334a45a8ff 126
bogdanm 0:9b334a45a8ff 127 /* Set control register. No need to set interrupt modes */
bogdanm 0:9b334a45a8ff 128 acmp->CTRL = (init->fullBias << _ACMP_CTRL_FULLBIAS_SHIFT)
mbed_official 50:a417edff4437 129 #if defined(_ACMP_CTRL_HALFBIAS_MASK)
bogdanm 0:9b334a45a8ff 130 | (init->halfBias << _ACMP_CTRL_HALFBIAS_SHIFT)
mbed_official 50:a417edff4437 131 #endif
bogdanm 0:9b334a45a8ff 132 | (init->biasProg << _ACMP_CTRL_BIASPROG_SHIFT)
mbed_official 50:a417edff4437 133 #if defined(_ACMP_CTRL_WARMTIME_MASK)
bogdanm 0:9b334a45a8ff 134 | (init->warmTime << _ACMP_CTRL_WARMTIME_SHIFT)
mbed_official 50:a417edff4437 135 #endif
mbed_official 50:a417edff4437 136 #if defined(_ACMP_CTRL_HYSTSEL_MASK)
mbed_official 50:a417edff4437 137 | (init->hysteresisLevel << _ACMP_CTRL_HYSTSEL_SHIFT)
mbed_official 50:a417edff4437 138 #endif
mbed_official 50:a417edff4437 139 #if defined(_ACMP_CTRL_ACCURACY_MASK)
mbed_official 50:a417edff4437 140 | ACMP_CTRL_ACCURACY_HIGH
mbed_official 50:a417edff4437 141 #endif
mbed_official 50:a417edff4437 142 ;
mbed_official 50:a417edff4437 143
mbed_official 50:a417edff4437 144 #if defined(_ACMP_HYSTERESIS0_MASK)
mbed_official 50:a417edff4437 145 acmp->HYSTERESIS0 = (init->vddLevelHigh << _ACMP_HYSTERESIS0_DIVVA_SHIFT)
mbed_official 50:a417edff4437 146 | (init->hysteresisLevel_0 << _ACMP_HYSTERESIS0_HYST_SHIFT);
mbed_official 50:a417edff4437 147 acmp->HYSTERESIS1 = (init->vddLevelLow << _ACMP_HYSTERESIS1_DIVVA_SHIFT)
mbed_official 50:a417edff4437 148 | (init->hysteresisLevel_1 << _ACMP_HYSTERESIS1_HYST_SHIFT);
mbed_official 50:a417edff4437 149 #endif
bogdanm 0:9b334a45a8ff 150
bogdanm 0:9b334a45a8ff 151 /* Select capacative sensing mode by selecting a resistor and enabling it */
bogdanm 0:9b334a45a8ff 152 acmp->INPUTSEL = (init->resistor << _ACMP_INPUTSEL_CSRESSEL_SHIFT)
bogdanm 0:9b334a45a8ff 153 | ACMP_INPUTSEL_CSRESEN
mbed_official 50:a417edff4437 154 #if defined(_ACMP_INPUTSEL_LPREF_MASK)
bogdanm 0:9b334a45a8ff 155 | (init->lowPowerReferenceEnabled << _ACMP_INPUTSEL_LPREF_SHIFT)
mbed_official 50:a417edff4437 156 #endif
mbed_official 50:a417edff4437 157 #if defined(_ACMP_INPUTSEL_VDDLEVEL_MASK)
bogdanm 0:9b334a45a8ff 158 | (init->vddLevel << _ACMP_INPUTSEL_VDDLEVEL_SHIFT)
mbed_official 50:a417edff4437 159 #endif
mbed_official 50:a417edff4437 160 #if defined(ACMP_INPUTSEL_NEGSEL_CAPSENSE)
mbed_official 50:a417edff4437 161 | ACMP_INPUTSEL_NEGSEL_CAPSENSE
mbed_official 50:a417edff4437 162 #else
mbed_official 50:a417edff4437 163 | ACMP_INPUTSEL_VASEL_VDD
mbed_official 50:a417edff4437 164 | ACMP_INPUTSEL_NEGSEL_VADIV
mbed_official 50:a417edff4437 165 #endif
mbed_official 50:a417edff4437 166 ;
bogdanm 0:9b334a45a8ff 167
mbed_official 50:a417edff4437 168 /* Enable ACMP if requested. */
mbed_official 50:a417edff4437 169 BUS_RegBitWrite(&(acmp->CTRL), _ACMP_CTRL_EN_SHIFT, init->enable);
bogdanm 0:9b334a45a8ff 170 }
bogdanm 0:9b334a45a8ff 171
bogdanm 0:9b334a45a8ff 172 /***************************************************************************//**
bogdanm 0:9b334a45a8ff 173 * @brief
bogdanm 0:9b334a45a8ff 174 * Sets the ACMP channel used for capacative sensing.
bogdanm 0:9b334a45a8ff 175 *
bogdanm 0:9b334a45a8ff 176 * @note
bogdanm 0:9b334a45a8ff 177 * A basic example of capacative sensing can be found in the STK BSP
bogdanm 0:9b334a45a8ff 178 * (capsense demo).
bogdanm 0:9b334a45a8ff 179 *
bogdanm 0:9b334a45a8ff 180 * @param[in] acmp
bogdanm 0:9b334a45a8ff 181 * Pointer to ACMP peripheral register block.
bogdanm 0:9b334a45a8ff 182 *
bogdanm 0:9b334a45a8ff 183 * @param[in] channel
bogdanm 0:9b334a45a8ff 184 * The ACMP channel to use for capacative sensing (Possel).
bogdanm 0:9b334a45a8ff 185 ******************************************************************************/
bogdanm 0:9b334a45a8ff 186 void ACMP_CapsenseChannelSet(ACMP_TypeDef *acmp, ACMP_Channel_TypeDef channel)
bogdanm 0:9b334a45a8ff 187 {
mbed_official 50:a417edff4437 188 /* Make sure the module exists on the selected chip */
mbed_official 50:a417edff4437 189 EFM_ASSERT(ACMP_REF_VALID(acmp));
mbed_official 50:a417edff4437 190
mbed_official 50:a417edff4437 191 #if defined(_ACMP_INPUTSEL_POSSEL_CH7)
bogdanm 0:9b334a45a8ff 192 /* Make sure that only external channels are used */
bogdanm 0:9b334a45a8ff 193 EFM_ASSERT(channel <= _ACMP_INPUTSEL_POSSEL_CH7);
mbed_official 50:a417edff4437 194 #elif defined(_ACMP_INPUTSEL_POSSEL_BUS4XCH31)
mbed_official 50:a417edff4437 195 /* Make sure that only external channels are used */
mbed_official 50:a417edff4437 196 EFM_ASSERT(channel <= _ACMP_INPUTSEL_POSSEL_BUS4XCH31);
mbed_official 50:a417edff4437 197 #endif
bogdanm 0:9b334a45a8ff 198
bogdanm 0:9b334a45a8ff 199 /* Set channel as positive channel in ACMP */
mbed_official 50:a417edff4437 200 BUS_RegMaskedWrite(&acmp->INPUTSEL, _ACMP_INPUTSEL_POSSEL_MASK,
mbed_official 50:a417edff4437 201 channel << _ACMP_INPUTSEL_POSSEL_SHIFT);
bogdanm 0:9b334a45a8ff 202 }
bogdanm 0:9b334a45a8ff 203
bogdanm 0:9b334a45a8ff 204 /***************************************************************************//**
bogdanm 0:9b334a45a8ff 205 * @brief
bogdanm 0:9b334a45a8ff 206 * Disables the ACMP.
bogdanm 0:9b334a45a8ff 207 *
bogdanm 0:9b334a45a8ff 208 * @param[in] acmp
bogdanm 0:9b334a45a8ff 209 * Pointer to ACMP peripheral register block.
bogdanm 0:9b334a45a8ff 210 ******************************************************************************/
bogdanm 0:9b334a45a8ff 211 void ACMP_Disable(ACMP_TypeDef *acmp)
bogdanm 0:9b334a45a8ff 212 {
mbed_official 50:a417edff4437 213 /* Make sure the module exists on the selected chip */
mbed_official 50:a417edff4437 214 EFM_ASSERT(ACMP_REF_VALID(acmp));
mbed_official 50:a417edff4437 215
bogdanm 0:9b334a45a8ff 216 acmp->CTRL &= ~ACMP_CTRL_EN;
bogdanm 0:9b334a45a8ff 217 }
bogdanm 0:9b334a45a8ff 218
bogdanm 0:9b334a45a8ff 219 /***************************************************************************//**
bogdanm 0:9b334a45a8ff 220 * @brief
bogdanm 0:9b334a45a8ff 221 * Enables the ACMP.
bogdanm 0:9b334a45a8ff 222 *
bogdanm 0:9b334a45a8ff 223 * @param[in] acmp
bogdanm 0:9b334a45a8ff 224 * Pointer to ACMP peripheral register block.
bogdanm 0:9b334a45a8ff 225 ******************************************************************************/
bogdanm 0:9b334a45a8ff 226 void ACMP_Enable(ACMP_TypeDef *acmp)
bogdanm 0:9b334a45a8ff 227 {
mbed_official 50:a417edff4437 228 /* Make sure the module exists on the selected chip */
mbed_official 50:a417edff4437 229 EFM_ASSERT(ACMP_REF_VALID(acmp));
mbed_official 50:a417edff4437 230
bogdanm 0:9b334a45a8ff 231 acmp->CTRL |= ACMP_CTRL_EN;
bogdanm 0:9b334a45a8ff 232 }
bogdanm 0:9b334a45a8ff 233
bogdanm 0:9b334a45a8ff 234 /***************************************************************************//**
bogdanm 0:9b334a45a8ff 235 * @brief
bogdanm 0:9b334a45a8ff 236 * Reset ACMP to same state as after a HW reset.
bogdanm 0:9b334a45a8ff 237 *
bogdanm 0:9b334a45a8ff 238 * @note
bogdanm 0:9b334a45a8ff 239 * The ROUTE register is NOT reset by this function, in order to allow for
bogdanm 0:9b334a45a8ff 240 * centralized setup of this feature.
bogdanm 0:9b334a45a8ff 241 *
bogdanm 0:9b334a45a8ff 242 * @param[in] acmp
bogdanm 0:9b334a45a8ff 243 * Pointer to the ACMP peripheral register block.
bogdanm 0:9b334a45a8ff 244 ******************************************************************************/
bogdanm 0:9b334a45a8ff 245 void ACMP_Reset(ACMP_TypeDef *acmp)
bogdanm 0:9b334a45a8ff 246 {
bogdanm 0:9b334a45a8ff 247 /* Make sure the module exists on the selected chip */
bogdanm 0:9b334a45a8ff 248 EFM_ASSERT(ACMP_REF_VALID(acmp));
bogdanm 0:9b334a45a8ff 249
mbed_official 50:a417edff4437 250 acmp->CTRL = _ACMP_CTRL_RESETVALUE;
mbed_official 50:a417edff4437 251 acmp->INPUTSEL = _ACMP_INPUTSEL_RESETVALUE;
mbed_official 50:a417edff4437 252 #if defined(_ACMP_HYSTERESIS0_HYST_MASK)
mbed_official 50:a417edff4437 253 acmp->HYSTERESIS0 = _ACMP_HYSTERESIS0_RESETVALUE;
mbed_official 50:a417edff4437 254 acmp->HYSTERESIS1 = _ACMP_HYSTERESIS1_RESETVALUE;
mbed_official 50:a417edff4437 255 #endif
mbed_official 50:a417edff4437 256 acmp->IEN = _ACMP_IEN_RESETVALUE;
mbed_official 50:a417edff4437 257 acmp->IFC = _ACMP_IF_MASK;
bogdanm 0:9b334a45a8ff 258 }
bogdanm 0:9b334a45a8ff 259
bogdanm 0:9b334a45a8ff 260 /***************************************************************************//**
bogdanm 0:9b334a45a8ff 261 * @brief
bogdanm 0:9b334a45a8ff 262 * Sets up GPIO output from the ACMP.
bogdanm 0:9b334a45a8ff 263 *
bogdanm 0:9b334a45a8ff 264 * @note
bogdanm 0:9b334a45a8ff 265 * GPIO must be enabled in the CMU before this function call, i.e.
bogdanm 0:9b334a45a8ff 266 * @verbatim CMU_ClockEnable(cmuClock_GPIO, true); @endverbatim
bogdanm 0:9b334a45a8ff 267 *
bogdanm 0:9b334a45a8ff 268 * @param[in] acmp
bogdanm 0:9b334a45a8ff 269 * Pointer to the ACMP peripheral register block.
bogdanm 0:9b334a45a8ff 270 *
bogdanm 0:9b334a45a8ff 271 * @param location
bogdanm 0:9b334a45a8ff 272 * The pin location to use. See the datasheet for location to pin mappings.
bogdanm 0:9b334a45a8ff 273 *
bogdanm 0:9b334a45a8ff 274 * @param enable
bogdanm 0:9b334a45a8ff 275 * Enable or disable pin output.
bogdanm 0:9b334a45a8ff 276 *
bogdanm 0:9b334a45a8ff 277 * @param invert
bogdanm 0:9b334a45a8ff 278 * Invert output.
bogdanm 0:9b334a45a8ff 279 ******************************************************************************/
bogdanm 0:9b334a45a8ff 280 void ACMP_GPIOSetup(ACMP_TypeDef *acmp, uint32_t location, bool enable, bool invert)
bogdanm 0:9b334a45a8ff 281 {
mbed_official 50:a417edff4437 282 /* Make sure the module exists on the selected chip */
mbed_official 50:a417edff4437 283 EFM_ASSERT(ACMP_REF_VALID(acmp));
bogdanm 0:9b334a45a8ff 284
mbed_official 50:a417edff4437 285 /* Sanity checking of location */
mbed_official 50:a417edff4437 286 EFM_ASSERT(location <= _ACMP_ROUTE_LOCATION_MAX);
bogdanm 0:9b334a45a8ff 287
bogdanm 0:9b334a45a8ff 288 /* Set GPIO inversion */
mbed_official 50:a417edff4437 289 BUS_RegMaskedWrite(&acmp->CTRL, _ACMP_CTRL_GPIOINV_MASK,
mbed_official 50:a417edff4437 290 invert << _ACMP_CTRL_GPIOINV_SHIFT);
bogdanm 0:9b334a45a8ff 291
mbed_official 50:a417edff4437 292 #if defined(_ACMP_ROUTE_MASK)
bogdanm 0:9b334a45a8ff 293 acmp->ROUTE = (location << _ACMP_ROUTE_LOCATION_SHIFT)
bogdanm 0:9b334a45a8ff 294 | (enable << _ACMP_ROUTE_ACMPPEN_SHIFT);
mbed_official 50:a417edff4437 295 #endif
mbed_official 50:a417edff4437 296 #if defined(_ACMP_ROUTELOC0_MASK)
mbed_official 50:a417edff4437 297 acmp->ROUTELOC0 = location << _ACMP_ROUTELOC0_OUTLOC_SHIFT;
mbed_official 50:a417edff4437 298 acmp->ROUTEPEN = enable ? ACMP_ROUTEPEN_OUTPEN : 0;
mbed_official 50:a417edff4437 299 #endif
bogdanm 0:9b334a45a8ff 300 }
bogdanm 0:9b334a45a8ff 301
bogdanm 0:9b334a45a8ff 302 /***************************************************************************//**
bogdanm 0:9b334a45a8ff 303 * @brief
bogdanm 0:9b334a45a8ff 304 * Sets which channels should be used in ACMP comparisons.
bogdanm 0:9b334a45a8ff 305 *
bogdanm 0:9b334a45a8ff 306 * @param[in] acmp
bogdanm 0:9b334a45a8ff 307 * Pointer to the ACMP peripheral register block.
bogdanm 0:9b334a45a8ff 308 *
bogdanm 0:9b334a45a8ff 309 * @param negSel
bogdanm 0:9b334a45a8ff 310 * Channel to use on the negative input to the ACMP.
bogdanm 0:9b334a45a8ff 311 *
bogdanm 0:9b334a45a8ff 312 * @param posSel
bogdanm 0:9b334a45a8ff 313 * Channel to use on the positive input to the ACMP.
bogdanm 0:9b334a45a8ff 314 ******************************************************************************/
bogdanm 0:9b334a45a8ff 315 void ACMP_ChannelSet(ACMP_TypeDef *acmp, ACMP_Channel_TypeDef negSel,
bogdanm 0:9b334a45a8ff 316 ACMP_Channel_TypeDef posSel)
bogdanm 0:9b334a45a8ff 317 {
mbed_official 50:a417edff4437 318 /* Make sure the module exists on the selected chip */
mbed_official 50:a417edff4437 319 EFM_ASSERT(ACMP_REF_VALID(acmp));
bogdanm 0:9b334a45a8ff 320
mbed_official 50:a417edff4437 321 /* Make sure that posSel and negSel channel selectors are valid. */
bogdanm 0:9b334a45a8ff 322 #if defined(_ACMP_INPUTSEL_NEGSEL_DAC0CH1)
bogdanm 0:9b334a45a8ff 323 EFM_ASSERT(negSel <= _ACMP_INPUTSEL_NEGSEL_DAC0CH1);
bogdanm 0:9b334a45a8ff 324 #elif defined(_ACMP_INPUTSEL_NEGSEL_CAPSENSE)
bogdanm 0:9b334a45a8ff 325 EFM_ASSERT(negSel <= _ACMP_INPUTSEL_NEGSEL_CAPSENSE);
bogdanm 0:9b334a45a8ff 326 #endif
bogdanm 0:9b334a45a8ff 327
mbed_official 50:a417edff4437 328 #if defined(_ACMP_INPUTSEL_POSSEL_CH7)
mbed_official 50:a417edff4437 329 EFM_ASSERT(posSel <= _ACMP_INPUTSEL_POSSEL_CH7);
mbed_official 50:a417edff4437 330 #endif
mbed_official 50:a417edff4437 331
mbed_official 50:a417edff4437 332 acmp->INPUTSEL = (acmp->INPUTSEL & ~(_ACMP_INPUTSEL_POSSEL_MASK
mbed_official 50:a417edff4437 333 | _ACMP_INPUTSEL_NEGSEL_MASK))
bogdanm 0:9b334a45a8ff 334 | (negSel << _ACMP_INPUTSEL_NEGSEL_SHIFT)
bogdanm 0:9b334a45a8ff 335 | (posSel << _ACMP_INPUTSEL_POSSEL_SHIFT);
bogdanm 0:9b334a45a8ff 336 }
bogdanm 0:9b334a45a8ff 337
bogdanm 0:9b334a45a8ff 338 /***************************************************************************//**
bogdanm 0:9b334a45a8ff 339 * @brief
mbed_official 50:a417edff4437 340 * Initialize ACMP.
bogdanm 0:9b334a45a8ff 341 *
bogdanm 0:9b334a45a8ff 342 * @param[in] acmp
bogdanm 0:9b334a45a8ff 343 * Pointer to the ACMP peripheral register block.
bogdanm 0:9b334a45a8ff 344 *
bogdanm 0:9b334a45a8ff 345 * @param[in] init
bogdanm 0:9b334a45a8ff 346 * Pointer to initialization structure used to configure ACMP for capacative
bogdanm 0:9b334a45a8ff 347 * sensing operation.
bogdanm 0:9b334a45a8ff 348 ******************************************************************************/
bogdanm 0:9b334a45a8ff 349 void ACMP_Init(ACMP_TypeDef *acmp, const ACMP_Init_TypeDef *init)
bogdanm 0:9b334a45a8ff 350 {
bogdanm 0:9b334a45a8ff 351 /* Make sure the module exists on the selected chip */
bogdanm 0:9b334a45a8ff 352 EFM_ASSERT(ACMP_REF_VALID(acmp));
bogdanm 0:9b334a45a8ff 353
bogdanm 0:9b334a45a8ff 354 /* Make sure biasprog is within bounds */
bogdanm 0:9b334a45a8ff 355 EFM_ASSERT(init->biasProg < 16);
bogdanm 0:9b334a45a8ff 356
mbed_official 50:a417edff4437 357 /* Make sure the ACMP is disable since we might be changing the
mbed_official 50:a417edff4437 358 * ACMP power source */
mbed_official 50:a417edff4437 359 BUS_RegBitWrite(&acmp->CTRL, _ACMP_CTRL_EN_SHIFT, 0);
mbed_official 50:a417edff4437 360
bogdanm 0:9b334a45a8ff 361 /* Set control register. No need to set interrupt modes */
bogdanm 0:9b334a45a8ff 362 acmp->CTRL = (init->fullBias << _ACMP_CTRL_FULLBIAS_SHIFT)
mbed_official 50:a417edff4437 363 #if defined(_ACMP_CTRL_HALFBIAS_MASK)
bogdanm 0:9b334a45a8ff 364 | (init->halfBias << _ACMP_CTRL_HALFBIAS_SHIFT)
mbed_official 50:a417edff4437 365 #endif
bogdanm 0:9b334a45a8ff 366 | (init->biasProg << _ACMP_CTRL_BIASPROG_SHIFT)
bogdanm 0:9b334a45a8ff 367 | (init->interruptOnFallingEdge << _ACMP_CTRL_IFALL_SHIFT)
bogdanm 0:9b334a45a8ff 368 | (init->interruptOnRisingEdge << _ACMP_CTRL_IRISE_SHIFT)
mbed_official 50:a417edff4437 369 #if defined(_ACMP_CTRL_INPUTRANGE_MASK)
mbed_official 50:a417edff4437 370 | (init->inputRange << _ACMP_CTRL_INPUTRANGE_SHIFT)
mbed_official 50:a417edff4437 371 #endif
mbed_official 50:a417edff4437 372 #if defined(_ACMP_CTRL_ACCURACY_MASK)
mbed_official 50:a417edff4437 373 | (init->accuracy << _ACMP_CTRL_ACCURACY_SHIFT)
mbed_official 50:a417edff4437 374 #endif
mbed_official 50:a417edff4437 375 #if defined(_ACMP_CTRL_PWRSEL_MASK)
mbed_official 50:a417edff4437 376 | (init->powerSource << _ACMP_CTRL_PWRSEL_SHIFT)
mbed_official 50:a417edff4437 377 #endif
mbed_official 50:a417edff4437 378 #if defined(_ACMP_CTRL_WARMTIME_MASK)
bogdanm 0:9b334a45a8ff 379 | (init->warmTime << _ACMP_CTRL_WARMTIME_SHIFT)
mbed_official 50:a417edff4437 380 #endif
mbed_official 50:a417edff4437 381 #if defined(_ACMP_CTRL_HYSTSEL_MASK)
bogdanm 0:9b334a45a8ff 382 | (init->hysteresisLevel << _ACMP_CTRL_HYSTSEL_SHIFT)
mbed_official 50:a417edff4437 383 #endif
bogdanm 0:9b334a45a8ff 384 | (init->inactiveValue << _ACMP_CTRL_INACTVAL_SHIFT);
bogdanm 0:9b334a45a8ff 385
mbed_official 50:a417edff4437 386 acmp->INPUTSEL = (0)
mbed_official 50:a417edff4437 387 #if defined(_ACMP_INPUTSEL_VLPSEL_MASK)
mbed_official 50:a417edff4437 388 | (init->vlpInput << _ACMP_INPUTSEL_VLPSEL_SHIFT)
mbed_official 50:a417edff4437 389 #endif
mbed_official 50:a417edff4437 390 #if defined(_ACMP_INPUTSEL_LPREF_MASK)
mbed_official 50:a417edff4437 391 | (init->lowPowerReferenceEnabled << _ACMP_INPUTSEL_LPREF_SHIFT)
mbed_official 50:a417edff4437 392 #endif
mbed_official 50:a417edff4437 393 #if defined(_ACMP_INPUTSEL_VDDLEVEL_MASK)
mbed_official 50:a417edff4437 394 | (init->vddLevel << _ACMP_INPUTSEL_VDDLEVEL_SHIFT)
mbed_official 50:a417edff4437 395 #endif
mbed_official 50:a417edff4437 396 ;
bogdanm 0:9b334a45a8ff 397
mbed_official 50:a417edff4437 398 /* Enable ACMP if requested. */
mbed_official 50:a417edff4437 399 BUS_RegBitWrite(&(acmp->CTRL), _ACMP_CTRL_EN_SHIFT, init->enable);
bogdanm 0:9b334a45a8ff 400 }
bogdanm 0:9b334a45a8ff 401
mbed_official 50:a417edff4437 402 #if defined(_ACMP_INPUTSEL_VASEL_MASK)
mbed_official 50:a417edff4437 403 /***************************************************************************//**
mbed_official 50:a417edff4437 404 * @brief
mbed_official 50:a417edff4437 405 * Setup the VA Source.
mbed_official 50:a417edff4437 406 *
mbed_official 50:a417edff4437 407 * @param[in] acmp
mbed_official 50:a417edff4437 408 * Pointer to the ACMP peripheral register block.
mbed_official 50:a417edff4437 409 *
mbed_official 50:a417edff4437 410 * @param[in] vaconfig
mbed_official 50:a417edff4437 411 * Pointer to the structure used to configure the VA source. This structure
mbed_official 50:a417edff4437 412 * contains the input source as well as the 2 divider values.
mbed_official 50:a417edff4437 413 ******************************************************************************/
mbed_official 50:a417edff4437 414 void ACMP_VASetup(ACMP_TypeDef *acmp, const ACMP_VAConfig_TypeDef *vaconfig)
mbed_official 50:a417edff4437 415 {
mbed_official 50:a417edff4437 416 EFM_ASSERT(vaconfig->div0 < 64);
mbed_official 50:a417edff4437 417 EFM_ASSERT(vaconfig->div1 < 64);
mbed_official 50:a417edff4437 418
mbed_official 50:a417edff4437 419 BUS_RegMaskedWrite(&acmp->INPUTSEL, _ACMP_INPUTSEL_VASEL_MASK,
mbed_official 50:a417edff4437 420 vaconfig->input << _ACMP_INPUTSEL_VASEL_SHIFT);
mbed_official 50:a417edff4437 421 BUS_RegMaskedWrite(&acmp->HYSTERESIS0, _ACMP_HYSTERESIS0_DIVVA_MASK,
mbed_official 50:a417edff4437 422 vaconfig->div0 << _ACMP_HYSTERESIS0_DIVVA_SHIFT);
mbed_official 50:a417edff4437 423 BUS_RegMaskedWrite(&acmp->HYSTERESIS1, _ACMP_HYSTERESIS1_DIVVA_MASK,
mbed_official 50:a417edff4437 424 vaconfig->div1 << _ACMP_HYSTERESIS1_DIVVA_SHIFT);
mbed_official 50:a417edff4437 425 }
mbed_official 50:a417edff4437 426 #endif
mbed_official 50:a417edff4437 427
mbed_official 50:a417edff4437 428 #if defined(_ACMP_INPUTSEL_VBSEL_MASK)
mbed_official 50:a417edff4437 429 /***************************************************************************//**
mbed_official 50:a417edff4437 430 * @brief
mbed_official 50:a417edff4437 431 * Setup the VB Source.
mbed_official 50:a417edff4437 432 *
mbed_official 50:a417edff4437 433 * @param[in] acmp
mbed_official 50:a417edff4437 434 * Pointer to the ACMP peripheral register block.
mbed_official 50:a417edff4437 435 *
mbed_official 50:a417edff4437 436 * @param[in] vbconfig
mbed_official 50:a417edff4437 437 * Pointer to the structure used to configure the VB source. This structure
mbed_official 50:a417edff4437 438 * contains the input source as well as the 2 divider values.
mbed_official 50:a417edff4437 439 ******************************************************************************/
mbed_official 50:a417edff4437 440 void ACMP_VBSetup(ACMP_TypeDef *acmp, const ACMP_VBConfig_TypeDef *vbconfig)
mbed_official 50:a417edff4437 441 {
mbed_official 50:a417edff4437 442 EFM_ASSERT(vbconfig->div0 < 64);
mbed_official 50:a417edff4437 443 EFM_ASSERT(vbconfig->div1 < 64);
mbed_official 50:a417edff4437 444
mbed_official 50:a417edff4437 445 BUS_RegMaskedWrite(&acmp->INPUTSEL, _ACMP_INPUTSEL_VBSEL_MASK,
mbed_official 50:a417edff4437 446 vbconfig->input << _ACMP_INPUTSEL_VBSEL_SHIFT);
mbed_official 50:a417edff4437 447 BUS_RegMaskedWrite(&acmp->HYSTERESIS0, _ACMP_HYSTERESIS0_DIVVB_MASK,
mbed_official 50:a417edff4437 448 vbconfig->div0 << _ACMP_HYSTERESIS0_DIVVB_SHIFT);
mbed_official 50:a417edff4437 449 BUS_RegMaskedWrite(&acmp->HYSTERESIS1, _ACMP_HYSTERESIS1_DIVVB_MASK,
mbed_official 50:a417edff4437 450 vbconfig->div1 << _ACMP_HYSTERESIS1_DIVVB_SHIFT);
mbed_official 50:a417edff4437 451 }
mbed_official 50:a417edff4437 452 #endif
bogdanm 0:9b334a45a8ff 453
bogdanm 0:9b334a45a8ff 454 /** @} (end addtogroup ACMP) */
bogdanm 0:9b334a45a8ff 455 /** @} (end addtogroup EM_Library) */
bogdanm 0:9b334a45a8ff 456 #endif /* defined(ACMP_COUNT) && (ACMP_COUNT > 0) */