cancel
Showing results for 
Search instead for 
Did you mean: 

External loader fails to download

nikof
Associate II

Hi all,

I'm trying to put some TouchGFX data (images, text, ...) in an external flash (S25FL128L) on a custom board with STM32H7B0VB mcu. I'm using the octo-spi peripheral as quad-spi.

So, I follow the guide to make an external loader and I did it. It seems to work properly: if I load the .stdlr file in the STM32CubeProgrammer I can read, write, erase sector and mass erase the external flash.

Also, if I try to debug (STM32CubeIDE) a project using the loader without putting elements into external flash all works and I can see all the memories.

The ploblem occur whe I try to put somenthing inside the external flash. I do that in the linker script with TouchGFX sections: IntFlashSection and TextFlashSection. See the script below:

/* Entry Point */
ENTRY(Reset_Handler)
 
/* Highest address of the user mode stack */
_estack = 0x20020000;    /* end of RAM */
/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0x200 ;      /* required amount of heap  */
_Min_Stack_Size = 0x400 ; /* required amount of stack */
 
/* Specify the memory areas */
MEMORY
{
  FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 2048K
  RAM   (xrw)     : ORIGIN = 0x20000000, LENGTH = 128K
  AXI_SRAM (xrw)  : ORIGIN = 0x24000000, LENGTH = 1024K
  AHB_SRAM (xrw)  : ORIGIN = 0x30000000, LENGTH = 128K
  OCTOSPI (r)	  : ORIGIN = 0x90000000, LENGTH = 16M
}
 
/* 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 */
    *(.RamFunc)        /* .RamFunc sections */
    *(.RamFunc*)       /* .RamFunc* sections */
 
    . = ALIGN(4);
    _edata = .;        /* define a global symbol at data end */
  } >RAM AT> FLASH
 
  /* 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;
  } >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);
  } >RAM
 
  /* Remove information from the standard libraries */
  /DISCARD/ :
  {
    libc.a ( * )
    libm.a ( * )
    libgcc.a ( * )
  }
 
  .ARM.attributes 0 : { *(.ARM.attributes) }
 
    IntFlashSection :
  	{
  		*(IntFlashSection IntFlashSection.*)
  		*(.gnu.linkonce.r.*)
  		. = ALIGN(0x4);
  	} >OCTOSPI
 
    TextFlashSection :
  	{
  		*(TextFlashSection TextFlashSection.*)
  		*(.gnu.linkonce.r.*)
  		. = ALIGN(0x4);
  	} >OCTOSPI
 
}

The output of the console when I try to Debug or Run with this linker script is:

STMicroelectronics ST-LINK GDB server. Version 6.1.0
Copyright (c) 2022, STMicroelectronics. All rights reserved.
 
Starting server with the following options:
        Persistent Mode            : Disabled
        Logging Level              : 1
        Listen Port Number         : 61234
        Status Refresh Delay       : 15s
        Verbose Mode               : Disabled
        SWD Debug                  : Enabled
        InitWhile                  : Enabled
 
Waiting for debugger connection...
Debugger connected
Waiting for debugger connection...
Debugger connected
Waiting for debugger connection...
      -------------------------------------------------------------------
                       STM32CubeProgrammer v2.10.0                  
      -------------------------------------------------------------------
 
 
 
Log output file:   c:\users\niko~1.fio\appdata\local\temp\stm32cubeprogrammer_a14888.log
ST-LINK SN  : 34FF74065250343847111043
ST-LINK FW  : V2J39S7
Board       : --
Voltage     : 3.23V
SWD freq    : 4000 KHz
Connect mode: Under Reset
Reset mode  : Hardware reset
Device ID   : 0x480
Revision ID : Rev Z
Device name : STM32H7A/B
Flash size  : 128 KBytes
Device type : MCU
Device CPU  : Cortex-M7
BL Version  : 0x90
 
 
 
Memory Programming ...
Opening and parsing file: st-link_gdb_server_a14888.srec
  File          : st-link_gdb_server_a14888.srec
  Size          : 694.94 KB 
  Address       : 0x08000000 
 
 
Erasing memory corresponding to segment 0:
Erasing internal memory sectors [0 32]
Erasing memory corresponding to segment 1:
Erasing external memory sectors [0 108]
Download in Progress:
 
 
Error: failed to download Segment[0]
Error: failed to download the File
Shutting down...
Exit.

1 ACCEPTED SOLUTION

Accepted Solutions
N. SANTINI
ST Employee

Hi,

There is a known issue with custom external loader and recent versions of CubeProgrammer (both standalone and CubeIDE embedded versions).

The issue is being investigated but there is a workaround that I suggest you to try since the error you get may be linked to this issue.

You need to replace the internal flash loader that comes with CubeProgrammer with the one from version 2.6.0.

  1. Download and install CubeProgrammer version 2.6.0
  2. The internal loaders are located in : C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin\FlashLoader
  3. The one corresponding to your board is displayed in the CubeProgrammer GUI when connecting to the board
  4. Copy/paste the relevant .stldr from the 2.6.0 to the version you use.

For the STM32H7A the internal flash loader is the 0x480.stldr, I attached it to this post so that you can quickly test if it solves your issue.

Just unzip the file in the internal loader folder of your CubeProgrammer installation folder :

CubeProgrammer standalone version :

C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin\FlashLoader

CubeProgrammer CubeIDE (v.1.9) embedded version : C:\ST\STM32CubeIDE_1.9.0\STM32CubeIDE\plugins\com.st.stm32cube.ide.mcu.externaltools.cubeprogrammer.win32_2.0.200.202202231230\tools\bin\FlashLoader

I hope this will help, an FAQ is being created accordingly until a proper fix is implemented,

Best regards,

Nicolas

View solution in original post

21 REPLIES 21
N. SANTINI
ST Employee

Hi,

There is a known issue with custom external loader and recent versions of CubeProgrammer (both standalone and CubeIDE embedded versions).

The issue is being investigated but there is a workaround that I suggest you to try since the error you get may be linked to this issue.

You need to replace the internal flash loader that comes with CubeProgrammer with the one from version 2.6.0.

  1. Download and install CubeProgrammer version 2.6.0
  2. The internal loaders are located in : C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin\FlashLoader
  3. The one corresponding to your board is displayed in the CubeProgrammer GUI when connecting to the board
  4. Copy/paste the relevant .stldr from the 2.6.0 to the version you use.

For the STM32H7A the internal flash loader is the 0x480.stldr, I attached it to this post so that you can quickly test if it solves your issue.

Just unzip the file in the internal loader folder of your CubeProgrammer installation folder :

CubeProgrammer standalone version :

C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin\FlashLoader

CubeProgrammer CubeIDE (v.1.9) embedded version : C:\ST\STM32CubeIDE_1.9.0\STM32CubeIDE\plugins\com.st.stm32cube.ide.mcu.externaltools.cubeprogrammer.win32_2.0.200.202202231230\tools\bin\FlashLoader

I hope this will help, an FAQ is being created accordingly until a proper fix is implemented,

Best regards,

Nicolas

Dupe thread was here https://community.st.com/s/question/0D53W00001eadPISAY/external-loader-fails-to-download

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

hi,

I have same problem with stm32cubeide 1.10.1 ,is it still a big?? does way that N. SANTINI said work?

Best Regard

Would depend if you have the *same* problem or a different one​..

O​utline your situation. What board and part are you using?

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

I'm using my custom boad with stm32h743iit6 and I'm trying to put TouchGFX data in an external flash (w25q128).

I'm using the quad-spi.

So, I make an external loader and It seems to work properly.

if I load the .stdlr file in the STM32CubeProgrammer I can read, write, erase sector and mass erase the external flash.

The problem occur when I try to debug (STM32CubeIDE) my touch gfx project and put the element such font and text to the external flash...

------------------------------

-------------------------------------------------------------------

STM32CubeProgrammer v2.11.0

-------------------------------------------------------------------

Log output file: C:\Users\ELECTR~1\AppData\Local\Temp\STM32CubeProgrammer_a06572.log

ST-LINK SN : 292C05026115303030303032

ST-LINK FW : V2J40S7

Board : --

Voltage : 3.19V

SWD freq : 4000 KHz

Connect mode: Under Reset

Reset mode : Hardware reset

Device ID : 0x450

Revision ID : Rev V

Device name : STM32H7xx

Flash size : 2 MBytes

Device type : MCU

Device CPU : Cortex-M7

BL Version : 0x90

Memory Programming ...

Opening and parsing file: ST-LINK_GDB_server_a06572.srec

File : ST-LINK_GDB_server_a06572.srec

Size : 309.68 KB

Address : 0x08000000

Erasing memory corresponding to segment 0:

Erasing internal memory sectors [0 1]

Erasing memory corresponding to segment 1:

Erasing external memory sectors [0 43]

Download in Progress:

Error: failed to download Segment[0]Error: failed to download the File

Have you tried using the 0x450.stldr from STM32 Cube Programmer 2.6.0 in the manner suggested by @N. SANTINI​ ?

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

I solved it. Thanks, before this I was using 0x480 which didn't work. but now i have another problem when i use external flash touch gfx for widgets make wrong color like blue button-> green button but... (with internal flash everything is fine) do you have any idea?

Ehsan
Associate II

I encountered a similar issue. Trying the program STM32H750B-DK discovery board using STM32CubeProgrammer in Ubuntu. here is the log:

 08:47:43 : STM32CubeProgrammer API v2.11.0 | Linux-64Bits 

 08:47:45 : ST-LINK SN : 0036004A3137511133333639

 08:47:45 : ST-LINK FW : V3J10M3

 08:47:45 : Board    : STM32H750B-DK

 08:47:45 : Voltage   : 3,28V

 08:47:45 : SWD freq  : 24000 KHz

 08:47:45 : Connect mode: Normal

 08:47:45 : Reset mode : Software reset

 08:47:45 : Device ID  : 0x450

 08:47:45 : Revision ID : Rev V

 08:47:45 : Debug in Low Power mode is not supported for this device.

 08:47:46 : UPLOADING OPTION BYTES DATA ...

 08:47:46 :  Bank     : 0x00

 08:47:46 :  Address    : 0x5200201c

 08:47:46 :  Size     : 308 Bytes

 08:47:46 : UPLOADING ...

 08:47:46 :  Size     : 1024 Bytes

 08:47:46 :  Address    : 0x8000000

 08:47:46 : Read progress:

 08:47:46 : Data read successfully

 08:47:46 : Time elapsed during the read operation is: 00:00:00.002

 08:47:53 : Memory Programming ...

 08:47:53 : Opening and parsing file: GPIO_IOToggle.hex

 08:47:53 :  File     : GPIO_IOToggle.hex

 08:47:53 :  Size     : 4,56 KB 

 08:47:53 :  Address    : 0x90000000 

 08:47:53 : Erasing memory corresponding to segment 0:

 08:47:53 : Download in Progress:

 08:47:53 : Error: failed to download Segment[0]

 08:47:53 : Error: failed to download the File

 08:53:41 : Disconnected from device.

Ok, and did you try the method suggested in the thread to remediate it? Did that succeed?

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