STM32H745 ADC3 DMA Circular Scan Mode: Only First 3 Channels Wrong Read, Last 3 Stuck at Zero
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:
- Is there a known issue with ADC3 scan mode DMA on LDO-powered H745 boards?
- Should ADC3 require explicit D3 domain initialization beyond what CubeMX generates?
- Does the EOCSelection setting affect how DMA requests are issued for each rank?