cancel
Showing results for 
Search instead for 
Did you mean: 

I am working with a custom board: I have a Touchgfx project that seems to work fine with my custom loader, but if I place text in the external flash it will hard fault. Please note that when I place images/Icons it works fine.

cleonb322
Associate III
 
15 REPLIES 15
cleonb322
Associate III

0693W00000VOSL4QAP.png

cleonb322
Associate III

when I un-comment the following lines in the linker that is when it crashes:

/* Un-comment this section to place fonts and text in external flash */

 FontFlashSection :

{

*(FontFlashSection FontFlashSection.*)

*(.gnu.linkonce.r.*)

    . = ALIGN(0x4);

} >QUADSPI

 TextFlashSection :

{

*(TextFlashSection TextFlashSection.*)

*(.gnu.linkonce.r.*)

    . = ALIGN(0x4);

} >QUADSPI

SKacp.1
Senior II

Hi,

What You have messages from linker? Please show the whole linker file.

cleonb322
Associate III

/**

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

 * @file   LinkerScript.ld

 * @author  Auto-generated by STM32CubeIDE

 * @brief   Linker script for STM32F767BITx Device from STM32F7 series

 *           2048Kbytes FLASH

 *           512Kbytes RAM

 *

 *      Set heap size, stack size and stack location according

 *      to application requirements.

 *

 *      Set memory bank area and size if external memory is used

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

 * @attention

 *

 * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.

 * All rights reserved.</center></h2>

 *

 * 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 = ORIGIN(RAM) + LENGTH(RAM); /* end of "RAM" Ram type memory */

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

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

/* Memories definition */

MEMORY

{

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

 FLASH  (rx)   : ORIGIN = 0x8000000,  LENGTH = 2048K

 QUADSPI (r)   : ORIGIN = 0x90000000, LENGTH = 8M

}

/* Sections */

SECTIONS

{

 /* The startup code into "FLASH" Rom type memory */

 .isr_vector :

 {

  . = ALIGN(4);

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

  . = ALIGN(4);

 } >FLASH

 /* The program code and other data into "FLASH" Rom 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" Rom type memory */

 .rodata :

 {

  . = ALIGN(4);

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

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

  . = ALIGN(4);

 } >FLASH

 .ARM.extab  : {

  . = ALIGN(4);

  *(.ARM.extab* .gnu.linkonce.armextab.*)

  . = ALIGN(4);

 } >FLASH

 .ARM : {

  . = ALIGN(4);

  __exidx_start = .;

  *(.ARM.exidx*)

  __exidx_end = .;

  . = ALIGN(4);

 } >FLASH

 .preinit_array   :

 {

  . = ALIGN(4);

  PROVIDE_HIDDEN (__preinit_array_start = .);

  KEEP (*(.preinit_array*))

  PROVIDE_HIDDEN (__preinit_array_end = .);

  . = ALIGN(4);

 } >FLASH

 .init_array :

 {

  . = ALIGN(4);

  PROVIDE_HIDDEN (__init_array_start = .);

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

  KEEP (*(.init_array*))

  PROVIDE_HIDDEN (__init_array_end = .);

  . = ALIGN(4);

 } >FLASH

 .fini_array :

 {

  . = 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

 /* 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);

 } >RAM

 /* Remove information from the compiler libraries */

 /DISCARD/ :

 {

  libc.a ( * )

  libm.a ( * )

  libgcc.a ( * )

 }

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

  

  

ExtFlashSection :

{

*(ExtFlashSection ExtFlashSection.*)

*(.gnu.linkonce.r.*)

    . = ALIGN(0x4);

} >QUADSPI

/* Un-comment this section to place fonts and text in external flash 

  FontFlashSection :

{

*(FontFlashSection FontFlashSection.*)

*(.gnu.linkonce.r.*)

    . = ALIGN(0x4);

} >QUADSPI

  TextFlashSection :

{

*(TextFlashSection TextFlashSection.*)

*(.gnu.linkonce.r.*)

    . = ALIGN(0x4);

} >QUADSPI

*/

}

SKacp.1
Senior II

Hi,

Linker file looks good. What You see messages after You run compile?

Do You have properly initialized driver for external memory QUADSPI?

MM..1
Chief II

Why not memory mapped mode ?

it is configured in memory-mapped mode.

/* USER CODE BEGIN QUADSPI_Init 2 */

  CSP_QUADSPI_Init();

  CSP_QSPI_EnableMemoryMappedMode();

  HAL_NVIC_DisableIRQ(QUADSPI_IRQn);

 /* USER CODE END QUADSPI_Init 2 */

it compiles and runs fine. the only problem I am having is placing the TouchGfx text resources in the external memory. The icons/images are also on the external flash. it works with the icons on the external flash, but when I modified the linker to place the texts on the external flash is when I start having the hard fault issue.

Hi,

If You have hardfault when start then problem is with reading external memory.

When You start debugging after initialization QUADSPI do You see contents memory? (see picture from my project).0693W00000VOW5AQAX.jpg