Skip to content

Commit dbbe5b6

Browse files
committed
Fix missing clock enable in ADC/DAC
1 parent 8cad2b8 commit dbbe5b6

File tree

2 files changed

+36
-20
lines changed

2 files changed

+36
-20
lines changed

libraries/mbed/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/analogin_api.c

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -43,22 +43,33 @@ void analogin_preinit(analogin_t *obj, PinName pin)
4343

4444
void analogin_init(analogin_t *obj, PinName pin)
4545
{
46-
// TODO_LP only once - module in C++ ?
47-
/* Init with default settings */
48-
ADC_Init_TypeDef init = ADC_INIT_DEFAULT;
49-
ADC_Init(obj->adc, &init);
46+
static uint8_t adc_initialized = 0;
5047

51-
ADC_InitSingle_TypeDef singleInit = ADC_INITSINGLE_DEFAULT;
52-
53-
/* Init for single conversion use, measure input channel with Vdd reference. */
54-
singleInit.reference = adcRefVDD;
55-
singleInit.resolution = adcRes12Bit;
56-
singleInit.acqTime = adcAcqTime32;
57-
58-
ADC_InitSingle(obj->adc, &singleInit);
59-
60-
/* Init pins */
48+
/* Init structure */
6149
analogin_preinit(obj, pin);
50+
51+
/* Only initialize the ADC once */
52+
if (!adc_initialized) {
53+
/* Turn on the clock */
54+
CMU_ClockEnable(cmuClock_ADC0, true);
55+
56+
/* Init with default settings */
57+
ADC_Init_TypeDef init = ADC_INIT_DEFAULT;
58+
init.prescale = 4;
59+
ADC_Init(obj->adc, &init);
60+
61+
/* Init for single conversion use */
62+
ADC_InitSingle_TypeDef singleInit = ADC_INITSINGLE_DEFAULT;
63+
64+
/* Measure input channel with Vdd reference. */
65+
singleInit.reference = adcRefVDD;
66+
singleInit.resolution = adcRes12Bit;
67+
singleInit.acqTime = adcAcqTime32;
68+
69+
ADC_InitSingle(obj->adc, &singleInit);
70+
71+
adc_initialized = 1;
72+
}
6273
}
6374

6475
void analogin_enable(analogin_t *obj, uint8_t enable)

libraries/mbed/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/analogout_api.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "pinmap.h"
2424
#include "pinmap_function.h"
2525
#include "PeripheralPins.h"
26+
#include "clocking.h"
2627

2728
#include "em_dac.h"
2829
#include "em_cmu.h"
@@ -42,30 +43,34 @@ void analogout_preinit(dac_t *obj, PinName pin)
4243
}
4344

4445
void analogout_init(dac_t *obj, PinName pin) {
45-
static uint8_t initialized = 0;
46+
static uint8_t dac_initialized = 0;
4647

47-
if (!initialized) {
48+
/* init in-memory structure */
49+
analogout_preinit(obj, pin);
50+
51+
if (!dac_initialized) {
4852
/* Initialize the DAC. Will disable both DAC channels, so should only be done once */
4953
/* Use default settings */
54+
CMU_ClockEnable(cmuClock_DAC0, true);
55+
5056
DAC_Init_TypeDef init = DAC_INIT_DEFAULT;
5157

5258
/* Calculate the DAC clock prescaler value that will result in a DAC clock
5359
* close to 500kHz. Second parameter is zero. This uses the current HFPERCLK
5460
* frequency instead of setting a new one. */
55-
init.prescale = DAC_PrescaleCalc(500000, 0);
61+
init.prescale = DAC_PrescaleCalc(500000, REFERENCE_FREQUENCY);
5662

5763
/* Set reference voltage to VDD */
5864
init.reference = dacRefVDD;
5965

6066
DAC_Init(obj->dac, &init);
61-
initialized = 1;
67+
dac_initialized = 1;
6268
}
6369
/* Use default channel settings */
6470
DAC_InitChannel_TypeDef initChannel = DAC_INITCHANNEL_DEFAULT;
6571
DAC_InitChannel(obj->dac, &initChannel, obj->channel);
6672

67-
/* init pins */
68-
analogout_preinit(obj, pin);
73+
6974
}
7075

7176
void analogout_enable(dac_t *obj, uint8_t enable)

0 commit comments

Comments
 (0)