107107#define ADC_CAL2 ((uint16_t *)(ADC_CAL_ADDRESS + 4))
108108#define ADC_CAL_BITS (12)
109109
110- #elif defined(STM32G0 ) || defined(STM32G4 ) || defined(STM32H5 ) || defined(STM32H7 ) || defined(STM32L1 ) || defined(STM32L4 ) || defined(STM32N6 ) || defined(STM32WB )
110+ #elif defined(STM32G0 ) || defined(STM32G4 ) || defined(STM32H5 ) || defined(STM32H7 ) || defined(STM32L1 ) || defined(STM32L4 ) || defined(STM32N6 ) || defined(STM32U5 ) || defined( STM32WB )
111111
112112#define ADC_SCALE_V (((float)VREFINT_CAL_VREF) / 1000.0f)
113113#define ADC_CAL_ADDRESS (VREFINT_CAL_ADDR)
116116
117117#if defined(STM32H7 )
118118#define ADC_CAL_BITS (16)
119+ #elif defined(STM32U5 )
120+ #define ADC_CAL_BITS (14)
119121#else
120122#define ADC_CAL_BITS (12) // UM2319/UM2570, __HAL_ADC_CALC_TEMPERATURE: 'corresponds to a resolution of 12 bits'
121123#endif
166168#elif defined(STM32N6 )
167169// ADC2 VINP 16
168170#define VBAT_DIV (4)
171+ #elif defined(STM32U5 )
172+ #define VBAT_DIV (4)
169173#else
170174#error Unsupported processor
171175#endif
@@ -233,6 +237,14 @@ static inline uint32_t adc_get_internal_channel(uint32_t channel) {
233237 } else if (channel == 18 ) {
234238 channel = ADC_CHANNEL_VBAT ;
235239 }
240+ #elif defined(STM32U5 )
241+ if (channel == 0 ) {
242+ channel = ADC_CHANNEL_VREFINT ;
243+ } else if (channel == 18 ) {
244+ channel = ADC_CHANNEL_VBAT ;
245+ } else if (channel == 19 ) {
246+ channel = ADC_CHANNEL_TEMPSENSOR ;
247+ }
236248 #endif
237249 return channel ;
238250}
@@ -247,7 +259,7 @@ static bool is_adcx_channel(int channel) {
247259 // The HAL of STM32L1 defines some channels those may not be available on package
248260 return __HAL_ADC_IS_CHANNEL_INTERNAL (channel )
249261 || (channel < MP_ARRAY_SIZE (pin_adcall_table ) && pin_adcall_table [channel ]);
250- #elif defined(STM32G0 ) || defined(STM32H7 )
262+ #elif defined(STM32G0 ) || defined(STM32H7 ) || defined( STM32U5 )
251263 return __HAL_ADC_IS_CHANNEL_INTERNAL (channel )
252264 || IS_ADC_CHANNEL (__HAL_ADC_DECIMAL_NB_TO_CHANNEL (channel ));
253265 #elif defined(STM32G4 ) || defined(STM32L4 ) || defined(STM32WB )
@@ -268,7 +280,7 @@ static void adc_wait_for_eoc_or_timeout(ADC_HandleTypeDef *adcHandle, int32_t ti
268280 uint32_t tickstart = HAL_GetTick ();
269281 #if defined(STM32F4 ) || defined(STM32F7 ) || defined(STM32L1 )
270282 while ((adcHandle -> Instance -> SR & ADC_FLAG_EOC ) != ADC_FLAG_EOC ) {
271- #elif defined(STM32F0) || defined(STM32G0) || defined(STM32G4) || defined(STM32H5) || defined(STM32H7) || defined(STM32L4) || defined(STM32N6) || defined(STM32WB)
283+ #elif defined(STM32F0) || defined(STM32G0) || defined(STM32G4) || defined(STM32H5) || defined(STM32H7) || defined(STM32L4) || defined(STM32N6) || defined(STM32U5) || defined( STM32WB)
272284 while (READ_BIT (adcHandle -> Instance -> ISR , ADC_FLAG_EOC ) != ADC_FLAG_EOC ) {
273285 #else
274286 #error Unsupported processor
@@ -303,6 +315,8 @@ static void adcx_clock_enable(ADC_HandleTypeDef *adch) {
303315 __HAL_RCC_ADC_CONFIG (RCC_ADCCLKSOURCE_SYSCLK );
304316 }
305317 __HAL_RCC_ADC_CLK_ENABLE ();
318+ #elif defined(STM32U5 )
319+ __HAL_RCC_ADC12_CLK_ENABLE ();
306320 #else
307321 #error Unsupported processor
308322 #endif
@@ -353,12 +367,12 @@ static void adcx_init_periph(ADC_HandleTypeDef *adch, uint32_t resolution) {
353367 adch -> Init .LowPowerAutoWait = DISABLE ;
354368 adch -> Init .DataAlign = ADC_DATAALIGN_RIGHT ;
355369 adch -> Init .DMAContinuousRequests = DISABLE ;
356- #elif defined(STM32G0 ) || defined(STM32G4 ) || defined(STM32H5 ) || defined(STM32L4 ) || defined(STM32WB )
370+ #elif defined(STM32G0 ) || defined(STM32G4 ) || defined(STM32H5 ) || defined(STM32L4 ) || defined(STM32U5 ) || defined( STM32WB )
357371 #if defined(STM32G0 )
358372 adch -> Init .SamplingTimeCommon1 = ADC_SAMPLETIME_12CYCLES_5 ;
359373 adch -> Init .SamplingTimeCommon2 = ADC_SAMPLETIME_160CYCLES_5 ;
360374 #endif
361- #if defined(STM32G4 ) || defined(STM32H5 )
375+ #if defined(STM32G4 ) || defined(STM32H5 ) || defined( STM32U5 )
362376 adch -> Init .ClockPrescaler = ADC_CLOCK_ASYNC_DIV16 ;
363377 #else
364378 adch -> Init .ClockPrescaler = ADC_CLOCK_ASYNC_DIV1 ;
@@ -369,6 +383,12 @@ static void adcx_init_periph(ADC_HandleTypeDef *adch, uint32_t resolution) {
369383 adch -> Init .OversamplingMode = DISABLE ;
370384 adch -> Init .DataAlign = ADC_DATAALIGN_RIGHT ;
371385 adch -> Init .DMAContinuousRequests = DISABLE ;
386+ #if defined(STM32U5 )
387+ adch -> Init .GainCompensation = 0 ;
388+ adch -> Init .TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH ;
389+ adch -> Init .LeftBitShift = ADC_LEFTBITSHIFT_NONE ;
390+ adch -> Init .ConversionDataManagement = ADC_CONVERSIONDATA_DR ;
391+ #endif
372392 #elif defined(STM32N6 )
373393 adch -> Init .GainCompensation = 0 ;
374394 adch -> Init .ScanConvMode = ADC_SCAN_DISABLE ;
@@ -384,7 +404,7 @@ static void adcx_init_periph(ADC_HandleTypeDef *adch, uint32_t resolution) {
384404
385405 HAL_ADC_Init (adch );
386406
387- #if defined(STM32H7 )
407+ #if defined(STM32H7 ) || defined( STM32U5 )
388408 HAL_ADCEx_Calibration_Start (adch , ADC_CALIB_OFFSET , ADC_SINGLE_ENDED );
389409 #endif
390410 #if defined(STM32G0 )
@@ -415,6 +435,8 @@ static void adc_config_channel(ADC_HandleTypeDef *adc_handle, uint32_t channel)
415435 if (__HAL_ADC_IS_CHANNEL_INTERNAL (channel ) == 0 ) {
416436 channel = __HAL_ADC_DECIMAL_NB_TO_CHANNEL (channel );
417437 }
438+ #elif defined(STM32U5 )
439+ sConfig .Rank = ADC_REGULAR_RANK_1 ;
418440 #else
419441 sConfig .Rank = 1 ;
420442 #endif
@@ -471,6 +493,15 @@ static void adc_config_channel(ADC_HandleTypeDef *adc_handle, uint32_t channel)
471493 sConfig .OffsetSignedSaturation = DISABLE ;
472494 sConfig .OffsetSaturation = DISABLE ;
473495 sConfig .OffsetSign = ADC_OFFSET_SIGN_POSITIVE ;
496+ #elif defined(STM32U5 )
497+ if (__HAL_ADC_IS_CHANNEL_INTERNAL (channel )) {
498+ sConfig .SamplingTime = ADC_SAMPLETIME_391CYCLES_5 ;
499+ } else {
500+ sConfig .SamplingTime = ADC4_SAMPLETIME_3CYCLES_5 ;
501+ }
502+ sConfig .SingleDiff = ADC_SINGLE_ENDED ;
503+ sConfig .OffsetNumber = ADC_OFFSET_NONE ;
504+ sConfig .Offset = 0 ;
474505 #else
475506 #error Unsupported processor
476507 #endif
@@ -692,7 +723,7 @@ static mp_obj_t adc_read_timed(mp_obj_t self_in, mp_obj_t buf_in, mp_obj_t freq_
692723 // for subsequent samples we can just set the "start sample" bit
693724 #if defined(STM32F4 ) || defined(STM32F7 ) || defined(STM32L1 )
694725 self -> handle .Instance -> CR2 |= (uint32_t )ADC_CR2_SWSTART ;
695- #elif defined(STM32F0 ) || defined(STM32G0 ) || defined(STM32G4 ) || defined(STM32H5 ) || defined(STM32H7 ) || defined(STM32L4 ) || defined(STM32N6 ) || defined(STM32WB )
726+ #elif defined(STM32F0 ) || defined(STM32G0 ) || defined(STM32G4 ) || defined(STM32H5 ) || defined(STM32H7 ) || defined(STM32L4 ) || defined(STM32N6 ) || defined(STM32U5 ) || defined( STM32WB )
696727 SET_BIT (self -> handle .Instance -> CR , ADC_CR_ADSTART );
697728 #else
698729 #error Unsupported processor
@@ -802,7 +833,7 @@ static mp_obj_t adc_read_timed_multi(mp_obj_t adc_array_in, mp_obj_t buf_array_i
802833 // ADC is started: set the "start sample" bit
803834 #if defined(STM32F4 ) || defined(STM32F7 ) || defined(STM32L1 )
804835 adc -> handle .Instance -> CR2 |= (uint32_t )ADC_CR2_SWSTART ;
805- #elif defined(STM32F0 ) || defined(STM32G0 ) || defined(STM32G4 ) || defined(STM32H5 ) || defined(STM32H7 ) || defined(STM32L4 ) || defined(STM32N6 ) || defined(STM32WB )
836+ #elif defined(STM32F0 ) || defined(STM32G0 ) || defined(STM32G4 ) || defined(STM32H5 ) || defined(STM32H7 ) || defined(STM32L4 ) || defined(STM32N6 ) || defined(STM32U5 ) || defined( STM32WB )
806837 SET_BIT (adc -> handle .Instance -> CR , ADC_CR_ADSTART );
807838 #else
808839 #error Unsupported processor
@@ -953,7 +984,7 @@ float adc_read_core_temp_float(ADC_HandleTypeDef *adcHandle) {
953984 return 0.0f ; // TODO
954985 #else
955986
956- #if defined(STM32G0 ) || defined(STM32G4 ) || defined(STM32L1 ) || defined(STM32L4 )
987+ #if defined(STM32G0 ) || defined(STM32G4 ) || defined(STM32L1 ) || defined(STM32L4 ) || defined( STM32U5 )
957988 // Update the reference correction factor before reading tempsensor
958989 // because TS_CAL1 and TS_CAL2 of STM32G0,G4,L1,L4 are at VDDA=3.0V
959990 adc_read_core_vref (adcHandle );
@@ -967,7 +998,7 @@ float adc_read_core_temp_float(ADC_HandleTypeDef *adcHandle) {
967998 return 0 ;
968999 }
9691000 float core_temp_avg_slope = (* ADC_CAL2 - * ADC_CAL1 ) / 100.0f ;
970- #elif defined(STM32H5 ) || defined(STM32WB )
1001+ #elif defined(STM32H5 ) || defined(STM32U5 ) || defined( STM32WB )
9711002 int32_t raw_value = adc_config_and_read_ref (adcHandle , ADC_CHANNEL_TEMPSENSOR );
9721003 float core_temp_avg_slope = (* ADC_CAL2 - * ADC_CAL1 ) / 100.0f ;
9731004 #else
@@ -980,7 +1011,7 @@ float adc_read_core_temp_float(ADC_HandleTypeDef *adcHandle) {
9801011}
9811012
9821013float adc_read_core_vbat (ADC_HandleTypeDef * adcHandle ) {
983- #if defined(STM32G0 ) || defined(STM32G4 ) || defined(STM32L4 )
1014+ #if defined(STM32G0 ) || defined(STM32G4 ) || defined(STM32L4 ) || defined( STM32U5 )
9841015 // Update the reference correction factor before reading tempsensor
9851016 // because VREFINT of STM32G0,G4,L4 is at VDDA=3.0V
9861017 adc_read_core_vref (adcHandle );
0 commit comments