Skip to main content
Associate
December 9, 2025
Question

[BUG REPORT] STM32CubeMx 6.16 STM32U5A5

  • December 9, 2025
  • 1 reply
  • 484 views

When enabling 2 ADCs ,  ADC1 and ADC2 of  STM32U5A5 ,both in Independent mode . The RCC enabling in MspInit called only for ADC1 and not for ADC2. What causes , that If one decide disable generataion of call to MX_ADC1_Init() in CubeMx , in order to call it somwhere else , but still enable generation to call to MX_ADC2_Init() in CubeMx , ADC2 won't work untill MX_ADC1_Init() is called.

1 reply

Ghofrane GSOURI
Technical Moderator
December 9, 2025

Hello @b3pr0 

After enabling ADC1 and ADC2  both in Independent mode and generate the code in the  stm32u5xx_hal_msp.c

static uint32_t HAL_RCC_ADC12_CLK_ENABLED=0;

/**
 * @brief ADC MSP Initialization
 * This function configures the hardware resources used in this example
 * @param hadc: ADC handle pointer
 * @retval None
 */
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
 GPIO_InitTypeDef GPIO_InitStruct = {0};
 RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
 if(hadc->Instance==ADC1)
 {
 /* USER CODE BEGIN ADC1_MspInit 0 */

 /* USER CODE END ADC1_MspInit 0 */

 /** Initializes the peripherals clock
 */
 PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADCDAC;
 PeriphClkInit.AdcDacClockSelection = RCC_ADCDACCLKSOURCE_HSI;
 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
 {
 Error_Handler();
 }

 /* Peripheral clock enable */
 HAL_RCC_ADC12_CLK_ENABLED++;
 if(HAL_RCC_ADC12_CLK_ENABLED==1){
 __HAL_RCC_ADC12_CLK_ENABLE();
 }
 /* USER CODE BEGIN ADC1_MspInit 1 */

 /* USER CODE END ADC1_MspInit 1 */
 }
 else if(hadc->Instance==ADC2)
 {
 /* USER CODE BEGIN ADC2_MspInit 0 */

 /* USER CODE END ADC2_MspInit 0 */

 /** Initializes the peripherals clock
 */
 PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADCDAC;
 PeriphClkInit.AdcDacClockSelection = RCC_ADCDACCLKSOURCE_HSI;
 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
 {
 Error_Handler();
 }

 /* Peripheral clock enable */
 HAL_RCC_ADC12_CLK_ENABLED++;
 if(HAL_RCC_ADC12_CLK_ENABLED==1){
 __HAL_RCC_ADC12_CLK_ENABLE();
 }

 __HAL_RCC_GPIOB_CLK_ENABLE();
 /**ADC2 GPIO Configuration
 PB2 ------> ADC2_IN17
 */
 GPIO_InitStruct.Pin = GPIO_PIN_2;
 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

 /* USER CODE BEGIN ADC2_MspInit 1 */

 /* USER CODE END ADC2_MspInit 1 */
 }

}

As you can see, the clock enabling code is present in both the ADC1 and ADC2 branches of the HAL_ADC_MspInit() function. As a result, ADC2 will operate correctly because its clock is properly activated during its own initialization. The operation of ADC2 is independent of whether MX_ADC1_Init() is called, since the clock enabling is handled separately for each ADC within HAL_ADC_MspInit().

 

THX

Ghofrane

To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.
b3pr0Author
Associate
December 16, 2025

Sorry for late reply , haven't worked with ADC for a while .

 

I can't confirm your result 

static uint32_t HAL_RCC_ADC12_CLK_ENABLED=0;

void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{

 GPIO_InitTypeDef GPIO_InitStruct = {0};
 RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
 if(adcHandle->Instance==ADC1)
 {
 /* USER CODE BEGIN ADC1_MspInit 0 */

 /* USER CODE END ADC1_MspInit 0 */

 /** Initializes the peripherals clock
 */
 PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADCDAC;
 PeriphClkInit.AdcDacClockSelection = RCC_ADCDACCLKSOURCE_HSI;
 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
 {
 Error_Handler();
 }

 /* ADC1 clock enable */
 HAL_RCC_ADC12_CLK_ENABLED++;
 if(HAL_RCC_ADC12_CLK_ENABLED==1){
 __HAL_RCC_ADC12_CLK_ENABLE();
 }

 __HAL_RCC_GPIOC_CLK_ENABLE();
 __HAL_RCC_GPIOA_CLK_ENABLE();
 /**ADC1 GPIO Configuration
 PC0 ------> ADC1_IN1
 PC1 ------> ADC1_IN2
 PC2 ------> ADC1_IN3
 PC3 ------> ADC1_IN4
 PA0 ------> ADC1_IN5
 */
 GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

 GPIO_InitStruct.Pin = GPIO_PIN_0;
 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 /* ADC1 DMA Init */
 /* GPDMA1_REQUEST_ADC1 Init */
 handle_GPDMA1_Channel3.Instance = GPDMA1_Channel3;
 handle_GPDMA1_Channel3.Init.Request = GPDMA1_REQUEST_ADC1;
 handle_GPDMA1_Channel3.Init.BlkHWRequest = DMA_BREQ_SINGLE_BURST;
 handle_GPDMA1_Channel3.Init.Direction = DMA_PERIPH_TO_MEMORY;
 handle_GPDMA1_Channel3.Init.SrcInc = DMA_SINC_FIXED;
 handle_GPDMA1_Channel3.Init.DestInc = DMA_DINC_INCREMENTED;
 handle_GPDMA1_Channel3.Init.SrcDataWidth = DMA_SRC_DATAWIDTH_WORD;
 handle_GPDMA1_Channel3.Init.DestDataWidth = DMA_DEST_DATAWIDTH_HALFWORD;
 handle_GPDMA1_Channel3.Init.Priority = DMA_LOW_PRIORITY_LOW_WEIGHT;
 handle_GPDMA1_Channel3.Init.SrcBurstLength = 1;
 handle_GPDMA1_Channel3.Init.DestBurstLength = 1;
 handle_GPDMA1_Channel3.Init.TransferAllocatedPort = DMA_SRC_ALLOCATED_PORT0|DMA_DEST_ALLOCATED_PORT1;
 handle_GPDMA1_Channel3.Init.TransferEventMode = DMA_TCEM_BLOCK_TRANSFER;
 handle_GPDMA1_Channel3.Init.Mode = DMA_NORMAL;
 if (HAL_DMA_Init(&handle_GPDMA1_Channel3) != HAL_OK)
 {
 Error_Handler();
 }

 __HAL_LINKDMA(adcHandle, DMA_Handle, handle_GPDMA1_Channel3);

 if (HAL_DMA_ConfigChannelAttributes(&handle_GPDMA1_Channel3, DMA_CHANNEL_NPRIV) != HAL_OK)
 {
 Error_Handler();
 }

 /* USER CODE BEGIN ADC1_MspInit 1 */

 /* USER CODE END ADC1_MspInit 1 */
 }
 else if(adcHandle->Instance==ADC2)
 {
 /* USER CODE BEGIN ADC2_MspInit 0 */

 /* USER CODE END ADC2_MspInit 0 */

 /* ADC2 clock enable */
 HAL_RCC_ADC12_CLK_ENABLED++;
 if(HAL_RCC_ADC12_CLK_ENABLED==1){
 __HAL_RCC_ADC12_CLK_ENABLE();
 }

 __HAL_RCC_GPIOA_CLK_ENABLE();
 __HAL_RCC_GPIOB_CLK_ENABLE();
 /**ADC2 GPIO Configuration
 PA1 ------> ADC2_IN6
 PA2 ------> ADC2_IN7
 PA3 ------> ADC2_IN8
 PA4 ------> ADC2_IN9
 PA5 ------> ADC2_IN10
 PA6 ------> ADC2_IN11
 PA7 ------> ADC2_IN12
 PB0 ------> ADC2_IN15
 */
 GPIO_InitStruct.Pin = ADC2_Therm1_Pin|ADC2_Therm2_Pin|ADC2_Therm3_Pin|ADC2_Therm4_Pin
 |ADC2_Therm5_Pin|ADC2_Therm6_Pin|ADC2_Therm7_Pin;
 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 GPIO_InitStruct.Pin = ADC2_Therm8_Pin;
 GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
 GPIO_InitStruct.Pull = GPIO_NOPULL;
 HAL_GPIO_Init(ADC2_Therm8_GPIO_Port, &GPIO_InitStruct);

 /* ADC2 DMA Init */
 /* GPDMA1_REQUEST_ADC2 Init */
 handle_GPDMA1_Channel4.Instance = GPDMA1_Channel4;
 handle_GPDMA1_Channel4.Init.Request = GPDMA1_REQUEST_ADC2;
 handle_GPDMA1_Channel4.Init.BlkHWRequest = DMA_BREQ_SINGLE_BURST;
 handle_GPDMA1_Channel4.Init.Direction = DMA_PERIPH_TO_MEMORY;
 handle_GPDMA1_Channel4.Init.SrcInc = DMA_SINC_FIXED;
 handle_GPDMA1_Channel4.Init.DestInc = DMA_DINC_INCREMENTED;
 handle_GPDMA1_Channel4.Init.SrcDataWidth = DMA_SRC_DATAWIDTH_WORD;
 handle_GPDMA1_Channel4.Init.DestDataWidth = DMA_DEST_DATAWIDTH_HALFWORD;
 handle_GPDMA1_Channel4.Init.Priority = DMA_LOW_PRIORITY_LOW_WEIGHT;
 handle_GPDMA1_Channel4.Init.SrcBurstLength = 1;
 handle_GPDMA1_Channel4.Init.DestBurstLength = 1;
 handle_GPDMA1_Channel4.Init.TransferAllocatedPort = DMA_SRC_ALLOCATED_PORT0|DMA_DEST_ALLOCATED_PORT1;
 handle_GPDMA1_Channel4.Init.TransferEventMode = DMA_TCEM_BLOCK_TRANSFER;
 handle_GPDMA1_Channel4.Init.Mode = DMA_NORMAL;
 if (HAL_DMA_Init(&handle_GPDMA1_Channel4) != HAL_OK)
 {
 Error_Handler();
 }

 __HAL_LINKDMA(adcHandle, DMA_Handle, handle_GPDMA1_Channel4);

 if (HAL_DMA_ConfigChannelAttributes(&handle_GPDMA1_Channel4, DMA_CHANNEL_NPRIV) != HAL_OK)
 {
 Error_Handler();
 }

 /* USER CODE BEGIN ADC2_MspInit 1 */

 /* USER CODE END ADC2_MspInit 1 */
 }
}

 This code is generated using CubeMx 6.16.0 for STM32U5A5.

I'm alsu using GPDMA for both ADCs.

 As you can see ,there is NO generation of 

 PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADCDAC;
 PeriphClkInit.AdcDacClockSelection = RCC_ADCDACCLKSOURCE_HSI;
 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
 {
 Error_Handler();
 }

for ADC2

Ghofrane GSOURI
Technical Moderator
December 16, 2025

Hello @b3pr0 

Thank you for your valuable contribution.

After configuring the GPDMA for both ADCs and reviewing the generated code, I confirm that this code segment is missing for ADC2

 PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADCDAC;
 PeriphClkInit.AdcDacClockSelection = RCC_ADCDACCLKSOURCE_HSI;
 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
 {
 Error_Handler();
 }

A ticket 223920  has been escalated to dev team for resolution .

I will keep you posted with updates.

THX

Ghofrane

To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.