34 #if defined(LETIMER_COUNT) && (LETIMER_COUNT > 0)
56 #define LETIMER_COMP_REG_VALID(reg) (((reg) <= 1))
59 #define LETIMER_REF_VALID(ref) ((ref) == LETIMER0)
62 #define LETIMER_REP_REG_VALID(reg) (((reg) <= 1))
73 #if defined(_EFM32_GECKO_FAMILY)
90 __STATIC_INLINE
void regSync(LETIMER_TypeDef *letimer, uint32_t mask)
92 #if defined(_LETIMER_FREEZE_MASK)
95 if (letimer->FREEZE & LETIMER_FREEZE_REGFREEZE)
101 while (letimer->SYNCBUSY & mask)
125 uint32_t LETIMER_CompareGet(LETIMER_TypeDef *letimer,
unsigned int comp)
129 EFM_ASSERT(LETIMER_REF_VALID(letimer) && LETIMER_COMP_REG_VALID(comp));
135 ret = letimer->COMP0;
139 ret = letimer->COMP1;
172 void LETIMER_CompareSet(LETIMER_TypeDef *letimer,
176 volatile uint32_t *compReg;
178 EFM_ASSERT(LETIMER_REF_VALID(letimer)
179 && LETIMER_COMP_REG_VALID(comp)
180 && ((value & ~(_LETIMER_COMP0_COMP0_MASK
181 >> _LETIMER_COMP0_COMP0_SHIFT))
188 compReg = &(letimer->COMP0);
192 compReg = &(letimer->COMP1);
200 #if defined(_EFM32_GECKO_FAMILY)
202 regSync(letimer, comp ? LETIMER_SYNCBUSY_COMP1 : LETIMER_SYNCBUSY_COMP0);
227 void LETIMER_Enable(LETIMER_TypeDef *letimer,
bool enable)
229 EFM_ASSERT(LETIMER_REF_VALID(letimer));
231 #if defined(_EFM32_GECKO_FAMILY)
233 regSync(letimer, LETIMER_SYNCBUSY_CMD);
238 letimer->CMD = LETIMER_CMD_START;
242 letimer->CMD = LETIMER_CMD_STOP;
246 #if defined(_LETIMER_FREEZE_MASK)
274 void LETIMER_FreezeEnable(LETIMER_TypeDef *letimer,
bool enable)
287 while (letimer->SYNCBUSY)
290 letimer->FREEZE = LETIMER_FREEZE_REGFREEZE;
323 void LETIMER_Init(LETIMER_TypeDef *letimer,
const LETIMER_Init_TypeDef *init)
327 EFM_ASSERT(LETIMER_REF_VALID(letimer));
330 if (!(init->enable) && (letimer->STATUS & LETIMER_STATUS_RUNNING))
332 #if defined(_EFM32_GECKO_FAMILY)
334 regSync(letimer, LETIMER_SYNCBUSY_CMD);
336 letimer->CMD = LETIMER_CMD_STOP;
343 tmp |= LETIMER_CTRL_DEBUGRUN;
346 #if defined(LETIMER_CTRL_RTCC0TEN)
347 if (init->rtcComp0Enable)
349 tmp |= LETIMER_CTRL_RTCC0TEN;
352 if (init->rtcComp1Enable)
354 tmp |= LETIMER_CTRL_RTCC1TEN;
360 tmp |= LETIMER_CTRL_COMP0TOP;
365 tmp |= LETIMER_CTRL_BUFTOP;
370 tmp |= LETIMER_CTRL_OPOL0;
375 tmp |= LETIMER_CTRL_OPOL1;
378 tmp |= init->ufoa0 << _LETIMER_CTRL_UFOA0_SHIFT;
379 tmp |= init->ufoa1 << _LETIMER_CTRL_UFOA1_SHIFT;
380 tmp |= init->repMode << _LETIMER_CTRL_REPMODE_SHIFT;
382 #if defined(_EFM32_GECKO_FAMILY)
384 regSync(letimer, LETIMER_SYNCBUSY_CTRL);
389 if (init->enable && !(letimer->STATUS & LETIMER_STATUS_RUNNING))
391 #if defined(_EFM32_GECKO_FAMILY)
393 regSync(letimer, LETIMER_SYNCBUSY_CMD);
395 letimer->CMD = LETIMER_CMD_START;
413 uint32_t LETIMER_RepeatGet(LETIMER_TypeDef *letimer,
unsigned int rep)
417 EFM_ASSERT(LETIMER_REF_VALID(letimer) && LETIMER_REP_REG_VALID(rep));
460 void LETIMER_RepeatSet(LETIMER_TypeDef *letimer,
464 volatile uint32_t *repReg;
465 #if defined(_EFM32_GECKO_FAMILY)
468 EFM_ASSERT(LETIMER_REF_VALID(letimer)
469 && LETIMER_REP_REG_VALID(rep)
470 && ((value & ~(_LETIMER_REP0_REP0_MASK
471 >> _LETIMER_REP0_REP0_SHIFT))
478 repReg = &(letimer->REP0);
479 #if defined(_EFM32_GECKO_FAMILY)
480 syncbusy = LETIMER_SYNCBUSY_REP0;
485 repReg = &(letimer->REP1);
486 #if defined(_EFM32_GECKO_FAMILY)
487 syncbusy = LETIMER_SYNCBUSY_REP1;
496 #if defined(_EFM32_GECKO_FAMILY)
498 regSync(letimer, syncbusy);
516 void LETIMER_Reset(LETIMER_TypeDef *letimer)
518 #if defined(_LETIMER_FREEZE_MASK)
520 LETIMER_FreezeEnable(letimer,
true);
524 letimer->CMD = LETIMER_CMD_STOP | LETIMER_CMD_CLEAR
525 | LETIMER_CMD_CTO0 | LETIMER_CMD_CTO1;
526 letimer->CTRL = _LETIMER_CTRL_RESETVALUE;
527 letimer->COMP0 = _LETIMER_COMP0_RESETVALUE;
528 letimer->COMP1 = _LETIMER_COMP1_RESETVALUE;
529 letimer->REP0 = _LETIMER_REP0_RESETVALUE;
530 letimer->REP1 = _LETIMER_REP1_RESETVALUE;
531 letimer->IEN = _LETIMER_IEN_RESETVALUE;
532 letimer->IFC = _LETIMER_IFC_MASK;
535 #if defined(_LETIMER_FREEZE_MASK)
537 LETIMER_FreezeEnable(letimer,
false);
Clock management unit (CMU) API.
Emlib peripheral API "assert" implementation.
Low Energy Timer (LETIMER) peripheral API.