added prescaler for 16 bit pwm in LPC1347 target
Fork of mbed-dev by
Diff: targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/emlib/src/em_letimer.c
- Revision:
- 50:a417edff4437
- Parent:
- 0:9b334a45a8ff
- Child:
- 144:ef7eb2e8f9f7
diff -r 57ac6e3cdfd3 -r a417edff4437 targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/emlib/src/em_letimer.c --- a/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/emlib/src/em_letimer.c Wed Jan 13 12:45:11 2016 +0000 +++ b/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/emlib/src/em_letimer.c Fri Jan 15 07:45:16 2016 +0000 @@ -1,10 +1,10 @@ /***************************************************************************//** * @file em_letimer.c * @brief Low Energy Timer (LETIMER) Peripheral API - * @version 3.20.12 + * @version 4.2.1 ******************************************************************************* * @section License - * <b>(C) Copyright 2014 Silicon Labs, http://www.silabs.com</b> + * <b>(C) Copyright 2015 Silicon Labs, http://www.silabs.com</b> ******************************************************************************* * * Permission is granted to anyone to use this software for any purpose, @@ -30,7 +30,6 @@ * ******************************************************************************/ - #include "em_letimer.h" #if defined(LETIMER_COUNT) && (LETIMER_COUNT > 0) #include "em_cmu.h" @@ -88,12 +87,14 @@ * Bitmask corresponding to SYNCBUSY register defined bits, indicating * registers that must complete any ongoing synchronization. ******************************************************************************/ -__STATIC_INLINE void LETIMER_Sync(LETIMER_TypeDef *letimer, uint32_t mask) +__STATIC_INLINE void regSync(LETIMER_TypeDef *letimer, uint32_t mask) { +#if defined(_LETIMER_FREEZE_MASK) /* Avoid deadlock if modifying the same register twice when freeze mode is */ /* activated. */ if (letimer->FREEZE & LETIMER_FREEZE_REGFREEZE) return; +#endif /* Wait for any pending previous write operation to have been completed */ /* in low frequency domain, only required for Gecko Family of devices */ @@ -130,18 +131,18 @@ /* Initialize selected compare value */ switch (comp) { - case 0: - ret = letimer->COMP0; - break; + case 0: + ret = letimer->COMP0; + break; - case 1: - ret = letimer->COMP1; - break; + case 1: + ret = letimer->COMP1; + break; - default: - /* Unknown compare register selected */ - ret = 0; - break; + default: + /* Unknown compare register selected */ + ret = 0; + break; } return(ret); @@ -174,29 +175,31 @@ { volatile uint32_t *compReg; - EFM_ASSERT(LETIMER_REF_VALID(letimer) && - LETIMER_COMP_REG_VALID(comp) && - ((value & ~(_LETIMER_COMP0_COMP0_MASK >> _LETIMER_COMP0_COMP0_SHIFT)) == 0)); + EFM_ASSERT(LETIMER_REF_VALID(letimer) + && LETIMER_COMP_REG_VALID(comp) + && ((value & ~(_LETIMER_COMP0_COMP0_MASK + >> _LETIMER_COMP0_COMP0_SHIFT)) + == 0)); /* Initialize selected compare value */ switch (comp) { - case 0: - compReg = &(letimer->COMP0); - break; + case 0: + compReg = &(letimer->COMP0); + break; - case 1: - compReg = &(letimer->COMP1); - break; + case 1: + compReg = &(letimer->COMP1); + break; - default: - /* Unknown compare register selected, abort */ - return; + default: + /* Unknown compare register selected, abort */ + return; } #if defined(_EFM32_GECKO_FAMILY) /* LF register about to be modified require sync. busy check */ - LETIMER_Sync(letimer, comp ? LETIMER_SYNCBUSY_COMP1 : LETIMER_SYNCBUSY_COMP0); + regSync(letimer, comp ? LETIMER_SYNCBUSY_COMP1 : LETIMER_SYNCBUSY_COMP0); #endif *compReg = value; @@ -227,7 +230,7 @@ #if defined(_EFM32_GECKO_FAMILY) /* LF register about to be modified require sync. busy check */ - LETIMER_Sync(letimer, LETIMER_SYNCBUSY_CMD); + regSync(letimer, LETIMER_SYNCBUSY_CMD); #endif if (enable) @@ -240,7 +243,7 @@ } } - +#if defined(_LETIMER_FREEZE_MASK) /***************************************************************************//** * @brief * LETIMER register synchronization freeze control. @@ -291,7 +294,7 @@ letimer->FREEZE = 0; } } - +#endif /* defined(_LETIMER_FREEZE_MASK) */ /***************************************************************************//** * @brief @@ -328,7 +331,7 @@ { #if defined(_EFM32_GECKO_FAMILY) /* LF register about to be modified require sync. busy check */ - LETIMER_Sync(letimer, LETIMER_SYNCBUSY_CMD); + regSync(letimer, LETIMER_SYNCBUSY_CMD); #endif letimer->CMD = LETIMER_CMD_STOP; } @@ -340,6 +343,7 @@ tmp |= LETIMER_CTRL_DEBUGRUN; } +#if defined(LETIMER_CTRL_RTCC0TEN) if (init->rtcComp0Enable) { tmp |= LETIMER_CTRL_RTCC0TEN; @@ -349,6 +353,7 @@ { tmp |= LETIMER_CTRL_RTCC1TEN; } +#endif if (init->comp0Top) { @@ -376,7 +381,7 @@ #if defined(_EFM32_GECKO_FAMILY) /* LF register about to be modified require sync. busy check */ - LETIMER_Sync(letimer, LETIMER_SYNCBUSY_CTRL); + regSync(letimer, LETIMER_SYNCBUSY_CTRL); #endif letimer->CTRL = tmp; @@ -385,7 +390,7 @@ { #if defined(_EFM32_GECKO_FAMILY) /* LF register about to be modified require sync. busy check */ - LETIMER_Sync(letimer, LETIMER_SYNCBUSY_CMD); + regSync(letimer, LETIMER_SYNCBUSY_CMD); #endif letimer->CMD = LETIMER_CMD_START; } @@ -414,18 +419,18 @@ /* Initialize selected compare value */ switch (rep) { - case 0: - ret = letimer->REP0; - break; + case 0: + ret = letimer->REP0; + break; - case 1: - ret = letimer->REP1; - break; + case 1: + ret = letimer->REP1; + break; - default: - /* Unknown compare register selected */ - ret = 0; - break; + default: + /* Unknown compare register selected */ + ret = 0; + break; } return(ret); @@ -460,35 +465,37 @@ #if defined(_EFM32_GECKO_FAMILY) uint32_t syncbusy; #endif - EFM_ASSERT(LETIMER_REF_VALID(letimer) && - LETIMER_REP_REG_VALID(rep) && - ((value & ~(_LETIMER_REP0_REP0_MASK >> _LETIMER_REP0_REP0_SHIFT)) == 0)); + EFM_ASSERT(LETIMER_REF_VALID(letimer) + && LETIMER_REP_REG_VALID(rep) + && ((value & ~(_LETIMER_REP0_REP0_MASK + >> _LETIMER_REP0_REP0_SHIFT)) + == 0)); /* Initialize selected compare value */ switch (rep) { - case 0: - repReg = &(letimer->REP0); + case 0: + repReg = &(letimer->REP0); #if defined(_EFM32_GECKO_FAMILY) - syncbusy = LETIMER_SYNCBUSY_REP0; + syncbusy = LETIMER_SYNCBUSY_REP0; #endif - break; + break; - case 1: - repReg = &(letimer->REP1); + case 1: + repReg = &(letimer->REP1); #if defined(_EFM32_GECKO_FAMILY) - syncbusy = LETIMER_SYNCBUSY_REP1; + syncbusy = LETIMER_SYNCBUSY_REP1; #endif - break; + break; - default: - /* Unknown compare register selected, abort */ - return; + default: + /* Unknown compare register selected, abort */ + return; } #if defined(_EFM32_GECKO_FAMILY) /* LF register about to be modified require sync. busy check */ - LETIMER_Sync(letimer, syncbusy); + regSync(letimer, syncbusy); #endif *repReg = value; @@ -508,12 +515,14 @@ ******************************************************************************/ void LETIMER_Reset(LETIMER_TypeDef *letimer) { +#if defined(_LETIMER_FREEZE_MASK) /* Freeze registers to avoid stalling for LF synchronization */ LETIMER_FreezeEnable(letimer, true); +#endif /* Make sure disabled first, before resetting other registers */ - letimer->CMD = LETIMER_CMD_STOP | LETIMER_CMD_CLEAR | - LETIMER_CMD_CTO0 | LETIMER_CMD_CTO1; + letimer->CMD = LETIMER_CMD_STOP | LETIMER_CMD_CLEAR + | LETIMER_CMD_CTO0 | LETIMER_CMD_CTO1; letimer->CTRL = _LETIMER_CTRL_RESETVALUE; letimer->COMP0 = _LETIMER_COMP0_RESETVALUE; letimer->COMP1 = _LETIMER_COMP1_RESETVALUE; @@ -523,8 +532,10 @@ letimer->IFC = _LETIMER_IFC_MASK; /* Do not reset route register, setting should be done independently */ +#if defined(_LETIMER_FREEZE_MASK) /* Unfreeze registers, pass new settings on to LETIMER */ LETIMER_FreezeEnable(letimer, false); +#endif }