Skip to content

Commit d20d197

Browse files
committed
stm32: Add STM32U5 support.
This change adds STM32U5 support to the STM32 port. STM32U5A5ZJ: https://www.st.com/ja/microcontrollers-microprocessors/stm32u5a5zj.html Signed-off-by: Yuuki NAGAO <[email protected]>
1 parent 673524f commit d20d197

29 files changed

+810
-109
lines changed

ports/stm32/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ HAL_SRC_C += $(addprefix $(STM32LIB_HAL_BASE)/Src/stm32$(MCU_SERIES)xx_,\
367367
)
368368
endif
369369

370-
ifeq ($(MCU_SERIES),$(filter $(MCU_SERIES),f4 f7 g0 g4 h5 h7 l0 l1 l4 n6 wb))
370+
ifeq ($(MCU_SERIES),$(filter $(MCU_SERIES),f4 f7 g0 g4 h5 h7 l0 l1 l4 n6 u5 wb))
371371
HAL_SRC_C += $(addprefix $(STM32LIB_HAL_BASE)/Src/stm32$(MCU_SERIES)xx_,\
372372
hal_pcd.c \
373373
hal_pcd_ex.c \
@@ -408,7 +408,7 @@ $(BUILD)/$(STM32LIB_HAL_BASE)/Src/stm32$(MCU_SERIES)xx_hal_mmc.o: CFLAGS += -Wno
408408
endif
409409
endif
410410

411-
ifeq ($(MCU_SERIES),$(filter $(MCU_SERIES),f4 f7 g0 g4 h5 h7 n6))
411+
ifeq ($(MCU_SERIES),$(filter $(MCU_SERIES),f4 f7 g0 g4 h5 h7 n6 u5))
412412
HAL_SRC_C += $(addprefix $(STM32LIB_HAL_BASE)/Src/stm32$(MCU_SERIES)xx_,\
413413
hal_dma_ex.c \
414414
)

ports/stm32/adc.c

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@
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)
@@ -116,6 +116,8 @@
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
@@ -166,6 +168,8 @@
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

9821013
float 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);

ports/stm32/adc.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ static inline void adc_deselect_vbat(ADC_TypeDef *adc, uint32_t channel) {
5656
adc_common = adc == ADC3 ? ADC3_COMMON : ADC12_COMMON;
5757
#elif defined(STM32L4)
5858
adc_common = __LL_ADC_COMMON_INSTANCE(0);
59+
#elif defined(STM32U5)
60+
adc_common = ADC12_COMMON;
5961
#elif defined(STM32WL)
6062
adc_common = ADC_COMMON;
6163
#endif

0 commit comments

Comments
 (0)