cancel
Showing results for 
Search instead for 
Did you mean: 

Problem with STM32h755, when expanding the accessed RAM area by Cortex M7 core, the program crashes.....

STork.1
Associate III

Hi every body! I chose STM32H755ZI MCU mainly because it has 1MB of RAM. In my project, I need to at least store 180 KB of Data. 45000 of float samples. I use the M7 Core which accesses the AXI RAM the size of which is 512KB; on the other hand, the Build analyzer shows the amount of RAM around 128KB and in STM32H755ZITX_FLASH.ld file the ram size is defined 128KB.

I decided to expand this area based on the memory file were presented in data sheet of the MCU but the program could not even be started and debugged. I got hard-fault error.

in STM32H755ZITX_FLASH.ld file the default memory setting was like this:

_estack = 0x20020000;  /* end of RAM */                /* _estack = 0x20020000; */

/* Generate a link error if heap and stack don't fit into RAM */

_Min_Heap_Size = 0x200 ;   /* required amount of heap */      /* _Min_Heap_Size = 0x200 */

_Min_Stack_Size = 0x400 ; /* required amount of stack */        /* _Min_Stack_Size = 0x400 */

/* Specify the memory areas */

MEMORY

{

FLASH (rx)   : ORIGIN = 0x08000000, LENGTH = 1024K

RAM (xrw)   : ORIGIN = 0x20000000, LENGTH = 128K            

ITCMRAM (xrw)   : ORIGIN = 0x00000000, LENGTH = 64K

}

I thought that maybe if I change the RAM (xrw)   : ORIGIN = 0x20000000, LENGTH = 128K 

to RAM (xrw)   : ORIGIN = 0x20000000, LENGTH = 256K and also change this line

_estack = 0x20020000; to _estack = 0x20040000; I may be able to expand the accessed RAM area.

Here is also the memory mapped file of my MCU:

0693W00000AMPYgQAP.jpg I would really appreciate if you inform me What is my mistake ?

Thanks in advance.

1 ACCEPTED SOLUTION

Accepted Solutions

0693W00000AMPi2QAH.jpg 

AXIMRAM (xrw)   : ORIGIN = 0x24000000, LENGTH = 512K

SRAM123 (xrw)   : ORIGIN = 0x30000000, LENGTH = 288K    

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..

View solution in original post

5 REPLIES 5

Doesn't it say 0x20020000 thru 0x23FFFFFF is reserved? DTCM being 128 KB

There are other memories which should have their clocks enabled.

; Reset handler
Reset_Handler   PROC
                EXPORT  Reset_Handler                    [WEAK]
                IMPORT  SystemInit
                IMPORT  __main
 
                LDR     R0, =0x580244DC ; Enable D2SRAM clocks in RCC_AHB2ENR
                LDR     R1, [R0]
                ORR     R1, #0xE0000000
                STR     R1, [R0]
 
                LDR     R0, =SystemInit
                BLX     R0
                LDR     R0, =__main
                BX      R0
 
                ENDP ; Reset_Handler

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
STork.1
Associate III

No I did not see such a message... I am pretty confused and have no idea where should I start from to solve this problem .... Maybe that is too much to be asked but could you please tell me more simple that what are the steps should I take to solve this problem ?

what should I do with the reset handler you sent me ?

 I think the problem I have is that I only access 128KB of Ram using M7 Core (based on what I see in Build analyzer and in STM32H755ZITX_FLASH.ld file). when I define global variables (three float arrays each of which has 15000 elements) I get RAM overflow error and when I define them In main ram overflow error disappears but after storing 12450 samples in RAM the program crashes and get the hard fault error. If I find a way so that I understand how can I use other bigger blocks of SRAM the problem will be solved. any idea :)?

0693W00000AMPi2QAH.jpg 

AXIMRAM (xrw)   : ORIGIN = 0x24000000, LENGTH = 512K

SRAM123 (xrw)   : ORIGIN = 0x30000000, LENGTH = 288K    

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
STork.1
Associate III

Thank you Tesla. that was a nice reply! I changed the FLASH.ld file as you explained , which is presented as follows:

/*

******************************************************************************

**

** File    : LinkerScript.ld

**

**

** Abstract  : Linker script for STM32H7 series

**        1024Kbytes FLASH and 192Kbytes 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) 2019 STMicroelectronics.

** All rights reserved.

**

** This software component is licensed by ST under BSD 3-Clause license,

** the "License"; You may not use this file except in compliance with the

** License. You may obtain a copy of the License at:

**            opensource.org/licenses/BSD-3-Clause

**

****************************************************************************

*/

/* Entry Point */

ENTRY(Reset_Handler)

/* Highest address of the user mode stack */

_estack = 0x20020000;  /* end of RAM */                /* _estack = 0x20020000; */

/* Generate a link error if heap and stack don't fit into RAM */

_Min_Heap_Size = 0x200 ;   /* required amount of heap */      /* _Min_Heap_Size = 0x200 */

_Min_Stack_Size = 0x400 ; /* required amount of stack */        /* _Min_Stack_Size = 0x400 */

/* Specify the memory areas */

MEMORY

{

FLASH (rx)   : ORIGIN = 0x08000000, LENGTH = 1024K

AXIMRAM (xrw)  : ORIGIN = 0x24000000, LENGTH = 512K           /* RAM (xrw)   : ORIGIN = 0x20000000, LENGTH = 128K previuous value  */         

ITCMRAM (xrw)   : ORIGIN = 0x00000000, LENGTH = 64K

}

/* Define output sections */

SECTIONS

{

 /* The startup code goes first into FLASH */

 .isr_vector :

 {

  . = ALIGN(4);

  KEEP(*(.isr_vector)) /* Startup code */

  . = ALIGN(4);

 } >FLASH

 /* The program code and other data goes into FLASH */

 .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 goes into FLASH */

 .rodata :

 {

  . = ALIGN(4);

  *(.rodata)     /* .rodata sections (constants, strings, etc.) */

  *(.rodata*)    /* .rodata* sections (constants, strings, etc.) */

  . = ALIGN(4);

 } >FLASH

 .ARM.extab  : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH

 .ARM : {

  __exidx_start = .;

  *(.ARM.exidx*)

  __exidx_end = .;

 } >FLASH

 .preinit_array   :

 {

  PROVIDE_HIDDEN (__preinit_array_start = .);

  KEEP (*(.preinit_array*))

  PROVIDE_HIDDEN (__preinit_array_end = .);

 } >FLASH

 .init_array :

 {

  PROVIDE_HIDDEN (__init_array_start = .);

  KEEP (*(SORT(.init_array.*)))

  KEEP (*(.init_array*))

  PROVIDE_HIDDEN (__init_array_end = .);

 } >FLASH

 .fini_array :

 {

  PROVIDE_HIDDEN (__fini_array_start = .);

  KEEP (*(SORT(.fini_array.*)))

  KEEP (*(.fini_array*))

  PROVIDE_HIDDEN (__fini_array_end = .);

 } >FLASH

 /* used by the startup to initialize data */

 _sidata = LOADADDR(.data);

 /* Initialized data sections goes into RAM, load LMA copy after code */

 .data : 

 {

  . = ALIGN(4);

  _sdata = .;    /* create a global symbol at data start */

  *(.data)      /* .data sections */

  *(.data*)     /* .data* sections */

  . = ALIGN(4);

  _edata = .;    /* define a global symbol at data end */

 } >AXIMRAM AT> FLASH          /* I changes this part !!!!! carefull sina!!!!! it was >RAM  } >RAM */

  

 /* Uninitialized data section */

 . = ALIGN(4);

 .bss :

 {

  /* This is used by the startup in order to initialize the .bss secion */

  _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;

 } >AXIMRAM                     /* I changes this part !!!!! careful sina!!!!! it was >RAM } >RAM */

 /* User_heap_stack section, used to check that there is enough RAM left */

 ._user_heap_stack :

 {

  . = ALIGN(8);

  PROVIDE ( end = . );

  PROVIDE ( _end = . );

  . = . + _Min_Heap_Size;

  . = . + _Min_Stack_Size;

  . = ALIGN(8);

 } >AXIMRAM                    /* I changes this part !!!!! careful sina!!!!! it was >RAM  } >RAM */

  

 /* Remove information from the standard libraries */

 /DISCARD/ :

 {

  libc.a ( * )

  libm.a ( * )

  libgcc.a ( * )

 }

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

}

something that I forgot to take it into consideration was correct calculation of end of the RAM in my case it is : _estack = 0x24080000;  /* end of RAM */  

previously, it was _estack = 0x20020000; this parameter should be changed in FLASH.ld and also RAM.ld file of the MCU. Now, everything works correctly and I could store the whole data into 512KB RAM which can be accessed by M7 core.

Thank you Tesla !