51
51
/// val = adc.read_core_vref() # read MCU VREF
52
52
53
53
/* ADC defintions */
54
-
55
- #if defined(STM32H7 )
56
- #define ADCx (ADC3)
57
- #define PIN_ADC_MASK PIN_ADC3
58
- #define pin_adc_table pin_adc3
59
- #else
60
54
#define ADCx (ADC1)
61
55
#define PIN_ADC_MASK PIN_ADC1
62
56
#define pin_adc_table pin_adc1
63
- #endif
64
57
65
58
#define ADCx_CLK_ENABLE __HAL_RCC_ADC1_CLK_ENABLE
66
59
142
135
defined(STM32F746xx ) || defined(STM32F765xx ) || \
143
136
defined(STM32F767xx ) || defined(STM32F769xx )
144
137
#define VBAT_DIV (4)
145
- #elif defined(STM32H743xx )
138
+ #elif defined(STM32H743xx ) || defined( STM32H747xx )
146
139
#define VBAT_DIV (4)
147
140
#elif defined(STM32L432xx ) || \
148
141
defined(STM32L451xx ) || defined(STM32L452xx ) || \
@@ -214,12 +207,12 @@ STATIC bool is_adcx_channel(int channel) {
214
207
#endif
215
208
}
216
209
217
- STATIC void adc_wait_for_eoc_or_timeout (int32_t timeout ) {
210
+ STATIC void adc_wait_for_eoc_or_timeout (ADC_HandleTypeDef * adcHandle , int32_t timeout ) {
218
211
uint32_t tickstart = HAL_GetTick ();
219
212
#if defined(STM32F4 ) || defined(STM32F7 )
220
- while ((ADCx -> SR & ADC_FLAG_EOC ) != ADC_FLAG_EOC ) {
213
+ while ((adcHandle -> Instance -> SR & ADC_FLAG_EOC ) != ADC_FLAG_EOC ) {
221
214
#elif defined(STM32F0) || defined(STM32H7) || defined(STM32L4) || defined(STM32WB)
222
- while (READ_BIT (ADCx -> ISR , ADC_FLAG_EOC ) != ADC_FLAG_EOC ) {
215
+ while (READ_BIT (adcHandle -> Instance -> ISR , ADC_FLAG_EOC ) != ADC_FLAG_EOC ) {
223
216
#else
224
217
#error Unsupported processor
225
218
#endif
@@ -229,11 +222,15 @@ STATIC void adc_wait_for_eoc_or_timeout(int32_t timeout) {
229
222
}
230
223
}
231
224
232
- STATIC void adcx_clock_enable (void ) {
225
+ STATIC void adcx_clock_enable (ADC_HandleTypeDef * adch ) {
233
226
#if defined(STM32F0 ) || defined(STM32F4 ) || defined(STM32F7 )
234
227
ADCx_CLK_ENABLE ();
235
228
#elif defined(STM32H7 )
236
- __HAL_RCC_ADC3_CLK_ENABLE ();
229
+ if (adch -> Instance == ADC3 ) {
230
+ __HAL_RCC_ADC3_CLK_ENABLE ();
231
+ } else {
232
+ __HAL_RCC_ADC12_CLK_ENABLE ();
233
+ }
237
234
__HAL_RCC_ADC_CONFIG (RCC_ADCCLKSOURCE_CLKP );
238
235
#elif defined(STM32L4 ) || defined(STM32WB )
239
236
if (__HAL_RCC_GET_ADC_SOURCE () == RCC_ADCCLKSOURCE_NONE ) {
@@ -246,9 +243,8 @@ STATIC void adcx_clock_enable(void) {
246
243
}
247
244
248
245
STATIC void adcx_init_periph (ADC_HandleTypeDef * adch , uint32_t resolution ) {
249
- adcx_clock_enable ();
246
+ adcx_clock_enable (adch );
250
247
251
- adch -> Instance = ADCx ;
252
248
adch -> Init .Resolution = resolution ;
253
249
adch -> Init .ContinuousConvMode = DISABLE ;
254
250
adch -> Init .DiscontinuousConvMode = DISABLE ;
@@ -308,6 +304,7 @@ STATIC void adc_init_single(pyb_obj_adc_t *adc_obj) {
308
304
mp_hal_pin_config (pin , MP_HAL_PIN_MODE_ADC , MP_HAL_PIN_PULL_NONE , 0 );
309
305
}
310
306
307
+ adc_obj -> handle .Instance = ADCx ;
311
308
adcx_init_periph (& adc_obj -> handle , ADC_RESOLUTION_12B );
312
309
313
310
#if defined(STM32L4 ) && defined(ADC_DUALMODE_REGSIMULT_INJECSIMULT )
@@ -335,7 +332,11 @@ STATIC void adc_config_channel(ADC_HandleTypeDef *adc_handle, uint32_t channel)
335
332
#if defined(STM32F0 )
336
333
sConfig .SamplingTime = ADC_SAMPLETIME_55CYCLES_5 ;
337
334
#elif defined(STM32F4 ) || defined(STM32F7 )
338
- sConfig .SamplingTime = ADC_SAMPLETIME_15CYCLES ;
335
+ if (__HAL_ADC_IS_CHANNEL_INTERNAL (channel )) {
336
+ sConfig .SamplingTime = ADC_SAMPLETIME_480CYCLES ;
337
+ } else {
338
+ sConfig .SamplingTime = ADC_SAMPLETIME_15CYCLES ;
339
+ }
339
340
#elif defined(STM32H7 )
340
341
if (__HAL_ADC_IS_CHANNEL_INTERNAL (channel )) {
341
342
sConfig .SamplingTime = ADC_SAMPLETIME_810CYCLES_5 ;
@@ -370,8 +371,8 @@ STATIC void adc_config_channel(ADC_HandleTypeDef *adc_handle, uint32_t channel)
370
371
371
372
STATIC uint32_t adc_read_channel (ADC_HandleTypeDef * adcHandle ) {
372
373
HAL_ADC_Start (adcHandle );
373
- adc_wait_for_eoc_or_timeout (EOC_TIMEOUT );
374
- uint32_t value = ADCx -> DR ;
374
+ adc_wait_for_eoc_or_timeout (adcHandle , EOC_TIMEOUT );
375
+ uint32_t value = adcHandle -> Instance -> DR ;
375
376
HAL_ADC_Stop (adcHandle );
376
377
return value ;
377
378
}
@@ -529,19 +530,19 @@ STATIC mp_obj_t adc_read_timed(mp_obj_t self_in, mp_obj_t buf_in, mp_obj_t freq_
529
530
} else {
530
531
// for subsequent samples we can just set the "start sample" bit
531
532
#if defined(STM32F4 ) || defined(STM32F7 )
532
- ADCx -> CR2 |= (uint32_t )ADC_CR2_SWSTART ;
533
+ self -> handle . Instance -> CR2 |= (uint32_t )ADC_CR2_SWSTART ;
533
534
#elif defined(STM32F0 ) || defined(STM32H7 ) || defined(STM32L4 ) || defined(STM32WB )
534
- SET_BIT (ADCx -> CR , ADC_CR_ADSTART );
535
+ SET_BIT (self -> handle . Instance -> CR , ADC_CR_ADSTART );
535
536
#else
536
537
#error Unsupported processor
537
538
#endif
538
539
}
539
540
540
541
// wait for sample to complete
541
- adc_wait_for_eoc_or_timeout (EOC_TIMEOUT );
542
+ adc_wait_for_eoc_or_timeout (& self -> handle , EOC_TIMEOUT );
542
543
543
544
// read value
544
- uint value = ADCx -> DR ;
545
+ uint value = self -> handle . Instance -> DR ;
545
546
546
547
// store value in buffer
547
548
if (typesize == 1 ) {
@@ -608,9 +609,9 @@ STATIC mp_obj_t adc_read_timed_multi(mp_obj_t adc_array_in, mp_obj_t buf_array_i
608
609
adc_config_channel (& adc0 -> handle , adc0 -> channel );
609
610
HAL_ADC_Start (& adc0 -> handle );
610
611
// Wait for sample to complete and discard
611
- adc_wait_for_eoc_or_timeout (EOC_TIMEOUT );
612
+ adc_wait_for_eoc_or_timeout (& adc0 -> handle , EOC_TIMEOUT );
612
613
// Read (and discard) value
613
- uint value = ADCx -> DR ;
614
+ uint value = adc0 -> handle . Instance -> DR ;
614
615
615
616
// Ensure first sample is on a timer tick
616
617
__HAL_TIM_CLEAR_FLAG (tim , TIM_FLAG_UPDATE );
@@ -639,17 +640,17 @@ STATIC mp_obj_t adc_read_timed_multi(mp_obj_t adc_array_in, mp_obj_t buf_array_i
639
640
// for the first sample we need to turn the ADC on
640
641
// ADC is started: set the "start sample" bit
641
642
#if defined(STM32F4 ) || defined(STM32F7 )
642
- ADCx -> CR2 |= (uint32_t )ADC_CR2_SWSTART ;
643
+ adc -> handle . Instance -> CR2 |= (uint32_t )ADC_CR2_SWSTART ;
643
644
#elif defined(STM32F0 ) || defined(STM32H7 ) || defined(STM32L4 ) || defined(STM32WB )
644
- SET_BIT (ADCx -> CR , ADC_CR_ADSTART );
645
+ SET_BIT (adc -> handle . Instance -> CR , ADC_CR_ADSTART );
645
646
#else
646
647
#error Unsupported processor
647
648
#endif
648
649
// wait for sample to complete
649
- adc_wait_for_eoc_or_timeout (EOC_TIMEOUT );
650
+ adc_wait_for_eoc_or_timeout (& adc -> handle , EOC_TIMEOUT );
650
651
651
652
// read value
652
- value = ADCx -> DR ;
653
+ value = adc -> handle . Instance -> DR ;
653
654
654
655
// store values in buffer
655
656
if (typesize == 1 ) {
@@ -723,13 +724,24 @@ void adc_init_all(pyb_adc_all_obj_t *adc_all, uint32_t resolution, uint32_t en_m
723
724
if (en_mask & (1 << channel )) {
724
725
// Channels 0-16 correspond to real pins. Configure the GPIO pin in
725
726
// ADC mode.
727
+ #if defined(STM32H7 )
728
+ const pin_obj_t * pin = pin_adc3 [channel ];
729
+ #else
726
730
const pin_obj_t * pin = pin_adc_table [channel ];
731
+ #endif
727
732
if (pin ) {
728
733
mp_hal_pin_config (pin , MP_HAL_PIN_MODE_ADC , MP_HAL_PIN_PULL_NONE , 0 );
729
734
}
730
735
}
731
736
}
732
737
738
+ #if defined(STM32H7 )
739
+ // On the H7 the internal channels are connected to ADC3. To read internal channels
740
+ // with ADCAll, ADC3 must be used here, and ADC12 is used to read the GPIO channels.
741
+ adc_all -> handle .Instance = ADC3 ;
742
+ #else
743
+ adc_all -> handle .Instance = ADCx ;
744
+ #endif
733
745
adcx_init_periph (& adc_all -> handle , resolution );
734
746
}
735
747
0 commit comments