Skip to main content
Associate
May 14, 2026
Question

STM32H745 ADC3 DMA Circular Scan Mode: Only First 3 Channels Wrong Read, Last 3 Stuck at Zero

  • May 14, 2026
  • 1 reply
  • 225 views

I am experiencing an issue with ADC3 multi-channel scan mode on a custom STM32H745 board (LDO power supply). The same code works perfectly on the Nucleo-H745ZI reference board (SMPS power supply), but fails on my custom design.

Problem Summary:

  • ADC3 configured for 6-channel continuous scan with DMA circular mode
  • Only channels 1-3 receive invalid data (changing values)
  • Channels 4-6 are stuck at 0 (no change)
  • When using single-channel with interrupt (polling mode), the ADC works fine
  • All GPIO pins are correctly routed; multimeter confirms good analog signals on all 6 input pins

Expected Behavior: All 6 ADC channels should update continuously via DMA circular buffer.

Actual Behavior:

adcValues[0] = 2604660662 // PF6 (IN8) - CHANGING ✓
adcValues[1] = 1343977801 // PF7 (IN3) - CHANGING ✓
adcValues[2] = 4294918112 // PF8 (IN7) - CHANGING ✓
adcValues[3] = 0 // PF9 (IN2) - STUCK ✗
adcValues[4] = 0 // PF10 (IN6) - STUCK ✗
adcValues[5] = 0 // PC0 (IN10) - STUCK ✗

 

HARDWARE CONFIGURATION

MCU: STM32H745ZIT6 (Dual-core, Cortex-M7 + M4) Custom Board Power: Internal LDO (PWR_LDO_SUPPLY) Reference Board: Nucleo-H745ZI (SMPS supply) — works fine

Clock Configuration:

  • External 25 MHz HSE crystal
  • PLL2 configuration: PLLM=5, PLLN=144, PLLP=20 → PLL2P = 36 MHz
  • ADC3 clock source: PLL2P
  • ADC3 clock prescaler: ADC_CLOCK_ASYNC_DIV1 (36 MHz kernel clock)
PF6 → ADC3_INP8 
PF7 → ADC3_INP3 
PF8 → ADC3_INP7 
PF9 → ADC3_INP2 stops here
PF10 → ADC3_INP6 no data
PC0 → ADC3_INP10 no data

ADC3 Power Supply:

  • VDDA: 3.3V ± 5% (verified with multimeter, stable)
  • Decoupling: 100nF + 10µF ceramic caps on VDDA and VREF pins (placed <5mm from MCU)
  • Ground plane: single continuous plane under analog section

 

SOFTWARE CONFIGURATION

CubeMX Generated ADC3 Init:

hadc3.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
hadc3.Init.Resolution = ADC_RESOLUTION_16B;
hadc3.Init.ScanConvMode = ADC_SCAN_ENABLE;
hadc3.Init.EOCSelection = ADC_EOC_SEQ_CONV; // EOC at end of sequence
hadc3.Init.ContinuousConvMode = ENABLE; // continuous mode ON
hadc3.Init.NbrOfConversion = 6;
hadc3.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
hadc3.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
DMA: DMA1 Stream 0
Direction: Peripheral to Memory
Mode: Circular
Data Alignment: Half Word, Half Word
Buffer: volatile uint32_t adcValues[6];
volatile uint32_t adcValues[6];

int main(void) {
 HAL_Init();
 SystemClock_Config();
 MX_GPIO_Init();
 MX_ADC3_Init();
 
 HAL_ADCEx_Calibration_Start(&hadc3, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);
 HAL_ADC_Start_DMA(&hadc3, (uint32_t *)adcValues, 6);
 
 while(1) {
 // read adcValues[0..5]
 HAL_Delay(100);
 }
}

What I need help with:

  1. Is there a known issue with ADC3 scan mode DMA on LDO-powered H745 boards?
  2. Should ADC3 require explicit D3 domain initialization beyond what CubeMX generates?
  3. Does the EOCSelection setting affect how DMA requests are issued for each rank?

1 reply

Technical Moderator
May 14, 2026
"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.Saket_Om"
Associate
May 15, 2026

Want to read Multiple channels on same ADC shown example uses single channel when applying same configurations dosent make it work.