ACMPEMLIB

Detailed Description

Analog comparator (ACMP) Peripheral API.

The Analog Comparator is used to compare the 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 thereby also the current consumption can be configured by altering the current supply to the comparator.

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

Here is an example of how to use the em_acmp.h API for comparing an input pin to an internal 2.5V 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 ;
/* 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
The ACMP can also be used to compare two separate input pins.

The ACMP also contains specialized hardware for capacitive sensing. This module contains the function ACMP_CapsenseInit for initializing the ACMP for capacitive sensing and the function ACMP_CapsenseChannelSet for selecting the current capsense channel.

For applications that require capacitive sensing it is recommended to use a library like 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,
acmpChannelDAC0Ch0 = _ACMP_INPUTSEL_NEGSEL_DAC0CH0,
acmpChannelDAC0Ch1 = _ACMP_INPUTSEL_NEGSEL_DAC0CH1,
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)
Sets the ACMP channel used for capacative sensing.
void ACMP_CapsenseInit ( ACMP_TypeDef *acmp, const ACMP_CapsenseInit_TypeDef *init)
Sets up the ACMP for use in capacative sense applications.
void ACMP_ChannelSet ( ACMP_TypeDef *acmp, ACMP_Channel_TypeDef negSel, ACMP_Channel_TypeDef posSel)
Sets which channels should be used in ACMP comparisons.
void ACMP_Disable ( ACMP_TypeDef *acmp)
Disables the ACMP.
void ACMP_Enable ( ACMP_TypeDef *acmp)
Enables the ACMP.
void ACMP_GPIOSetup ( ACMP_TypeDef *acmp, uint32_t location, bool enable, bool invert)
Sets up GPIO output from the 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 SW.
void ACMP_Reset ( ACMP_TypeDef *acmp)
Reset ACMP to same state as after a HW 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. */ \
}

Default config for capacitive sense mode initialization.

Definition at line 609 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 config for ACMP regular initialization.

Definition at line 735 of file em_acmp.h .

Enumeration Type Documentation

Resistor values used for the internal capacative sense resistor. See the datasheet 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 98 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.25V internal reference

acmpChannel2V5

2.5V internal reference

acmpChannelVDD

Scaled VDD reference

acmpChannelDAC0Ch0

DAC0 channel 0

acmpChannelDAC0Ch1

DAC0 channel 1

acmpChannelCapSense

Capacitive sense mode

Definition at line 455 of file em_acmp.h .

Hysteresis level. See datasheet 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 113 of file em_acmp.h .

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

Enumerator
acmpWarmTime4

4 HFPERCLK cycles warmup

acmpWarmTime8

8 HFPERCLK cycles warmup

acmpWarmTime16

16 HFPERCLK cycles warmup

acmpWarmTime32

32 HFPERCLK cycles warmup

acmpWarmTime64

64 HFPERCLK cycles warmup

acmpWarmTime128

128 HFPERCLK cycles warmup

acmpWarmTime256

256 HFPERCLK cycles warmup

acmpWarmTime512

512 HFPERCLK cycles warmup

Definition at line 147 of file em_acmp.h .

Function Documentation

void ACMP_CapsenseChannelSet ( ACMP_TypeDef * acmp,
ACMP_Channel_TypeDef channel
)

Sets the ACMP channel used for capacative sensing.

Note
A basic example of capacative sensing can be found in the STK BSP (capsense demo).
Parameters
[in] acmp Pointer to ACMP peripheral register block.
[in] channel The ACMP channel to use for capacative sensing (Possel).

Definition at line 190 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
)

Sets up the ACMP for use in capacative sense applications.

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

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

Definition at line 114 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_MASK , _ACMP_CTRL_HALFBIAS_SHIFT , _ACMP_CTRL_HYSTSEL_MASK , _ACMP_CTRL_HYSTSEL_SHIFT , _ACMP_CTRL_WARMTIME_SHIFT , _ACMP_INPUTSEL_CSRESSEL_SHIFT , _ACMP_INPUTSEL_LPREF_MASK , _ACMP_INPUTSEL_LPREF_SHIFT , _ACMP_INPUTSEL_VDDLEVEL_MASK , _ACMP_INPUTSEL_VDDLEVEL_SHIFT , 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
)

Sets which channels should be used in ACMP comparisons.

Parameters
[in] acmp Pointer to the ACMP peripheral register block.
negSel Channel to use on the negative input to the ACMP.
posSel Channel to use on the positive input to the ACMP.

Definition at line 345 of file em_acmp.c .

References _ACMP_INPUTSEL_NEGSEL_CAPSENSE , _ACMP_INPUTSEL_NEGSEL_DAC0CH1 , _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 )

Disables the ACMP.

Parameters
[in] acmp Pointer to ACMP peripheral register block.

Definition at line 215 of file em_acmp.c .

References ACMP_CTRL_EN , and ACMP_TypeDef::CTRL .

Referenced by CAPSENSE_Sense() .

void ACMP_Enable ( ACMP_TypeDef * acmp )

Enables the ACMP.

Parameters
[in] acmp Pointer to ACMP peripheral register block.

Definition at line 230 of file em_acmp.c .

References ACMP_CTRL_EN , and ACMP_TypeDef::CTRL .

Referenced by CAPSENSE_Sense() .

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

Sets up GPIO output from the ACMP.

Note
GPIO must be enabled in the CMU before this function call, i.e.
CMU_ClockEnable(cmuClock_GPIO, true); 
Parameters
[in] acmp Pointer to the ACMP peripheral register block.
location The pin location to use. See the datasheet for location to pin mappings.
enable Enable or disable pin output.
invert Invert output.

Definition at line 310 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] acmp Pointer to ACMP peripheral register block.
[in] flags Pending 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 865 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] acmp Pointer to ACMP peripheral register block.
[in] flags ACMP 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 882 of file em_acmp.h .

References 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 such a pending interrupt should be ignored.
Parameters
[in] acmp Pointer to ACMP peripheral register block.
[in] flags ACMP 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 904 of file em_acmp.h .

References ACMP_TypeDef::IEN .

__STATIC_INLINE uint32_t ACMP_IntGet ( ACMP_TypeDef * acmp )

Get pending ACMP interrupt flags.

Note
The event bits are not cleared by the use of this function.
Parameters
[in] acmp Pointer to ACMP peripheral register block.
Returns
ACMP interrupt sources pending. 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 924 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] acmp Pointer to ACMP peripheral register block.
Note
Interrupt flags are not cleared by the use of this function.
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 948 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 SW.

Parameters
[in] acmp Pointer to ACMP peripheral register block.
[in] flags ACMP interrupt sources to set to 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 972 of file em_acmp.h .

References ACMP_TypeDef::IFS .

void ACMP_Reset ( ACMP_TypeDef * acmp )

Reset ACMP to same state as after a HW reset.

Note
The ROUTE register is NOT reset by this function, in order to allow for centralized setup of this feature.
Parameters
[in] acmp Pointer to the ACMP peripheral register block.

Definition at line 275 of file em_acmp.c .

References _ACMP_CTRL_RESETVALUE , _ACMP_IEN_RESETVALUE , _ACMP_IF_MASK , _ACMP_INPUTSEL_RESETVALUE , ACMP_TypeDef::CTRL , ACMP_TypeDef::IEN , ACMP_TypeDef::IFC , and ACMP_TypeDef::INPUTSEL .