added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Revision:
50:a417edff4437
Parent:
0:9b334a45a8ff
Child:
144:ef7eb2e8f9f7
--- 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
 }