cancel
Showing results for 
Search instead for 
Did you mean: 

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

DRIFTYY777
Associate

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 1
Saket_Om
ST Employee

Hello @DRIFTYY777 

Please refer to the example below:

STM32CubeH7/Projects/NUCLEO-H743ZI/Examples/ADC/ADC_DMA_Transfer at master · STMicroelectronics/STM32CubeH7

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