36
36
#include "mbed_error.h"
37
37
#include "mbed_debug.h"
38
38
#include "PeripheralPins.h"
39
+ #include "stm32g4xx_ll_bus.h"
39
40
40
41
#if STATIC_PINMAP_READY
41
42
#define ANALOGIN_INIT_DIRECT analogin_init_direct
@@ -72,6 +73,7 @@ static void _analogin_init_direct(analogin_t *obj, const PinMap *pinmap)
72
73
73
74
// Configure ADC object structures
74
75
obj -> handle .State = HAL_ADC_STATE_RESET ;
76
+ memset (& obj -> handle .Init , 0 , sizeof (obj -> handle .Init ));
75
77
obj -> handle .Init .ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2 ;
76
78
obj -> handle .Init .Resolution = ADC_RESOLUTION_12B ;
77
79
obj -> handle .Init .DataAlign = ADC_DATAALIGN_RIGHT ;
@@ -82,40 +84,48 @@ static void _analogin_init_direct(analogin_t *obj, const PinMap *pinmap)
82
84
obj -> handle .Init .NbrOfConversion = 1 ;
83
85
obj -> handle .Init .DiscontinuousConvMode = DISABLE ;
84
86
obj -> handle .Init .NbrOfDiscConversion = 0 ;
85
- obj -> handle .Init .ExternalTrigConv = ADC_EXTERNALTRIG_T1_CC1 ;
87
+ obj -> handle .Init .ExternalTrigConv = ADC_SOFTWARE_START ;
86
88
obj -> handle .Init .ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE ;
87
89
obj -> handle .Init .DMAContinuousRequests = DISABLE ;
88
90
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 ;
89
94
90
95
#if defined(ADC1 )
91
96
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?
94
100
}
95
101
#endif
96
102
#if defined(ADC2 )
97
103
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?
100
107
}
101
108
#endif
102
109
#if defined(ADC3 )
103
110
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?
106
114
}
107
115
#endif
108
116
#if defined(ADC4 )
109
117
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?
112
121
}
113
122
#endif
114
123
115
124
#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?
119
129
}
120
130
121
131
#endif
@@ -153,11 +163,15 @@ uint16_t adc_read(analogin_t *obj)
153
163
154
164
// Configure ADC channel
155
165
sConfig .Rank = ADC_REGULAR_RANK_1 ;
156
- sConfig .SamplingTime = ADC_SAMPLETIME_24CYCLES_5 ;
166
+ sConfig .SamplingTime = ADC_SAMPLETIME_247CYCLES_5 ;
157
167
sConfig .SingleDiff = ADC_SINGLE_ENDED ;
158
168
sConfig .OffsetNumber = ADC_OFFSET_NONE ;
159
169
sConfig .Offset = 0 ;
160
170
171
+ /**
172
+ * TODO - what about internal channels? VBAT, VREF, Temperature?
173
+ * TODO - what about internal OP AMP channels?
174
+ */
161
175
switch (obj -> channel ) {
162
176
case 1 :
163
177
sConfig .Channel = ADC_CHANNEL_1 ;
@@ -202,45 +216,16 @@ uint16_t adc_read(analogin_t *obj)
202
216
sConfig .Channel = ADC_CHANNEL_14 ;
203
217
break ;
204
218
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 ;
211
220
break ;
212
221
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 ;
219
223
break ;
220
224
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 ;
240
226
break ;
241
227
case 18 :
242
- sConfig .SamplingTime = ADC_SAMPLETIME_247CYCLES_5 ;
243
- sConfig .Channel = ADC_CHANNEL_VREFINT ;
228
+ sConfig .Channel = ADC_CHANNEL_18 ;
244
229
break ;
245
230
default :
246
231
return 0 ;
0 commit comments