33 #ifndef __SILICON_LABS_EM_TIMER_H__
34 #define __SILICON_LABS_EM_TIMER_H__
37 #if defined(TIMER_COUNT) && (TIMER_COUNT > 0)
64 #if (TIMER_COUNT == 1)
65 #define TIMER_REF_VALID(ref) ((ref) == TIMER0)
66 #elif (TIMER_COUNT == 2)
67 #define TIMER_REF_VALID(ref) (((ref) == TIMER0) || ((ref) == TIMER1))
68 #elif (TIMER_COUNT == 3)
69 #define TIMER_REF_VALID(ref) (((ref) == TIMER0) \
70 || ((ref) == TIMER1) \
72 #elif (TIMER_COUNT == 4)
73 #define TIMER_REF_VALID(ref) (((ref) == TIMER0) \
74 || ((ref) == TIMER1) \
75 || ((ref) == TIMER2) \
78 #error "Undefined number of timers."
82 #if defined(_SILICON_LABS_32B_PLATFORM_1)
83 #define TIMER_CH_VALID(ch) ((ch) < 3)
84 #elif defined(_SILICON_LABS_32B_PLATFORM_2)
85 #define TIMER_CH_VALID(ch) ((ch) < 4)
87 #error "Unknown platform. Undefined number of channels."
228 #if defined(_TIMER_CC_CTRL_PRSSEL_PRSCH4)
229 timerPRSSELCh4 = _TIMER_CC_CTRL_PRSSEL_PRSCH4,
231 #if defined(_TIMER_CC_CTRL_PRSSEL_PRSCH5)
232 timerPRSSELCh5 = _TIMER_CC_CTRL_PRSSEL_PRSCH5,
234 #if defined(_TIMER_CC_CTRL_PRSSEL_PRSCH6)
235 timerPRSSELCh6 = _TIMER_CC_CTRL_PRSSEL_PRSCH6,
237 #if defined(_TIMER_CC_CTRL_PRSSEL_PRSCH7)
238 timerPRSSELCh7 = _TIMER_CC_CTRL_PRSSEL_PRSCH7,
240 #if defined(_TIMER_CC_CTRL_PRSSEL_PRSCH8)
241 timerPRSSELCh8 = _TIMER_CC_CTRL_PRSSEL_PRSCH8,
243 #if defined(_TIMER_CC_CTRL_PRSSEL_PRSCH9)
244 timerPRSSELCh9 = _TIMER_CC_CTRL_PRSSEL_PRSCH9,
246 #if defined(_TIMER_CC_CTRL_PRSSEL_PRSCH10)
247 timerPRSSELCh10 = _TIMER_CC_CTRL_PRSSEL_PRSCH10,
249 #if defined(_TIMER_CC_CTRL_PRSSEL_PRSCH11)
250 timerPRSSELCh11 = _TIMER_CC_CTRL_PRSSEL_PRSCH11,
254 #if defined(_TIMER_DTFC_DTFA_NONE)
258 timerDtiFaultActionNone = _TIMER_DTFC_DTFA_NONE,
259 timerDtiFaultActionInactive = _TIMER_DTFC_DTFA_INACTIVE,
260 timerDtiFaultActionClear = _TIMER_DTFC_DTFA_CLEAR,
261 timerDtiFaultActionTristate = _TIMER_DTFC_DTFA_TRISTATE
262 } TIMER_DtiFaultAction_TypeDef;
284 #if defined(TIMER_CTRL_X2CNT) && defined(TIMER_CTRL_ATI)
316 #if defined(TIMER_CTRL_X2CNT) && defined(TIMER_CTRL_ATI)
317 #define TIMER_INIT_DEFAULT \
322 timerClkSelHFPerClk, \
325 timerInputActionNone, \
326 timerInputActionNone, \
334 #define TIMER_INIT_DEFAULT \
339 timerClkSelHFPerClk, \
340 timerInputActionNone, \
341 timerInputActionNone, \
397 #define TIMER_INITCC_DEFAULT \
399 timerEventEveryEdge, \
402 timerOutputActionNone, \
403 timerOutputActionNone, \
404 timerOutputActionNone, \
412 #if defined(_TIMER_DTCTRL_MASK)
423 bool invertComplementaryOut;
429 bool enablePrsSource;
439 unsigned int riseTime;
442 unsigned int fallTime;
448 uint32_t outputsEnableMask;
451 bool enableFaultSourceCoreLockup;
454 bool enableFaultSourceDebugger;
457 bool enableFaultSourcePrsSel0;
463 bool enableFaultSourcePrsSel1;
469 TIMER_DtiFaultAction_TypeDef faultAction;
471 } TIMER_InitDTI_TypeDef;
475 #define TIMER_INITDTI_DEFAULT \
486 TIMER_DTOGEN_DTOGCC0EN|TIMER_DTOGEN_DTOGCDTI0EN, \
493 timerDtiFaultActionInactive, \
518 return timer->
CC[ch].
CCV;
567 timer->
CC[ch].
CCV = val;
615 EFM_ASSERT(TIMER_REF_VALID(timer));
633 #if defined(_TIMER_DTCTRL_MASK)
634 void TIMER_InitDTI(
TIMER_TypeDef *timer,
const TIMER_InitDTI_TypeDef *init);
646 __STATIC_INLINE
void TIMER_EnableDTI(
TIMER_TypeDef *timer,
bool enable)
648 EFM_ASSERT(
TIMER0 == timer);
652 timer->DTCTRL |= TIMER_DTCTRL_DTEN;
656 timer->DTCTRL &= ~TIMER_DTCTRL_DTEN;
675 __STATIC_INLINE uint32_t TIMER_GetDTIFault(
TIMER_TypeDef *timer)
677 EFM_ASSERT(
TIMER0 == timer);
678 return timer->DTFAULT;
693 __STATIC_INLINE
void TIMER_ClearDTIFault(
TIMER_TypeDef *timer, uint32_t flags)
696 EFM_ASSERT(
TIMER0 == timer);
697 timer->DTFAULTC = flags;
732 timer->
IEN &= ~flags;
806 return timer->
IF & ien;
826 #if defined(_TIMER_DTLOCK_LOCKKEY_LOCK)
845 EFM_ASSERT(
TIMER0 == timer);
847 timer->DTLOCK = TIMER_DTLOCK_LOCKKEY_LOCK;
906 #if defined(TIMER_DTLOCK_LOCKKEY_UNLOCK)
916 EFM_ASSERT(
TIMER0 == timer);
918 timer->DTLOCK = TIMER_DTLOCK_LOCKKEY_UNLOCK;
__STATIC_INLINE void TIMER_IntDisable(TIMER_TypeDef *timer, uint32_t flags)
Disable one or more TIMER interrupts.
#define _TIMER_CC_CTRL_MODE_INPUTCAPTURE
__STATIC_INLINE void TIMER_TopSet(TIMER_TypeDef *timer, uint32_t val)
Set top value for timer.
#define _TIMER_CC_CTRL_ICEDGE_FALLING
TIMER_ClkSel_TypeDef clkSel
#define _TIMER_CTRL_PRESC_DIV1
#define _TIMER_CC_CTRL_ICEDGE_NONE
TIMER_OutputAction_TypeDef cufoa
Emlib peripheral API "assert" implementation.
void TIMER_Reset(TIMER_TypeDef *timer)
Reset TIMER to same state as after a HW reset.
TIMER_InputAction_TypeDef fallAction
__STATIC_INLINE void TIMER_Enable(TIMER_TypeDef *timer, bool enable)
Start/stop TIMER.
__STATIC_INLINE void TIMER_CounterSet(TIMER_TypeDef *timer, uint32_t val)
Set TIMER counter value.
#define _TIMER_CC_CTRL_MODE_PWM
#define _TIMER_CC_CTRL_ICEVCTRL_RISING
__STATIC_INLINE void TIMER_IntClear(TIMER_TypeDef *timer, uint32_t flags)
Clear one or more pending TIMER interrupts.
CMSIS Cortex-M Peripheral Access Layer for Silicon Laboratories microcontroller devices.
#define _TIMER_CTRL_MODE_DOWN
TIMER_CCMode_TypeDef mode
#define _TIMER_CC_CTRL_MODE_OUTPUTCOMPARE
#define _TIMER_CC_CTRL_ICEVCTRL_EVERYSECONDEDGE
__STATIC_INLINE void TIMER_IntEnable(TIMER_TypeDef *timer, uint32_t flags)
Enable one or more TIMER interrupts.
#define _TIMER_CTRL_CLKSEL_PRESCHFPERCLK
#define _TIMER_CTRL_PRESC_DIV1024
#define _TIMER_CC_CTRL_ICEVCTRL_EVERYEDGE
#define _TIMER_CC_CTRL_PRSSEL_PRSCH3
__STATIC_INLINE void TIMER_IntSet(TIMER_TypeDef *timer, uint32_t flags)
Set one or more pending TIMER interrupts from SW.
#define _TIMER_CTRL_MODE_UPDOWN
#define _TIMER_CTRL_PRESC_DIV128
TIMER_PRSSEL_TypeDef prsSel
__STATIC_INLINE void TIMER_TopBufSet(TIMER_TypeDef *timer, uint32_t val)
Set top value buffer for timer.
#define _TIMER_CTRL_CLKSEL_TIMEROUF
__STATIC_INLINE uint32_t TIMER_IntGet(TIMER_TypeDef *timer)
Get pending TIMER interrupt flags.
#define _TIMER_CTRL_PRESC_DIV16
#define _TIMER_CTRL_FALLA_STOP
#define _TIMER_CTRL_MODE_UP
TIMER_OutputAction_TypeDef
#define _TIMER_CTRL_PRESC_DIV512
#define _TIMER_CC_CTRL_MODE_OFF
TIMER_Event_TypeDef eventCtrl
#define _TIMER_CTRL_PRESC_DIV4
#define _TIMER_CTRL_PRESC_DIV256
__STATIC_INLINE void TIMER_CompareSet(TIMER_TypeDef *timer, unsigned int ch, uint32_t val)
Set compare value for compare/capture channel when operating in compare or PWM mode.
__STATIC_INLINE uint32_t TIMER_CounterGet(TIMER_TypeDef *timer)
Get TIMER counter value.
#define _TIMER_CC_CTRL_ICEVCTRL_FALLING
#define _TIMER_CC_CTRL_ICEDGE_RISING
#define _TIMER_CTRL_PRESC_DIV32
__STATIC_INLINE uint32_t TIMER_CaptureGet(TIMER_TypeDef *timer, unsigned int ch)
Get capture value for compare/capture channel when operating in capture mode.
TIMER_Prescale_TypeDef prescale
TIMER_OutputAction_TypeDef cofoa
#define _TIMER_CC_CTRL_PRSSEL_PRSCH1
#define _TIMER_CTRL_FALLA_RELOADSTART
#define _TIMER_CC_CTRL_CUFOA_SET
#define _TIMER_CC_CTRL_PRSSEL_PRSCH0
void TIMER_Init(TIMER_TypeDef *timer, const TIMER_Init_TypeDef *init)
Initialize TIMER.
__STATIC_INLINE uint32_t TIMER_TopGet(TIMER_TypeDef *timer)
Get top value setting for timer.
TIMER_InputAction_TypeDef riseAction
__STATIC_INLINE void TIMER_CompareBufSet(TIMER_TypeDef *timer, unsigned int ch, uint32_t val)
Set compare value buffer for compare/capture channel when operating in compare or PWM mode...
#define _TIMER_CC_CTRL_ICEDGE_BOTH
__STATIC_INLINE uint32_t TIMER_IntGetEnabled(TIMER_TypeDef *timer)
Get enabled and pending TIMER interrupt flags. Useful for handling more interrupt sources in the same...
#define _TIMER_CTRL_FALLA_NONE
#define _TIMER_CTRL_PRESC_DIV64
#define _TIMER_CTRL_FALLA_START
#define _TIMER_CTRL_CLKSEL_CC1
#define _TIMER_CC_CTRL_CUFOA_NONE
void TIMER_InitCC(TIMER_TypeDef *timer, unsigned int ch, const TIMER_InitCC_TypeDef *init)
Initialize TIMER compare/capture channel.
TIMER_OutputAction_TypeDef cmoa
#define _TIMER_CC_CTRL_CUFOA_TOGGLE
#define _TIMER_CC_CTRL_PRSSEL_PRSCH2
#define _TIMER_CTRL_MODE_QDEC
#define _TIMER_CTRL_PRESC_DIV8
TIMER_InputAction_TypeDef
#define _TIMER_CTRL_PRESC_DIV2
#define _TIMER_CC_CTRL_CUFOA_CLEAR