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.

21 REPLIES 21
Ehsan
Associate II

I installed CubeProgrammer version 2.6.0, same error.

Hi,

The method suggested in this thread only applies to "custom" external loaders, here you are using an ST development kit that has its dedicated external loader already included in STM32CubeProgrammer so it must be another issue.

Have you selected the proper one in the "EL" tab ?

0693W00000QMFPYQA5.pngBest regards,

Nicolas

Great, thanks!

I am new to this tool and did not choose external loader. It works now.

Ehsan
Associate II

How can I configure the debugger in STM32CubeIDE such that the debug works? I can program the board with CubeProgrammer, thanks to your hint, but the debugger in the IDE is not working. The error is:

Error in final launch sequence:

Failed to execute MI command:

See my answer in the original thread

Best regards,

Nicolas

JAlca
Senior

I'm working with a custom board with STM32H7A.

The custom external loader works properly from CLI, but cubeProgrammer fails to erase/flash/read external memory.

But if...

-Open CubeProgrammer.

-Click "Connect"

-After connected, go to "EL" and select your external loader file.

-Click the pencil icon and enter the address for your external Flash (0x90000000)

-Cubeprogrammer will work ok.

Stlinkos
Associate II

Hello, 

I have the same problem.

 

I created my own external flash with w25q128vj and nucleo F746ZG .When i try to load and bin with stm32programmer its work only if the bin file is smaller than 128kb. 

Someone have any idea about this problem :

 

16:51:58 : Start operation achieved successfully
16:55:04 : Memory Programming ...
16:55:04 : Opening and parsing file: Test.bin
16:55:04 : File : Test.bin
16:55:04 : Size : 15.60 MB
16:55:04 : Address : 0x90000000
16:55:04 : Erasing memory corresponding to segment 0:
16:55:04 : Erasing external memory sectors [0 3992]
16:55:57 : Download in Progress:
16:56:31 : Error: failed to download Segment[0]
16:56:31 : Error: failed to download the File
16:56:31 : RUNNING Program ...
16:56:31 : Address: : 0x90000000
16:56:31 : Application is running, Please Hold on...
16:56:31 : Start operation achieved successfully

this what i can see in stm32programmer.

 

Best Regards, 

STlinkos

ZamBurger
Associate II

I have the same issue too. Currently using STM32CubeProgrammer v2.15.

MCU: STM32H750

Flash: IS25LP032

Using custom loader from this github and modifying it to suit the Flash parameters.

GitHub - maudeve-it/W25Qxxx_SPI_FLASH_STM32: A library for STM32 handling the W25Qxxx SPI flash family by Winbond. Library includes functions needed to develop an external loader for projects involving flash.

I am able to erase the whole flash and read flash contents. However I can only write up to 128kB. Anything bigger than 100kB will give the same errors in this thread:

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

 

Any ideas?

Test the code from your own application space and debug it.

Provide a log from STM32 Cube Programmer at verbose level 3.

Instrument your loader to output via an available UART so you can understand what's happening from the STM32 side.

Provide details of changes and pin level connectivity of your design.

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

Hi Tesla,

I am using SPI1 to interface with ISSI Nor Flash

PB5 ------> SPI1_MOSI

PG9 ------> SPI1_MISO

PG11 ------> SPI1_SCK

PG10 ------> SPI1_CS

Below is the log from STM32 Cube programmer:

10:53:47:138 : Memory Programming ...
10:53:47:140 : Opening and parsing file: TOP.bin
10:53:47:140 : File : TOP.bin
10:53:47:140 : Size : 296.42 KB
10:53:47:141 : Address : 0x90000000
10:53:47:141 : Download in Progress:
10:53:47:143 : Size : 303540 Bytes
10:53:47:143 : Address : 0x90000000
10:53:47:143 : Buffer program...
10:53:47:155 : halt ap 0 Status = 0
10:53:47:157 : halt ap 1 Status = 32
10:53:47:158 : halt ap 2 Status = 32
10:53:47:158 : w ap 0 reg 15 PC (0x24000000)
10:53:47:159 : w ap 0 reg 17 MSP (0x24000500)
10:53:47:159 : w ap 0 reg 16 xPSR (0x01000000)
10:53:47:177 : w ap 0 @0x2400D9C0 : 0x00000200 bytes, Data 0x00000000...
10:53:47:178 : w ap 0 @0x24000000 : 0x00000004 bytes, Data 0x0000BE00...
10:53:47:256 : w ap 0 @0x24000004 : 0x0000D58C bytes, Data 0x00000000...
10:53:47:256 : Loader write range...
10:53:47:586 : w ap 0 @0x2400D9C0 : 0x00025000 bytes, Data 0x2D4D3447...
10:53:47:586 : W B1 in RAM @0x2400D9C0 size 0x00025000 : 0330ms
10:53:47:587 : Init flashloader...
10:53:47:587 : halt ap 0
10:53:47:591 : w ap 0 reg 0 R0 0x00000001
10:53:47:593 : w ap 0 reg 1 R1 0x00000000
10:53:47:595 : w ap 0 reg 2 R2 0x00000000
10:53:47:595 : w ap 0 reg 3 R3 0x00000000
10:53:47:595 : w ap 0 reg 4 R4 0x00000000
10:53:47:595 : w ap 0 reg 5 R5 0x00000000
10:53:47:596 : w ap 0 reg 6 R6 0x00000000
10:53:47:596 : w ap 0 reg 7 R7 0x00000000
10:53:47:596 : w ap 0 reg 8 R8 0x00000000
10:53:47:596 : w ap 0 reg 9 R9 0x00000000
10:53:47:596 : w ap 0 reg 10 R10 0x00000000
10:53:47:596 : w ap 0 reg 11 R11 0x00000000
10:53:47:596 : w ap 0 reg 12 R12 0x00000000
10:53:47:597 : w ap 0 reg 13 SP 0x00000000
10:53:47:597 : w ap 0 reg 14 LR 0x24000001
10:53:47:597 : w ap 0 reg 15 PC 0x24000849
10:53:47:598 : w ap 0 reg 16 xPSR 0x01000000
10:53:47:598 : w ap 0 reg 17 MSP 0x2400D98C
10:53:47:598 : w ap 0 reg 18 PSP 0x00000000
10:53:47:598 : run ap 0
10:53:47:615 : halt ap 0
10:53:47:616 : r ap 0 reg 0 R0 0x00000001
10:53:47:618 : w ap 0 reg 0 R0 0x90000000
10:53:47:619 : w ap 0 reg 1 R1 0x00025000
10:53:47:620 : w ap 0 reg 2 R2 0x2400D9C0
10:53:47:620 : w ap 0 reg 3 R3 0x00000002
10:53:47:621 : w ap 0 reg 4 R4 0x00000000
10:53:47:622 : w ap 0 reg 5 R5 0x00000000
10:53:47:623 : w ap 0 reg 6 R6 0x00000000
10:53:47:623 : w ap 0 reg 7 R7 0x00000000
10:53:47:624 : w ap 0 reg 8 R8 0x00000000
10:53:47:624 : w ap 0 reg 9 R9 0x00000000
10:53:47:624 : w ap 0 reg 10 R10 0x00000000
10:53:47:624 : w ap 0 reg 11 R11 0x00000000
10:53:47:624 : w ap 0 reg 12 R12 0x00000000
10:53:47:624 : w ap 0 reg 13 SP 0x00000000
10:53:47:624 : w ap 0 reg 14 LR 0x24000001
10:53:47:624 : w ap 0 reg 15 PC 0x240008AB
10:53:47:625 : w ap 0 reg 16 xPSR 0x01000000
10:53:47:625 : w ap 0 reg 17 MSP 0x2400D98C
10:53:47:625 : w ap 0 reg 18 PSP 0x00000000
10:53:47:625 : run ap 0
10:53:47:926 : w ap 0 @0x240329C0 : 0x000251B4 bytes, Data 0x62B61302...
10:53:47:927 : W B2 in RAM @0x24046BC0 size 0x000251B4: 0340ms
10:54:17:000 : Wait W B1 in Flash @0x90000000 size 0x00025000: 29074ms
10:55:17:000 : Write elapsed time: 89744ms
10:55:17:008 : halt ap 0 Status = 0
10:55:17:008 : halt ap 1 Status = 32
10:55:17:009 : halt ap 2 Status = 32
10:55:17:009 : w ap 0 reg 15 PC (0x24000000)
10:55:17:009 : w ap 0 reg 17 MSP (0x24000500)
10:55:17:009 : w ap 0 reg 16 xPSR (0x01000000)
10:55:17:009 : Loader write range...
10:55:17:339 : w ap 0 @0x2400D9C0 : 0x00025000 bytes, Data 0x2D4D3447...
10:55:17:340 : W B1 in RAM @0x2400D9C0 size 0x00025000 : 0335ms
10:55:17:347 : halt ap 0
10:55:17:347 : r ap 0 reg 0 R0 0x00000001
10:55:17:347 : Wait W B2 in flash @0x00000000 size 0x00000000: 0002ms
10:55:17:348 : Init flashloader...
10:55:17:348 : halt ap 0
10:55:17:350 : w ap 0 reg 0 R0 0x00000001
10:55:17:350 : w ap 0 reg 1 R1 0x00000000
10:55:17:350 : w ap 0 reg 2 R2 0x00000000
10:55:17:351 : w ap 0 reg 3 R3 0x00000000
10:55:17:351 : w ap 0 reg 4 R4 0x00000000
10:55:17:352 : w ap 0 reg 5 R5 0x00000000
10:55:17:353 : w ap 0 reg 6 R6 0x00000000
10:55:17:354 : w ap 0 reg 7 R7 0x00000000
10:55:17:354 : w ap 0 reg 8 R8 0x00000000
10:55:17:356 : w ap 0 reg 9 R9 0x00000000
10:55:17:360 : w ap 0 reg 10 R10 0x00000000
10:55:17:362 : w ap 0 reg 11 R11 0x00000000
10:55:17:362 : w ap 0 reg 12 R12 0x00000000
10:55:17:363 : w ap 0 reg 13 SP 0x00000000
10:55:17:364 : w ap 0 reg 14 LR 0x24000001
10:55:17:364 : w ap 0 reg 15 PC 0x24000849
10:55:17:367 : w ap 0 reg 16 xPSR 0x01000000
10:55:17:368 : w ap 0 reg 17 MSP 0x2400D98C
10:55:17:370 : w ap 0 reg 18 PSP 0x00000000
10:55:17:370 : run ap 0
10:55:17:388 : halt ap 0
10:55:17:388 : r ap 0 reg 0 R0 0x00000000
10:55:17:388 : Init function fail
10:55:17:388 : r ap 0 reg 16 xPSR 0x21000000
10:55:17:682 : w ap 0 @0x240329C0 : 0x000251B4 bytes, Data 0x62B61302...
10:55:17:682 : W B2 in RAM @0x24046BC0 size 0x000251B4: 0341ms
10:55:17:687 : r ap 0 reg 0 R0 0x00000000
10:55:17:687 : Error: failed to download Segment[0]
10:55:17:688 : Error: failed to download the File