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
diff -r 57ac6e3cdfd3 -r a417edff4437 targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/analogout_api.c
--- a/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/analogout_api.c	Wed Jan 13 12:45:11 2016 +0000
+++ b/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/analogout_api.c	Fri Jan 15 07:45:16 2016 +0000
@@ -42,26 +42,18 @@
 #include "em_dac.h"
 #include "em_cmu.h"
 
-uint8_t analogout_get_index(dac_t *obj)
+static uint8_t dac_initialized = 0;
+
+void analogout_init(dac_t *obj, PinName pin)
 {
-    return 0;
-}
-
-void analogout_preinit(dac_t *obj, PinName pin)
-{
+    /* init in-memory structure */
     obj->dac = (DAC_TypeDef *) pinmap_peripheral(pin, PinMap_DAC);
     MBED_ASSERT((int) obj->dac != NC);
 
     obj->channel = pin_location(pin, PinMap_DAC);
     MBED_ASSERT((int) obj->channel != NC);
-}
-
-void analogout_init(dac_t *obj, PinName pin)
-{
-    static uint8_t dac_initialized = 0;
-
-    /* init in-memory structure */
-    analogout_preinit(obj, pin);
+    
+    pin_mode(pin, Disabled);
 
     if (!dac_initialized) {
         /* Initialize the DAC. Will disable both DAC channels, so should only be done once */
@@ -83,19 +75,22 @@
     }
     /* Use default channel settings */
     DAC_InitChannel_TypeDef initChannel = DAC_INITCHANNEL_DEFAULT;
+    initChannel.enable = true;
     DAC_InitChannel(obj->dac, &initChannel, obj->channel);
-
-
 }
 
-void analogout_enable(dac_t *obj, uint8_t enable)
+void analogout_free(dac_t *obj)
 {
-    DAC_Enable(obj->dac, obj->channel, enable);
-}
-
-void analogout_pins_enable(dac_t *obj, uint8_t enable)
-{
-    //not avail for EFM32
+    //Reset channel by re-initializing
+    DAC_InitChannel_TypeDef initChannel = DAC_INITCHANNEL_DEFAULT;
+    initChannel.enable = false;
+    DAC_InitChannel(obj->dac, &initChannel, obj->channel);
+    
+    //Check all channels to see if we can disable the DAC completely
+    if((DAC0->CH0CTRL & DAC_CH0CTRL_EN) == 0 && (DAC0->CH1CTRL & DAC_CH1CTRL_EN) == 0) {
+        CMU_ClockEnable(cmuClock_DAC0, false);
+        dac_initialized = 0;
+    }
 }
 
 static inline void dac_write(dac_t *obj, int value)