Skip to main content
Associate II
March 27, 2026
Question

STM32G431 ADC2 DMA causes MCU to hang while ADC1 DMA works fine

  • March 27, 2026
  • 3 replies
  • 498 views

Hello everyone,

I am currently working with the STM32G431CBT6 and designing a custom ESC using the DRV8301 gate driver. My application requires a total of 9 ADC channels:

  • ADC1 → 4 channels

  • ADC2 → 5 channels

I configured both ADCs in independent mode with DMA (circular) using STM32CubeMX.

Screenshot_11.png

Issue Description

When I start ADC with DMA using the following function:

void ADC_Start_System(void)
{
 // 1. Calibration
 HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);
 HAL_ADCEx_Calibration_Start(&hadc2, ADC_SINGLE_ENDED);

 HAL_Delay(10);

 // 2. Start ADC1
 if (HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc1_buffer, 4) != HAL_OK)
 Error_Handler();

 // 3. Start ADC2
 if (HAL_ADC_Start_DMA(&hadc2, (uint32_t*)adc2_buffer, 5) != HAL_OK)
 Error_Handler();
}

Observed Behavior

  • ADC1 + DMA works perfectly

  • MCU gets stuck when calling:

HAL_ADC_Start_DMA(&hadc2, (uint32_t*)adc2_buffer, 5);
  • No error returned, but CPU halts inside HAL (likely waiting on a flag)

What I Have Verified

  • Calibration is performed before start

  • DMA is configured in circular mode

  • NVIC interrupts for DMA channels are enabled

  • Separate DMA channels used for ADC1 and ADC2

  • Buffers are correctly sized:

    uint16_t adc1_buffer[4];
    uint16_t adc2_buffer[5];

     

  • Polling mode works fine for ADC2
  • ADC mode is independent (not dual mode)


Additional Notes

  • MCU: STM32G431CBT6

  • Toolchain: STM32CubeMX + HAL

  • Application: ESC (motor control)

  • No external trigger (software start used)

  • Continuous conversion mode enabled


Question

Why does HAL_ADC_Start_DMA() work for ADC1 but cause the MCU to hang for ADC2?

Is there any known limitation or special requirement for using ADC2 with DMA on STM32G4 (especially when ADC1 is already running with DMA)?


Any help or guidance would be greatly appreciated.

Thanks in advance!

3 replies

TDK
Super User
March 27, 2026

The cpu is too busy with the interrupts generated by ADC1 to progress any further in the code.

Reduce the sample rate by increasing the sampling time or having a timer trigger it.

Debug the code and hit pause when it's "stuck" to see where execution is. Likely it's within an interrupt.

"If you feel a post has answered your question, please click ""Accept as Solution""."
mƎALLEm
Technical Moderator
March 27, 2026

Disable ADC1 and let ADC2 working, what happens?

You didn't show the DMA settings of DMA2 in CubeMx. Did you configure it?

screenshot.png

 

 

"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."
Associate II
March 27, 2026

I tested the system using ADC1 only, and it worked perfectly. However, when I disabled ADC1 and enabled ADC2, the program gets stuck.

Previously, I implemented a bare-metal solution where both ADC1 and ADC2 were configured (even running together), and that setup worked without any issues.

Now, using the HAL library, ADC2 is not functioning correctly and causes the system to hang. I’m trying to understand why this issue occurs with HAL, while the same configuration works fine in bare-metal implementation.

mƎALLEm
Technical Moderator
March 27, 2026

@shohanur00 wrote:

when I disabled ADC1 and enabled ADC2, the program gets stuck.

 

 Where it gets stuck? 

"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."
TDK
Super User
March 27, 2026

If it's stuck in the call, good luck getting a breakpoint after the call to be hit.

As suggested before, let it run, hit pause, see where it's at. Probably in an interrupt. Probably because you're converting too quickly. Slow down the sample rate.

"If you feel a post has answered your question, please click ""Accept as Solution""."