ACMPEMLIB

Detailed Description

Analog comparator (ACMP) Peripheral API.

The Analog Comparator is used to compare voltage of two analog inputs with a digital output indicating which input voltage is higher. Inputs can either be one of the selectable internal references or from external pins. Response time and current consumption can be configured by altering the current supply to the comparator.

ACMP is available down to EM3 and is able to wake up the system when input signals pass a certain threshold. Use ACMP_IntEnable() to enable an edge interrupt to use this functionality.

This example shows how to use the em_acmp.h API for comparing an input pin to an internal 2.5 V reference voltage.

/* The ACMP is a high-frequency peripheral so we need to enable
* both the HFPER clock and the ACMP0 clock. */
/* Initialize with default settings. */
init.enable = false;
ACMP_Init(ACMP0, &init);
/* Setup the two channels to compare. The first argument is the negative
* channel and the second argument is the positive channel.
*
* Here we compare channel 0 with the 2.5 V internal reference. When
* channel 0 is lower than 2.5 V then the ACMP output is 0 and when
* channel 0 voltage is higher than 2.5 V then the ACMP output is 1. */
/* To be able to probe the output we can send the ACMP output to a pin.
* The second argument to this function is the pin location which is
* device dependent. */
ACMP_GPIOSetup(ACMP0, 0, true, false);
/* Finally we enable the ACMP. */
Note
ACMP can also be used to compare two separate input pins.

ACMP also contains specialized hardware for capacitive sensing. This module contains the ACMP_CapsenseInit() function to initialize ACMP for capacitive sensing and the ACMP_CapsenseChannelSet() function to select the current capsense channel.

For applications that require capacitive sensing it is recommended to use a library, such as cslib, which is provided by Silicon Labs.

Data Structures

struct  ACMP_CapsenseInit_TypeDef
 
struct  ACMP_Init_TypeDef
 

Macros

#define ACMP_CAPSENSE_INIT_DEFAULT
 
#define ACMP_INIT_DEFAULT
 

Enumerations

enum  ACMP_CapsenseResistor_TypeDef {
  acmpResistor0 = _ACMP_INPUTSEL_CSRESSEL_RES0,
  acmpResistor1 = _ACMP_INPUTSEL_CSRESSEL_RES1,
  acmpResistor2 = _ACMP_INPUTSEL_CSRESSEL_RES2,
  acmpResistor3 = _ACMP_INPUTSEL_CSRESSEL_RES3
}
 
enum  ACMP_Channel_TypeDef {
  acmpChannel0 = _ACMP_INPUTSEL_NEGSEL_CH0,
  acmpChannel1 = _ACMP_INPUTSEL_NEGSEL_CH1,
  acmpChannel2 = _ACMP_INPUTSEL_NEGSEL_CH2,
  acmpChannel3 = _ACMP_INPUTSEL_NEGSEL_CH3,
  acmpChannel4 = _ACMP_INPUTSEL_NEGSEL_CH4,
  acmpChannel5 = _ACMP_INPUTSEL_NEGSEL_CH5,
  acmpChannel6 = _ACMP_INPUTSEL_NEGSEL_CH6,
  acmpChannel7 = _ACMP_INPUTSEL_NEGSEL_CH7,
  acmpChannel1V25 = _ACMP_INPUTSEL_NEGSEL_1V25,
  acmpChannel2V5 = _ACMP_INPUTSEL_NEGSEL_2V5,
  acmpChannelVDD = _ACMP_INPUTSEL_NEGSEL_VDD,
  acmpChannelCapSense = _ACMP_INPUTSEL_NEGSEL_CAPSENSE
}
 
enum  ACMP_HysteresisLevel_TypeDef {
  acmpHysteresisLevel0 = _ACMP_CTRL_HYSTSEL_HYST0,
  acmpHysteresisLevel1 = _ACMP_CTRL_HYSTSEL_HYST1,
  acmpHysteresisLevel2 = _ACMP_CTRL_HYSTSEL_HYST2,
  acmpHysteresisLevel3 = _ACMP_CTRL_HYSTSEL_HYST3,
  acmpHysteresisLevel4 = _ACMP_CTRL_HYSTSEL_HYST4,
  acmpHysteresisLevel5 = _ACMP_CTRL_HYSTSEL_HYST5,
  acmpHysteresisLevel6 = _ACMP_CTRL_HYSTSEL_HYST6,
  acmpHysteresisLevel7 = _ACMP_CTRL_HYSTSEL_HYST7
}
 
enum  ACMP_WarmTime_TypeDef {
  acmpWarmTime4 = _ACMP_CTRL_WARMTIME_4CYCLES,
  acmpWarmTime8 = _ACMP_CTRL_WARMTIME_8CYCLES,
  acmpWarmTime16 = _ACMP_CTRL_WARMTIME_16CYCLES,
  acmpWarmTime32 = _ACMP_CTRL_WARMTIME_32CYCLES,
  acmpWarmTime64 = _ACMP_CTRL_WARMTIME_64CYCLES,
  acmpWarmTime128 = _ACMP_CTRL_WARMTIME_128CYCLES,
  acmpWarmTime256 = _ACMP_CTRL_WARMTIME_256CYCLES,
  acmpWarmTime512 = _ACMP_CTRL_WARMTIME_512CYCLES
}
 

Functions

void ACMP_CapsenseChannelSet (ACMP_TypeDef *acmp, ACMP_Channel_TypeDef channel)
 Set the ACMP channel used for capacitive sensing.
 
void ACMP_CapsenseInit (ACMP_TypeDef *acmp, const ACMP_CapsenseInit_TypeDef *init)
 Set up ACMP for use in capacitive sense applications.
 
void ACMP_ChannelSet (ACMP_TypeDef *acmp, ACMP_Channel_TypeDef negSel, ACMP_Channel_TypeDef posSel)
 Set which channels should be used in ACMP comparisons.
 
void ACMP_Disable (ACMP_TypeDef *acmp)
 Disable ACMP.
 
void ACMP_Enable (ACMP_TypeDef *acmp)
 Enable ACMP.
 
void ACMP_GPIOSetup (ACMP_TypeDef *acmp, uint32_t location, bool enable, bool invert)
 Set up GPIO output from ACMP.
 
void ACMP_Init (ACMP_TypeDef *acmp, const ACMP_Init_TypeDef *init)
 Initialize ACMP.
 
__STATIC_INLINE void ACMP_IntClear (ACMP_TypeDef *acmp, uint32_t flags)
 Clear one or more pending ACMP interrupts.
 
__STATIC_INLINE void ACMP_IntDisable (ACMP_TypeDef *acmp, uint32_t flags)
 Disable one or more ACMP interrupts.
 
__STATIC_INLINE void ACMP_IntEnable (ACMP_TypeDef *acmp, uint32_t flags)
 Enable one or more ACMP interrupts.
 
__STATIC_INLINE uint32_t ACMP_IntGet (ACMP_TypeDef *acmp)
 Get pending ACMP interrupt flags.
 
__STATIC_INLINE uint32_t ACMP_IntGetEnabled (ACMP_TypeDef *acmp)
 Get enabled and pending ACMP interrupt flags. Useful for handling more interrupt sources in the same interrupt handler.
 
__STATIC_INLINE void ACMP_IntSet (ACMP_TypeDef *acmp, uint32_t flags)
 Set one or more pending ACMP interrupts from software.
 
void ACMP_Reset (ACMP_TypeDef *acmp)
 Reset ACMP to the same state that it was in after a hardware reset.
 

Macro Definition Documentation

#define ACMP_CAPSENSE_INIT_DEFAULT
Value:
{ \
false, /* fullBias */ \
false, /* halfBias */ \
0x7, /* biasProg */ \
acmpWarmTime512, /* 512 cycle warmup to be safe */ \
acmpHysteresisLevel5, \
acmpResistor3, \
false, /* low power reference */ \
0x3D, /* VDD level */ \
true /* Enable after init. */ \
}

A default configuration for capacitive sense mode initialization.

Definition at line 706 of file em_acmp.h.

Referenced by CAPSENSE_Init().

#define ACMP_INIT_DEFAULT
Value:
{ \
false, /* fullBias */ \
false, /* halfBias */ \
0x7, /* biasProg */ \
false, /* No interrupt on falling edge. */ \
false, /* No interrupt on rising edge. */ \
acmpWarmTime512, /* 512 cycle warmup to be safe */ \
acmpHysteresisLevel5, \
false, /* Disabled emitting inactive value during warmup. */ \
false, /* low power reference */ \
0x3D, /* VDD level */ \
true /* Enable after init. */ \
}

Default configuration for ACMP regular initialization.

Definition at line 855 of file em_acmp.h.

Enumeration Type Documentation

Resistor values used for the internal capacative sense resistor. See data sheet for your device for details on each resistor value.

Enumerator
acmpResistor0 

Resistor value 0

acmpResistor1 

Resistor value 1

acmpResistor2 

Resistor value 2

acmpResistor3 

Resistor value 3

Definition at line 63 of file em_acmp.h.

ACMP inputs. Note that scaled VDD and bandgap references can only be used as negative inputs.

Enumerator
acmpChannel0 

Channel 0

acmpChannel1 

Channel 1

acmpChannel2 

Channel 2

acmpChannel3 

Channel 3

acmpChannel4 

Channel 4

acmpChannel5 

Channel 5

acmpChannel6 

Channel 6

acmpChannel7 

Channel 7

acmpChannel1V25 

1.25 V internal reference

acmpChannel2V5 

2.5 V internal reference

acmpChannelVDD 

Scaled VDD reference

acmpChannelCapSense 

Capacitive sense mode

Definition at line 536 of file em_acmp.h.

Hysteresis level. See data sheet for your device for details on each level.

Enumerator
acmpHysteresisLevel0 

Hysteresis level 0

acmpHysteresisLevel1 

Hysteresis level 1

acmpHysteresisLevel2 

Hysteresis level 2

acmpHysteresisLevel3 

Hysteresis level 3

acmpHysteresisLevel4 

Hysteresis level 4

acmpHysteresisLevel5 

Hysteresis level 5

acmpHysteresisLevel6 

Hysteresis level 6

acmpHysteresisLevel7 

Hysteresis level 7

Definition at line 88 of file em_acmp.h.

ACMP warmup time. The delay is measured in HFPERCLK / HFPERCCLK cycles and should be at least 10 us.

Enumerator
acmpWarmTime4 

4 cycles warmup

acmpWarmTime8 

8 cycles warmup

acmpWarmTime16 

16 cycles warmup

acmpWarmTime32 

32 cycles warmup

acmpWarmTime64 

64 cycles warmup

acmpWarmTime128 

128 cycles warmup

acmpWarmTime256 

256 cycles warmup

acmpWarmTime512 

512 cycles warmup

Definition at line 134 of file em_acmp.h.

Function Documentation

void ACMP_CapsenseChannelSet ( ACMP_TypeDef acmp,
ACMP_Channel_TypeDef  channel 
)

Set the ACMP channel used for capacitive sensing.

Note
A basic example of capacitive sensing can be found in the STK BSP (capsense demo).
Parameters
[in]acmpA pointer to the ACMP peripheral register block.
[in]channelThe ACMP channel to use for capacitive sensing (Possel).

Definition at line 248 of file em_acmp.c.

References _ACMP_INPUTSEL_POSSEL_CH7, _ACMP_INPUTSEL_POSSEL_MASK, _ACMP_INPUTSEL_POSSEL_SHIFT, BUS_RegMaskedWrite(), and ACMP_TypeDef::INPUTSEL.

Referenced by CAPSENSE_Measure().

void ACMP_CapsenseInit ( ACMP_TypeDef acmp,
const ACMP_CapsenseInit_TypeDef init 
)

Set up ACMP for use in capacitive sense applications.

This function sets up ACMP for use in capacitive sense applications. To use the capacitive sense functionality in the ACMP, use the PRS output of the ACMP module to count the number of oscillations in the capacitive sense circuit (possibly using a TIMER).

Note
A basic example of capacitive sensing can be found in the STK BSP (capsense demo).
Parameters
[in]acmpA pointer to the ACMP peripheral register block.
[in]initA pointer to the initialization structure used to configure ACMP for capacitive sensing operation.

Definition at line 166 of file em_acmp.c.

References _ACMP_CTRL_BIASPROG_MASK, _ACMP_CTRL_BIASPROG_SHIFT, _ACMP_CTRL_EN_SHIFT, _ACMP_CTRL_FULLBIAS_SHIFT, _ACMP_CTRL_HALFBIAS_SHIFT, _ACMP_CTRL_HYSTSEL_SHIFT, _ACMP_CTRL_RESETVALUE, _ACMP_CTRL_WARMTIME_SHIFT, _ACMP_INPUTSEL_CSRESSEL_SHIFT, _ACMP_INPUTSEL_LPREF_SHIFT, _ACMP_INPUTSEL_VDDLEVEL_SHIFT, ACMP_Disable(), ACMP_Enable(), ACMP_INPUTSEL_CSRESEN, ACMP_INPUTSEL_NEGSEL_CAPSENSE, ACMP_CapsenseInit_TypeDef::biasProg, BUS_RegBitWrite(), ACMP_TypeDef::CTRL, ACMP_CapsenseInit_TypeDef::enable, ACMP_CapsenseInit_TypeDef::fullBias, ACMP_CapsenseInit_TypeDef::halfBias, ACMP_CapsenseInit_TypeDef::hysteresisLevel, ACMP_TypeDef::INPUTSEL, ACMP_CapsenseInit_TypeDef::lowPowerReferenceEnabled, ACMP_CapsenseInit_TypeDef::resistor, ACMP_CapsenseInit_TypeDef::vddLevel, and ACMP_CapsenseInit_TypeDef::warmTime.

Referenced by CAPLESENSE_setupACMP(), and CAPSENSE_Init().

void ACMP_ChannelSet ( ACMP_TypeDef acmp,
ACMP_Channel_TypeDef  negSel,
ACMP_Channel_TypeDef  posSel 
)

Set which channels should be used in ACMP comparisons.

Parameters
[in]acmpA pointer to the ACMP peripheral register block.
negSelA channel to use on the negative input to the ACMP.
posSelA channel to use on the positive input to the ACMP.

Definition at line 497 of file em_acmp.c.

References _ACMP_INPUTSEL_NEGSEL_CAPSENSE, _ACMP_INPUTSEL_NEGSEL_MASK, _ACMP_INPUTSEL_NEGSEL_SHIFT, _ACMP_INPUTSEL_POSSEL_CH7, _ACMP_INPUTSEL_POSSEL_MASK, _ACMP_INPUTSEL_POSSEL_SHIFT, and ACMP_TypeDef::INPUTSEL.

void ACMP_Disable ( ACMP_TypeDef acmp)

Disable ACMP.

Parameters
[in]acmpA pointer to the ACMP peripheral register block.

Definition at line 289 of file em_acmp.c.

References ACMP_CTRL_EN, and ACMP_TypeDef::CTRL.

Referenced by ACMP_CapsenseInit(), ACMP_Init(), ACMP_Reset(), and CAPSENSE_Sense().

void ACMP_Enable ( ACMP_TypeDef acmp)

Enable ACMP.

Parameters
[in]acmpA pointer to the ACMP peripheral register block.

Definition at line 311 of file em_acmp.c.

References ACMP_CTRL_EN, and ACMP_TypeDef::CTRL.

Referenced by ACMP_CapsenseInit(), ACMP_Init(), ACMP_Reset(), and CAPSENSE_Sense().

void ACMP_GPIOSetup ( ACMP_TypeDef acmp,
uint32_t  location,
bool  enable,
bool  invert 
)

Set up GPIO output from ACMP.

Note
GPIO must be enabled in the CMU before this function call, i.e.,
CMU_ClockEnable(cmuClock_GPIO, true); 
Parameters
[in]acmpA pointer to the ACMP peripheral register block.
locationThe pin location to use. See the data sheet for location to pin mappings.
enableEnable or disable pin output.
invertInvert output.

Definition at line 452 of file em_acmp.c.

References _ACMP_CTRL_GPIOINV_MASK, _ACMP_CTRL_GPIOINV_SHIFT, _ACMP_ROUTE_ACMPPEN_SHIFT, _ACMP_ROUTE_LOCATION_SHIFT, BUS_RegMaskedWrite(), ACMP_TypeDef::CTRL, and ACMP_TypeDef::ROUTE.

Referenced by CAPLESENSE_setupACMP().

__STATIC_INLINE void ACMP_IntClear ( ACMP_TypeDef acmp,
uint32_t  flags 
)

Clear one or more pending ACMP interrupts.

Parameters
[in]acmpA pointer to the ACMP peripheral register block.
[in]flagsPending ACMP interrupt source to clear. Use a bitwise logic OR combination of valid interrupt flags for the ACMP module. The flags can be, for instance, ACMP_IFC_EDGE or ACMP_IFC_WARMUP.

Definition at line 975 of file em_acmp.h.

References ACMP_TypeDef::IFC.

__STATIC_INLINE void ACMP_IntDisable ( ACMP_TypeDef acmp,
uint32_t  flags 
)

Disable one or more ACMP interrupts.

Parameters
[in]acmpA pointer to the ACMP peripheral register block.
[in]flagsACMP interrupt sources to disable. Use a bitwise logic OR combination of valid interrupt flags for the ACMP module. The flags can be, for instance, ACMP_IEN_EDGE or ACMP_IEN_WARMUP.

Definition at line 996 of file em_acmp.h.

References BUS_RegMaskedClear(), and ACMP_TypeDef::IEN.

__STATIC_INLINE void ACMP_IntEnable ( ACMP_TypeDef acmp,
uint32_t  flags 
)

Enable one or more ACMP interrupts.

Note
Depending on the use, a pending interrupt may already be set prior to enabling the interrupt. Consider using ACMP_IntClear() prior to enabling if a pending interrupt should be ignored.
Parameters
[in]acmpA pointer to the ACMP peripheral register block.
[in]flagsACMP interrupt sources to enable. Use a bitwise logic OR combination of valid interrupt flags for the ACMP module. The flags can be, for instance, ACMP_IEN_EDGE or ACMP_IEN_WARMUP.

Definition at line 1018 of file em_acmp.h.

References ACMP_TypeDef::IEN.

__STATIC_INLINE uint32_t ACMP_IntGet ( ACMP_TypeDef acmp)

Get pending ACMP interrupt flags.

Note
This function does not clear event bits.
Parameters
[in]acmpA pointer to the ACMP peripheral register block.
Returns
Pending ACMP interrupt sources. A bitwise logic OR combination of valid interrupt flags for the ACMP module. The pending interrupt sources can be, for instance, ACMP_IF_EDGE or ACMP_IF_WARMUP.

Definition at line 1042 of file em_acmp.h.

References ACMP_TypeDef::IF.

__STATIC_INLINE uint32_t ACMP_IntGetEnabled ( ACMP_TypeDef acmp)

Get enabled and pending ACMP interrupt flags. Useful for handling more interrupt sources in the same interrupt handler.

Parameters
[in]acmpA pointer to the ACMP peripheral register block.
Note
This function does not clear interrupt flags.
Returns
Pending and enabled ACMP interrupt sources. The return value is the bitwise AND combination of
  • the OR combination of enabled interrupt sources in ACMPx_IEN_nnn register (ACMPx_IEN_nnn) and
  • the OR combination of valid interrupt flags of the ACMP module (ACMPx_IF_nnn).

Definition at line 1066 of file em_acmp.h.

References ACMP_TypeDef::IEN, and ACMP_TypeDef::IF.

__STATIC_INLINE void ACMP_IntSet ( ACMP_TypeDef acmp,
uint32_t  flags 
)

Set one or more pending ACMP interrupts from software.

Parameters
[in]acmpA pointer to the ACMP peripheral register block.
[in]flagsACMP interrupt sources to set as pending. Use a bitwise logic OR combination of valid interrupt flags for the ACMP module. The flags can be, for instance, ACMP_IFS_EDGE or ACMP_IFS_WARMUP.

Definition at line 1090 of file em_acmp.h.

References ACMP_TypeDef::IFS.

void ACMP_Reset ( ACMP_TypeDef acmp)

Reset ACMP to the same state that it was in after a hardware reset.

Note
The GPIO ACMP ROUTE register is NOT reset by this function to allow for centralized setup of this feature.
The peripheral may be enabled and disabled during reset.
Parameters
[in]acmpA pointer to the ACMP peripheral register block.

Definition at line 363 of file em_acmp.c.

References _ACMP_CTRL_RESETVALUE, _ACMP_IEN_RESETVALUE, _ACMP_IF_MASK, _ACMP_INPUTSEL_RESETVALUE, ACMP_Disable(), ACMP_Enable(), ACMP_TypeDef::CTRL, ACMP_TypeDef::IEN, ACMP_TypeDef::IFC, and ACMP_TypeDef::INPUTSEL.