@@ -70,6 +70,35 @@ static PinName g_current_pin = NC;
70
70
#endif
71
71
#endif /* !ADC_SAMPLINGTIME */
72
72
73
+ /*
74
+ * Minimum ADC sampling time is required when reading
75
+ * internal channels so set it to max possible value.
76
+ * It can be defined more precisely by defining:
77
+ * ADC_SAMPLINGTIME_INTERNAL
78
+ * to the desired ADC sample time.
79
+ */
80
+ #ifndef ADC_SAMPLINGTIME_INTERNAL
81
+ #if defined(ADC_SAMPLETIME_480CYCLES )
82
+ #define ADC_SAMPLINGTIME_INTERNAL ADC_SAMPLETIME_480CYCLES
83
+ #elif defined(ADC_SAMPLETIME_384CYCLES )
84
+ #define ADC_SAMPLINGTIME_INTERNAL ADC_SAMPLETIME_384CYCLES
85
+ #elif defined(ADC_SAMPLETIME_810CYCLES_5 )
86
+ #define ADC_SAMPLINGTIME_INTERNAL ADC_SAMPLETIME_810CYCLES_5
87
+ #elif defined(ADC_SAMPLETIME_640CYCLES_5 )
88
+ #define ADC_SAMPLINGTIME_INTERNAL ADC_SAMPLETIME_640CYCLES_5
89
+ #elif defined(ADC_SAMPLETIME_601CYCLES_5 )
90
+ #define ADC_SAMPLINGTIME_INTERNAL ADC_SAMPLETIME_601CYCLES_5
91
+ #elif defined(ADC_SAMPLETIME_247CYCLES_5 )
92
+ #define ADC_SAMPLINGTIME_INTERNAL ADC_SAMPLETIME_247CYCLES_5
93
+ #elif defined(ADC_SAMPLETIME_239CYCLES_5 )
94
+ #define ADC_SAMPLINGTIME_INTERNAL ADC_SAMPLETIME_239CYCLES_5
95
+ #elif defined(ADC_SAMPLETIME_160CYCLES_5 )
96
+ #define ADC_SAMPLINGTIME_INTERNAL ADC_SAMPLETIME_160CYCLES_5
97
+ #else
98
+ #error "ADC sampling time could not be defined for internal channels!"
99
+ #endif
100
+ #endif /* !ADC_SAMPLINGTIME_INTERNAL */
101
+
73
102
#ifndef ADC_CLOCK_DIV
74
103
#ifdef ADC_CLOCK_SYNC_PCLK_DIV4
75
104
#define ADC_CLOCK_DIV ADC_CLOCK_SYNC_PCLK_DIV4
@@ -204,6 +233,32 @@ static uint32_t get_adc_channel(PinName pin)
204
233
}
205
234
return channel ;
206
235
}
236
+
237
+ static uint32_t get_adc_internal_channel (PinName pin )
238
+ {
239
+ uint32_t channel = 0 ;
240
+ switch (pin ) {
241
+ #ifdef ADC_CHANNEL_TEMPSENSOR
242
+ case PADC_TEMP :
243
+ channel = ADC_CHANNEL_TEMPSENSOR ;
244
+ break ;
245
+ #endif
246
+ #ifdef ADC_CHANNEL_VREFINT
247
+ case PADC_VREF :
248
+ channel = ADC_CHANNEL_VREFINT ;
249
+ break ;
250
+ #endif
251
+ #ifdef ADC_CHANNEL_VBAT
252
+ case PADC_VBAT :
253
+ channel = ADC_CHANNEL_VBAT ;
254
+ break ;
255
+ #endif
256
+ default :
257
+ channel = 0 ;
258
+ break ;
259
+ }
260
+ return channel ;
261
+ }
207
262
#endif /* HAL_ADC_MODULE_ENABLED */
208
263
209
264
#ifdef HAL_TIM_MODULE_ENABLED
@@ -449,7 +504,9 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
449
504
#endif
450
505
451
506
/* Configure ADC GPIO pin */
452
- pinmap_pinout (g_current_pin , PinMap_ADC );
507
+ if (g_current_pin < PADC_OFFSET ) {
508
+ pinmap_pinout (g_current_pin , PinMap_ADC );
509
+ }
453
510
}
454
511
455
512
/**
@@ -554,8 +611,21 @@ uint16_t adc_read_value(PinName pin)
554
611
ADC_HandleTypeDef AdcHandle = {};
555
612
ADC_ChannelConfTypeDef AdcChannelConf = {};
556
613
__IO uint16_t uhADCxConvertedValue = 0 ;
614
+ uint32_t samplingTime = ADC_SAMPLINGTIME ;
615
+ uint32_t channel = 0 ;
557
616
558
- AdcHandle .Instance = pinmap_peripheral (pin , PinMap_ADC );
617
+ if (pin > PADC_OFFSET ) {
618
+ #if defined(STM32H7xx )
619
+ AdcHandle .Instance = ADC3 ;
620
+ #else
621
+ AdcHandle .Instance = ADC1 ;
622
+ #endif
623
+ channel = get_adc_internal_channel (pin );
624
+ samplingTime = ADC_SAMPLINGTIME_INTERNAL ;
625
+ } else {
626
+ AdcHandle .Instance = pinmap_peripheral (pin , PinMap_ADC );
627
+ channel = get_adc_channel (pin );
628
+ }
559
629
560
630
if (AdcHandle .Instance == NP ) {
561
631
return 0 ;
@@ -613,16 +683,16 @@ uint16_t adc_read_value(PinName pin)
613
683
#endif
614
684
615
685
#if defined(STM32F0xx )
616
- AdcHandle .Init .SamplingTimeCommon = ADC_SAMPLINGTIME ;
686
+ AdcHandle .Init .SamplingTimeCommon = samplingTime ;
617
687
#endif
618
688
#if defined(STM32G0xx )
619
- AdcHandle .Init .SamplingTimeCommon1 = ADC_SAMPLINGTIME ; /* Set sampling time common to a group of channels. */
620
- AdcHandle .Init .SamplingTimeCommon2 = ADC_SAMPLINGTIME ; /* Set sampling time common to a group of channels, second common setting possible.*/
689
+ AdcHandle .Init .SamplingTimeCommon1 = samplingTime ; /* Set sampling time common to a group of channels. */
690
+ AdcHandle .Init .SamplingTimeCommon2 = samplingTime ; /* Set sampling time common to a group of channels, second common setting possible.*/
621
691
AdcHandle .Init .TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH ;
622
692
#endif
623
693
#if defined(STM32L0xx )
624
694
AdcHandle .Init .LowPowerFrequencyMode = DISABLE ; /* To be enabled only if ADC clock < 2.8 MHz */
625
- AdcHandle .Init .SamplingTime = ADC_SAMPLINGTIME ;
695
+ AdcHandle .Init .SamplingTime = samplingTime ;
626
696
#endif
627
697
#if !defined(STM32F0xx ) && !defined(STM32F1xx ) && !defined(STM32F2xx ) && \
628
698
!defined(STM32F3xx ) && !defined(STM32F4xx ) && !defined(STM32F7xx ) && \
@@ -649,7 +719,8 @@ uint16_t adc_read_value(PinName pin)
649
719
return 0 ;
650
720
}
651
721
652
- AdcChannelConf .Channel = get_adc_channel (pin ); /* Specifies the channel to configure into ADC */
722
+ AdcChannelConf .Channel = channel ; /* Specifies the channel to configure into ADC */
723
+
653
724
#if defined(STM32L4xx ) || defined(STM32WBxx )
654
725
if (!IS_ADC_CHANNEL (& AdcHandle , AdcChannelConf .Channel )) {
655
726
return 0 ;
@@ -662,7 +733,7 @@ uint16_t adc_read_value(PinName pin)
662
733
AdcChannelConf .Rank = ADC_REGULAR_RANK_1 ; /* Specifies the rank in the regular group sequencer */
663
734
#if !defined(STM32L0xx )
664
735
#if !defined(STM32G0xx )
665
- AdcChannelConf .SamplingTime = ADC_SAMPLINGTIME ; /* Sampling time value to be set for the selected channel */
736
+ AdcChannelConf .SamplingTime = samplingTime ; /* Sampling time value to be set for the selected channel */
666
737
#else
667
738
AdcChannelConf .SamplingTime = ADC_SAMPLINGTIME_COMMON_1 ; /* Sampling time value to be set for the selected channel */
668
739
#endif
0 commit comments