34 #if defined(PCNT_COUNT) && (PCNT_COUNT > 0)
60 #define PCNT_REF_VALID(ref) ((ref) == PCNT0)
61 #elif (PCNT_COUNT == 2)
62 #define PCNT_REF_VALID(ref) (((ref) == PCNT0) || ((ref) == PCNT1))
63 #elif (PCNT_COUNT == 3)
64 #define PCNT_REF_VALID(ref) (((ref) == PCNT0) || ((ref) == PCNT1) || \
67 #error "Undefined number of pulse counters (PCNT)."
89 __STATIC_INLINE
unsigned int PCNT_Map(
PCNT_TypeDef *pcnt)
106 __STATIC_INLINE
void PCNT_Sync(
PCNT_TypeDef *pcnt, uint32_t mask)
143 EFM_ASSERT(PCNT_REF_VALID(pcnt));
181 EFM_ASSERT(PCNT_REF_VALID(pcnt));
283 EFM_ASSERT(PCNT_REF_VALID(pcnt));
294 #if defined(_PCNT_INPUT_MASK)
315 EFM_ASSERT(PCNT_REF_VALID(pcnt));
368 EFM_ASSERT(PCNT_REF_VALID(pcnt));
435 EFM_ASSERT(PCNT_REF_VALID(pcnt));
462 inst = PCNT_Map(pcnt);
464 #if defined(_PCNT_INPUT_MASK)
491 #if defined(PCNT_CTRL_HYST)
498 #if defined(PCNT_CTRL_S1CDIR)
506 #if defined(_PCNT_CTRL_CNTEV_SHIFT)
510 #if defined(_PCNT_CTRL_AUXCNTEV_SHIFT)
517 uint32_t auxCntEventField = 0;
643 EFM_ASSERT(PCNT_REF_VALID(pcnt));
646 inst = PCNT_Map(pcnt);
675 #if defined(PCNT_OVSCFG_FILTLEN_DEFAULT)
693 void PCNT_FilterConfiguration(
PCNT_TypeDef *pcnt,
const PCNT_Filter_TypeDef *config,
bool enable) {
696 EFM_ASSERT(PCNT_REF_VALID(pcnt));
699 ovscfg = ((config->filtLen & _PCNT_OVSCFG_FILTLEN_MASK) << _PCNT_OVSCFG_FILTLEN_SHIFT)
700 | ((config->flutterrm & 0x1) << _PCNT_OVSCFG_FLUTTERRM_SHIFT);
703 PCNT_Sync(pcnt, PCNT_SYNCBUSY_OVSCFG);
704 pcnt->OVSCFG = ovscfg;
720 #if defined(PCNT_CTRL_TCCMODE_DEFAULT)
742 void PCNT_TCCConfiguration(
PCNT_TypeDef *pcnt,
const PCNT_TCC_TypeDef *config){
744 uint32_t mask = _PCNT_CTRL_TCCMODE_MASK
745 | _PCNT_CTRL_TCCPRESC_MASK
746 | _PCNT_CTRL_TCCCOMP_MASK
747 | _PCNT_CTRL_PRSGATEEN_MASK
748 | _PCNT_CTRL_TCCPRSPOL_MASK
749 | _PCNT_CTRL_TCCPRSSEL_MASK;
751 EFM_ASSERT(PCNT_REF_VALID(pcnt));
754 ctrl |= (config->mode << _PCNT_CTRL_TCCMODE_SHIFT ) & _PCNT_CTRL_TCCMODE_MASK;
755 ctrl |= (config->prescaler << _PCNT_CTRL_TCCPRESC_SHIFT ) & _PCNT_CTRL_TCCPRESC_MASK;
756 ctrl |= (config->compare << _PCNT_CTRL_TCCCOMP_SHIFT ) & _PCNT_CTRL_TCCCOMP_MASK;
757 ctrl |= (config->tccPRS << _PCNT_CTRL_TCCPRSSEL_SHIFT ) & _PCNT_CTRL_TCCPRSSEL_MASK;
758 ctrl |= (config->prsPolarity << _PCNT_CTRL_TCCPRSPOL_SHIFT ) & _PCNT_CTRL_TCCPRSPOL_MASK;
759 ctrl |= (config->prsGateEnable << _PCNT_CTRL_PRSGATEEN_SHIFT ) & _PCNT_CTRL_PRSGATEEN_MASK;
763 pcnt->
CTRL = (pcnt->
CTRL & (~mask)) | ctrl;
785 EFM_ASSERT(PCNT_REF_VALID(pcnt));
811 EFM_ASSERT(PCNT_REF_VALID(pcnt));
Clock management unit (CMU) API.
#define PCNT_CTRL_EDGE_NEG
void PCNT_CounterTopSet(PCNT_TypeDef *pcnt, uint32_t count, uint32_t top)
Set counter and top values.
void CMU_PCNTClockExternalSet(unsigned int instance, bool external)
Select PCNTn clock.
#define _PCNT_INPUT_S0PRSSEL_SHIFT
#define _PCNT_CTRL_AUXCNTEV_SHIFT
#define _PCNT_CTRL_MODE_MASK
void PCNT_Enable(PCNT_TypeDef *pcnt, PCNT_Mode_TypeDef mode)
Set PCNT operational mode.
Emlib peripheral API "assert" implementation.
#define PCNT_SYNCBUSY_TOPB
RAM and peripheral bit-field set and clear API.
void PCNT_TopSet(PCNT_TypeDef *pcnt, uint32_t val)
Set top value.
#define PCNT_CTRL_MODE_DISABLE
void PCNT_PRSInputEnable(PCNT_TypeDef *pcnt, PCNT_PRSInput_TypeDef prsInput, bool enable)
Enable/disable the selected PRS input of PCNT.
#define PCNT_CTRL_CNTDIR_DOWN
#define _PCNT_CTRL_RSTEN_SHIFT
#define _PCNT_IEN_RESETVALUE
Pulse Counter (PCNT) peripheral API.
PCNT_CntEvent_TypeDef cntEvent
#define _PCNT_CTRL_MODE_SHIFT
#define _PCNT_INPUT_S1PRSSEL_SHIFT
#define _PCNT_INPUT_S0PRSSEL_MASK
#define _PCNT_INPUT_S1PRSEN_SHIFT
#define _PCNT_TOPB_RESETVALUE
PCNT_CntEvent_TypeDef auxCntEvent
#define PCNT_FREEZE_REGFREEZE
void PCNT_CounterReset(PCNT_TypeDef *pcnt)
Reset PCNT counters and TOP register.
void PCNT_Init(PCNT_TypeDef *pcnt, const PCNT_Init_TypeDef *init)
Init pulse counter.
#define _PCNT_INPUT_S1PRSSEL_MASK
PCNT_PRSSel_TypeDef s1PRS
PCNT_PRSSel_TypeDef s0PRS
#define PCNT_SYNCBUSY_CMD
#define _PCNT_CTRL_RESETVALUE
void PCNT_TopBufferSet(PCNT_TypeDef *pcnt, uint32_t val)
Set top buffer value.
#define _PCNT_INPUT_S0PRSEN_SHIFT
void PCNT_FreezeEnable(PCNT_TypeDef *pcnt, bool enable)
PCNT register synchronization freeze control.
__STATIC_INLINE void BUS_RegBitWrite(volatile uint32_t *addr, unsigned int bit, unsigned int val)
Perform a single-bit write operation on a peripheral register.
#define PCNT_SYNCBUSY_CTRL
void PCNT_Reset(PCNT_TypeDef *pcnt)
Reset PCNT to same state as after a HW reset.
#define _PCNT_CTRL_CNTEV_SHIFT