Skip to main content
Visitor II
November 14, 2025
Question

LWIP + ADC in baremetal stm32h735

  • November 14, 2025
  • 2 replies
  • 153 views

Hello everyone,
I'm currently working on a project where I need to transmit ADC data over UDP to a server. I've previously had it working, but after re-generating code Hard-faults or Memory faults would start to appear.

CubeIDE : 1.19
Firmware: FW_H7 V1.12.1

 

void MemManage_Handler(void)
{
/* USER CODE BEGIN MemoryManagement_IRQn 0 */
uint32_t *sp = (uint32_t *)__get_MSP();
uint32_t stacked_pc = sp[6];
}

While debugging sp would get the value:
Details:0x240000bc <memp_memory_RX_POOL_base+32>

Also I get a Hardfault:
0x240031bc <memp_memory_RX_POOL_base+12576>

I do cache invalidation on my main code to be able to update the data that will be sent through UDP.

while (1){
 MX_LWIP_Process();
 if (adc_full_ready) {
 adc_full_ready = 0;
 SCB_InvalidateDCache_by_Addr((uint32_t*)adc_data, adc_input_buffer_size * sizeof(uint16_t));
 udpClient_send_adc(adc_data, adc_input_buffer_size);
 } //I also have an if for half data, as the callback of the adc sets the adc_full_ready flag to 1
}


which of course led me to modify the flash registry and define the section of the pool buffer which I didn't in the past (But it was working before)

However it doesn't work and I really don't know what else to debug, especially since I haven't done bigger changes to the code, the length of the sample is of 1024 of uint16 and I declare it like this:


//in my .h

extern volatile uint16_t adc_data[adc_input_buffer_size];

//in my .c

ALIGN_32BYTES(volatile uint16_t adc_data[adc_input_buffer_size]);

 

 

 

.lwip_sec (NOLOAD) : {
. = ABSOLUTE(0x30000000);
*(.RxDecripSection)
. = ABSOLUTE(0x30000100);
*(.TxDecripSection)
/* . = ABSOLUTE(0x30000200);
*(.Rx_PoolSection) */ Now is commented because I was rolling back changes
} >RAM_D2

Also on ethernetif.c

#if defined ( __ICCARM__ ) /*!< IAR Compiler */
#pragma location = 0x30000200
extern u8_t memp_memory_RX_POOL_base[];

#elif defined ( __CC_ARM ) /* MDK ARM Compiler */
__attribute__((section(".Rx_PoolSection"))) extern u8_t memp_memory_RX_POOL_base[];

#elif defined ( __GNUC__ ) /* GNU */
__attribute__((section(".Rx_PoolSection"))) extern u8_t memp_memory_RX_POOL_base[];
#endif


My ethernet configuration:

atilozjb_0-1763138098051.png

My LWIP configuration:

atilozjb_1-1763138147250.png

 


Any leads or comments would be greatly appreciated, as I'm new to the stm32 and to memory management of microcontrollers.

I started this project reading this tutorial:

https://community.st.com/t5/stm32-mcus/how-to-create-a-project-for-stm32h7-with-ethernet-and-lwip-stack/ta-p/49308


Thanks for your help.

    This topic has been closed for replies.

    2 replies

    Super User
    November 14, 2025

    @atilozjb wrote:

     I've previously had it working, but after re-generating code Hard-faults or Memory faults would start to appear


    So what did you change ?

    If you revert to the original code, does that still work ?

    Look carefully at the differences ...

    Super User
    November 14, 2025

    If you're sending data with DMA, you should clean the relevant memory buffer before sending, not invalidate. Regardless, this is not the cause of the issue. It will only potentially cause bad data to be sent out.

    Unless adc_data is not an integer multiple of 32 bytes. Is adc_input_buffer_size a multiple of 16? Better be, or you're clobbering data with that invalidate call.

    I recommend disabling data cache while getting things operational.