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 ;
0 commit comments