Skip to content

Commit e9d6c9c

Browse files
committed
Fix AnalogIn implementation on STM32G4 series
1 parent 2ab7b44 commit e9d6c9c

File tree

2 files changed

+31
-49
lines changed

2 files changed

+31
-49
lines changed

targets/TARGET_STM/TARGET_STM32G4/analogin_device.c

Lines changed: 31 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include "mbed_error.h"
3737
#include "mbed_debug.h"
3838
#include "PeripheralPins.h"
39+
#include "stm32g4xx_ll_bus.h"
3940

4041
#if STATIC_PINMAP_READY
4142
#define ANALOGIN_INIT_DIRECT analogin_init_direct
@@ -72,6 +73,7 @@ static void _analogin_init_direct(analogin_t *obj, const PinMap *pinmap)
7273

7374
// Configure ADC object structures
7475
obj->handle.State = HAL_ADC_STATE_RESET;
76+
memset(&obj->handle.Init, 0, sizeof(obj->handle.Init));
7577
obj->handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
7678
obj->handle.Init.Resolution = ADC_RESOLUTION_12B;
7779
obj->handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
@@ -82,40 +84,48 @@ static void _analogin_init_direct(analogin_t *obj, const PinMap *pinmap)
8284
obj->handle.Init.NbrOfConversion = 1;
8385
obj->handle.Init.DiscontinuousConvMode = DISABLE;
8486
obj->handle.Init.NbrOfDiscConversion = 0;
85-
obj->handle.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T1_CC1;
87+
obj->handle.Init.ExternalTrigConv = ADC_SOFTWARE_START;
8688
obj->handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
8789
obj->handle.Init.DMAContinuousRequests = DISABLE;
8890
obj->handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
91+
obj->handle.Init.GainCompensation = 0;
92+
obj->handle.Init.OversamplingMode = DISABLE;
93+
obj->handle.Init.SamplingMode = ADC_SAMPLING_MODE_NORMAL;
8994

9095
#if defined(ADC1)
9196
if ((ADCName)obj->handle.Instance == ADC_1) {
92-
__HAL_RCC_ADC12_CONFIG(RCC_ADC12CLKSOURCE_SYSCLK); // TODO - which clock?
93-
// SYSCLK or PLL?
97+
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC12); // TODO - disable clock with deinit?
98+
__HAL_RCC_ADC12_CONFIG(RCC_ADC12CLKSOURCE_SYSCLK); // TODO - which clock?
99+
// SYSCLK or PLL?
94100
}
95101
#endif
96102
#if defined(ADC2)
97103
if ((ADCName)obj->handle.Instance == ADC_2) {
98-
__HAL_RCC_ADC12_CONFIG(RCC_ADC12CLKSOURCE_SYSCLK); // TODO - which clock?
99-
// SYSCLK or PLL?
104+
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC12); // TODO - disable clock with deinit?
105+
__HAL_RCC_ADC12_CONFIG(RCC_ADC12CLKSOURCE_SYSCLK); // TODO - which clock?
106+
// SYSCLK or PLL?
100107
}
101108
#endif
102109
#if defined(ADC3)
103110
if ((ADCName)obj->handle.Instance == ADC_3) {
104-
__HAL_RCC_ADC345_CONFIG(RCC_ADC345CLKSOURCE_SYSCLK); // TODO - which clock?
105-
// SYSCLK or PLL?
111+
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC345); // TODO - disable clock with deinit?
112+
__HAL_RCC_ADC345_CONFIG(RCC_ADC345CLKSOURCE_SYSCLK); // TODO - which clock?
113+
// SYSCLK or PLL?
106114
}
107115
#endif
108116
#if defined(ADC4)
109117
if ((ADCName)obj->handle.Instance == ADC_4) {
110-
__HAL_RCC_ADC345_CONFIG(RCC_ADC345CLKSOURCE_SYSCLK); // TODO - which clock?
111-
// SYSCLK or PLL?
118+
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC345); // TODO - disable clock with deinit?
119+
__HAL_RCC_ADC345_CONFIG(RCC_ADC345CLKSOURCE_SYSCLK); // TODO - which clock?
120+
// SYSCLK or PLL?
112121
}
113122
#endif
114123

115124
#if defined(ADC5)
116-
if ((ADCName)obj->handle.Instance == ADC_4) {
117-
__HAL_RCC_ADC345_CONFIG(RCC_ADC345CLKSOURCE_SYSCLK); // TODO - which clock?
118-
// SYSCLK or PLL?
125+
if ((ADCName)obj->handle.Instance == ADC_5) {
126+
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC345); // TODO - disable clock with deinit?
127+
__HAL_RCC_ADC345_CONFIG(RCC_ADC345CLKSOURCE_SYSCLK); // TODO - which clock?
128+
// SYSCLK or PLL?
119129
}
120130

121131
#endif
@@ -153,11 +163,15 @@ uint16_t adc_read(analogin_t *obj)
153163

154164
// Configure ADC channel
155165
sConfig.Rank = ADC_REGULAR_RANK_1;
156-
sConfig.SamplingTime = ADC_SAMPLETIME_24CYCLES_5;
166+
sConfig.SamplingTime = ADC_SAMPLETIME_247CYCLES_5;
157167
sConfig.SingleDiff = ADC_SINGLE_ENDED;
158168
sConfig.OffsetNumber = ADC_OFFSET_NONE;
159169
sConfig.Offset = 0;
160170

171+
/**
172+
* TODO - what about internal channels? VBAT, VREF, Temperature?
173+
* TODO - what about internal OP AMP channels?
174+
*/
161175
switch (obj->channel) {
162176
case 1:
163177
sConfig.Channel = ADC_CHANNEL_1;
@@ -202,45 +216,16 @@ uint16_t adc_read(analogin_t *obj)
202216
sConfig.Channel = ADC_CHANNEL_14;
203217
break;
204218
case 15:
205-
if ((ADCName)obj->handle.Instance == ADC_1) {
206-
sConfig.Channel = ADC_CHANNEL_VOPAMP1;
207-
sConfig.SamplingTime = ADC_SAMPLETIME_247CYCLES_5;
208-
} else {
209-
sConfig.Channel = ADC_CHANNEL_15;
210-
}
219+
sConfig.Channel = ADC_CHANNEL_15;
211220
break;
212221
case 16:
213-
if ((ADCName)obj->handle.Instance == ADC_1) {
214-
sConfig.Channel = ADC_CHANNEL_TEMPSENSOR_ADC1;
215-
sConfig.SamplingTime = ADC_SAMPLETIME_247CYCLES_5;
216-
} else {
217-
sConfig.Channel = ADC_CHANNEL_16;
218-
}
222+
sConfig.Channel = ADC_CHANNEL_16;
219223
break;
220224
case 17:
221-
sConfig.SamplingTime = ADC_SAMPLETIME_247CYCLES_5;
222-
if ((ADCName)obj->handle.Instance == ADC_1) {
223-
sConfig.Channel = ADC_CHANNEL_VBAT;
224-
}
225-
#if defined(ADC2)
226-
if ((ADCName)obj->handle.Instance == ADC_2) {
227-
sConfig.Channel = ADC_CHANNEL_VOPAMP2;
228-
}
229-
#endif
230-
#if defined(ADC3)
231-
if ((ADCName)obj->handle.Instance == ADC_3) {
232-
sConfig.Channel = ADC_CHANNEL_VOPAMP3_ADC3;
233-
}
234-
#endif
235-
#if defined(ADC4)
236-
if ((ADCName)obj->handle.Instance == ADC_4) {
237-
sConfig.Channel = ADC_CHANNEL_VOPAMP4;
238-
}
239-
#endif
225+
sConfig.Channel = ADC_CHANNEL_17;
240226
break;
241227
case 18:
242-
sConfig.SamplingTime = ADC_SAMPLETIME_247CYCLES_5;
243-
sConfig.Channel = ADC_CHANNEL_VREFINT;
228+
sConfig.Channel = ADC_CHANNEL_18;
244229
break;
245230
default:
246231
return 0;

targets/targets.json

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2469,9 +2469,6 @@
24692469
"EXTRA_IDLE_STACK_REQUIRED",
24702470
"MBED_TICKLESS"
24712471
],
2472-
"device_has_remove": [
2473-
"ANALOGIN"
2474-
],
24752472
"overrides": {
24762473
"lpticker_delay_ticks": 0
24772474
},

0 commit comments

Comments
 (0)