Skip to main content
nikof
Associate II
June 20, 2022
Solved

External loader fails to download

  • June 20, 2022
  • 11 replies
  • 12249 views

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.

Best answer by N. SANTINI

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

11 replies

N. SANTINI
N. SANTINIBest answer
ST Employee
July 12, 2022

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

Tesla DeLorean
Guru
July 12, 2022
Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
aasil
Associate
July 16, 2022

hi,

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

Best Regard

Tesla DeLorean
Guru
July 16, 2022

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 VenmoUp vote any posts that you find helpful, it shows what's working..
aasil
Associate
July 16, 2022

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

Ehsan
Associate
July 26, 2022

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.

Tesla DeLorean
Guru
July 26, 2022

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 VenmoUp vote any posts that you find helpful, it shows what's working..
Ehsan
Associate
July 27, 2022

I installed CubeProgrammer version 2.6.0, same error.

N. SANTINI
ST Employee
July 27, 2022

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

Ehsan
Associate
July 27, 2022

Great, thanks!

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

Ehsan
Associate
July 27, 2022

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:

N. SANTINI
ST Employee
July 27, 2022

See my answer in the original thread

Best regards,

Nicolas

JAlca
Associate III
May 26, 2023

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.

Associate II
January 4, 2024

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

Visitor II
March 7, 2024

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?

Tesla DeLorean
Guru
March 7, 2024

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 VenmoUp vote any posts that you find helpful, it shows what's working..
Visitor II
March 12, 2024

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

Associate II
September 19, 2024

Is this still a problem with CubeProgrammer 2.17? Wanted to get confirmation since I'm facing issues with a custom external loader for the winbond W25Q series flash with the U5F7 MCU. I am able to read external flash and write to it, but the download process seems to fail.

When moving UI elements to external flash, I get the error

Error: failed to download Segment[1]

segment[1] referring to external flash. 

Tesla DeLorean
Guru
September 19, 2024

Assume it's your issue, hard to diagnose anything with this level of detail. The thread here is from 2 years ago.

What else can you glean from the logging output prior to it failing thusly? Try increasing to level 3

You can use whatever hardware you have on your board to help debugging and diagnosis. Say LEDs on the UARTs to provide telemetry and diagnostics from the Loader's perspective.

Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
Associate II
September 21, 2024

Admittedly I've provided a very bad description of the issue I am facing.
I've created an external loader for the W25Q32 flash module

I've tested the read and erase operations using my external loader with cubeprogrammer, they are working as expected.
When I try to program/write a random bin file to external flash using cubeprogrammer, the erase operation succeeds, but download operation fails with the error - 

12:33:21 : Error: failed to download Segment[0]
12:33:21 : Error: failed to download the File


(I misreported in my previous comment, apologies)
When I disconnect from the MCU, reconnect and read external flash, I can see some data has been written to it, but only to the starting few addresses.

Similarly, when I try to fill memory with address set to external flash address(start address 0x90000000), size 0x400000, and data 0x01, the operation fails - upon reading, I can see it has been written upto 0x9000FFF0 with 0x01, everything after that, starting from 0x90010000 only contains 0xFF.

Not sure if its a library issue since I didn't write the library from scratch, I followed a guide on YouTube that provided the library, but I can attach the library files if that would help.

Alternatively, do let me know if I should open a new thread for this instead.

Edit : I have attached a level 3 log for when I try to program the random bin file. Not sure how to interpret it though

Tesla DeLorean
Guru
September 21, 2024

My thought here is that your Write() function doesn't leave the QSPI part in Memory Mapped Mode, which is needed for ST's code to read memory content directly.

Make sure you mask the address passed to the QSPI memory when doing the Page Write's, that it's got the correct 3/4-byte address mode. To debug internally you can output to a board level UARTto get diagnostics/telemetry.

Specify the pins used for you W25Q32. What's the full part# for your STM32 MCU?

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