Skip to main content
Associate III
January 8, 2026
Solved

NUCLEO-H7S3L8: Unstable readings with Dual ADC + DMA in Continuous Mode

  • January 8, 2026
  • 1 reply
  • 346 views

Hi everyone,

I am working on a project with the NUCLEO-H7S3L8 and trying to read 2 ADCs simultaneously in Continuous Conversion mode using HPDMA.

The Goal:

  • ADC1 & ADC2: Reading 7 channels each (14 channels total).

  • Mode: Continuous Conversion, Circular Mode.

  • Transfer: HPDMA to SRAM (AHB SRAM).

The Problem: I am receiving data, but the values are extremely unstable/fluctuating.

  • When running a smaller example from a ST-Employee, values were stable (around 400).

  • With the full 7-channel scan, the data fluctuates significantly, at a level where data should be wrong.

Can someone take a look at it? They both use the same bootloader. I honestly cant see any issues with my custom config.

Thanks in advance.

Vidar_0-1767869543423.png

Vidar_1-1767869547530.pngVidar_2-1767869550140.png

 



 

This is also my linker if relevant:

/*
******************************************************************************
**
** @file : LinkerScript.ld
**
** @author : STM32CubeIDE
**
** Abstract : Linker script for STM32H7Sxx Device
** 128KBytes FLASH
** 456KBytes RAM
**
** Set heap size, stack size and stack location according
** to application requirements.
**
** Set memory bank area and size if external memory is used
**
** Target : STMicroelectronics STM32
**
** Distribution: The file is distributed as is, without any warranty
** of any kind.
**
******************************************************************************
** @attention
**
** Copyright (c) 2024 STMicroelectronics.
** All rights reserved.
**
** This software is licensed under terms that can be found in the LICENSE file
** in the root directory of this software component.
** If no LICENSE file comes with this software, it is provided AS-IS.
**
******************************************************************************
*/

/* Entry Point */
ENTRY(Reset_Handler)

/* Highest address of the user mode stack */
_estack = ORIGIN(DTCM) + LENGTH(DTCM); /* end of "DTCM" Ram type memory */

_Min_Heap_Size = 0x200; /* required amount of heap */
_Min_Stack_Size = 0x400; /* required amount of stack */

__FLASH_BEGIN = 0x70000000;
__FLASH_SIZE = 0x08000000;


__RAM_BEGIN = 0x24000000;
__RAM_SIZE = 0x6A000;

/* Non-Cacheable Buffer: Increased to 32 KB */
__RAM_NONCACHEABLEBUFFER_SIZE = 0x8000;

/* Memories definition */
MEMORY
{
 RAM (xrw) : ORIGIN = __RAM_BEGIN, LENGTH = __RAM_SIZE
 RAM_NONCACHEABLEBUFFER (xrw) : ORIGIN = __RAM_BEGIN + __RAM_SIZE, LENGTH = __RAM_NONCACHEABLEBUFFER_SIZE

 ITCM (xrw) : ORIGIN = 0x00000000, LENGTH = 0x00010000
 DTCM (rw) : ORIGIN = 0x20000000, LENGTH = 0x00010000
 SRAMAHB (rw) : ORIGIN = 0x30000000, LENGTH = 0x00008000
 BKPSRAM (rw) : ORIGIN = 0x38800000, LENGTH = 0x00001000

 FLASH (xrw) : ORIGIN = __FLASH_BEGIN, LENGTH = __FLASH_SIZE
}

/* Sections */
SECTIONS
{
 /* The startup code into "FLASH" FLASH type memory */
 .isr_vector :
 {
 . = ALIGN(4);
 KEEP(*(.isr_vector)) /* Startup code */
 . = ALIGN(4);
 } >FLASH

 /* The program code and other data into "FLASH" FLASH type memory */
 .text :
 {
 . = ALIGN(4);
 *(.text) /* .text sections (code) */
 *(.text*) /* .text* sections (code) */
 *(.glue_7) /* glue arm to thumb code */
 *(.glue_7t) /* glue thumb to arm code */
 *(.eh_frame)

 KEEP (*(.init))
 KEEP (*(.fini))

 . = ALIGN(4);
 _etext = .; /* define a global symbols at end of code */
 } >FLASH

 /* Constant data into "FLASH" FLASH type memory */
 .rodata :
 {
 . = ALIGN(4);
 *(.rodata) /* .rodata sections (constants, strings, etc.) */
 *(.rodata*) /* .rodata* sections (constants, strings, etc.) */
 . = ALIGN(4);
 } >FLASH

 .ARM.extab (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */
 {
 . = ALIGN(4);
 *(.ARM.extab* .gnu.linkonce.armextab.*)
 . = ALIGN(4);
 } >FLASH
 .ARM (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */
 {
 . = ALIGN(4);
 __exidx_start = .;
 *(.ARM.exidx*)
 __exidx_end = .;
 . = ALIGN(4);
 } >FLASH

 .preinit_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */
 {
 . = ALIGN(4);
 PROVIDE_HIDDEN (__preinit_array_start = .);
 KEEP (*(.preinit_array*))
 PROVIDE_HIDDEN (__preinit_array_end = .);
 . = ALIGN(4);
 } >FLASH

 .init_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */
 {
 . = ALIGN(4);
 PROVIDE_HIDDEN (__init_array_start = .);
 KEEP (*(SORT(.init_array.*)))
 KEEP (*(.init_array*))
 PROVIDE_HIDDEN (__init_array_end = .);
 . = ALIGN(4);
 } >FLASH

 .fini_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */
 {
 . = ALIGN(4);
 PROVIDE_HIDDEN (__fini_array_start = .);
 KEEP (*(SORT(.fini_array.*)))
 KEEP (*(.fini_array*))
 PROVIDE_HIDDEN (__fini_array_end = .);
 . = ALIGN(4);
 } >FLASH

 /* Used by the startup to initialize data */
 _sidata = LOADADDR(.data);

 /* Initialized data sections into "RAM" Ram type memory */
 .data :
 {
 . = ALIGN(4);
 _sdata = .; /* create a global symbol at data start */
 *(.data) /* .data sections */
 *(.data*) /* .data* sections */
 *(.RamFunc) /* .RamFunc sections */
 *(.RamFunc*) /* .RamFunc* sections */

 . = ALIGN(4);
 _edata = .; /* define a global symbol at data end */

 } >RAM AT> FLASH

 /* Uninitialized data section into "RAM" Ram type memory */
 . = ALIGN(4);
 .bss :
 {
 /* This is used by the startup in order to initialize the .bss section */
 _sbss = .; /* define a global symbol at bss start */
 __bss_start__ = _sbss;
 *(.bss)
 *(.bss*)
 *(COMMON)

 . = ALIGN(4);
 _ebss = .; /* define a global symbol at bss end */
 __bss_end__ = _ebss;
 } >RAM

 RW_NONCACHEABLE :
 {
 __NONCACHEABLEBUFFER_BEGIN = .;/* create symbol for start of section */
 KEEP(*(noncacheable_buffer))
 __NONCACHEABLEBUFFER_END = .; /* create symbol for start of section */
 } > RAM_NONCACHEABLEBUFFER

 /* User_heap_stack section, used to check that there is enough "RAM" Ram type memory left */
 ._user_heap_stack :
 {
 . = ALIGN(8);
 PROVIDE ( end = . );
 PROVIDE ( _end = . );
 . = . + _Min_Heap_Size;
 . = . + _Min_Stack_Size;
 . = ALIGN(8);
 } >DTCM

 /* Remove information from the compiler libraries */
 /DISCARD/ :
 {
 libc.a ( * )
 libm.a ( * )
 libgcc.a ( * )
 }

 .ARM.attributes 0 : { *(.ARM.attributes) }
}

 

Best answer by Ozone

Perhaps it has escaped your attention that an ADC has a linear electrical component as well.
Nowhere have you described this relevant electrical parameters like input voltages, input impedances, or conversion times.

And I would recommend to read up on multiplexed SAR ADC, to understand how you need to design and configure it.

1 reply

Ozone
OzoneBest answer
Principal
January 8, 2026

Perhaps it has escaped your attention that an ADC has a linear electrical component as well.
Nowhere have you described this relevant electrical parameters like input voltages, input impedances, or conversion times.

And I would recommend to read up on multiplexed SAR ADC, to understand how you need to design and configure it.

Technical Moderator
January 12, 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"