2022-06-19 11:53 PM
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.
Solved! Go to Solution.
2022-07-27 12:08 AM
I installed CubeProgrammer version 2.6.0, same error.
2022-07-27 12:27 AM
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 ?
Best regards,
Nicolas
2022-07-27 12:32 AM
Great, thanks!
I am new to this tool and did not choose external loader. It works now.
2022-07-27 12:41 AM
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:
2022-07-27 01:40 AM
2023-05-26 12:49 AM
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.
2024-01-04 03:18 AM
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
2024-03-07 03:05 AM - edited 2024-03-11 10:45 PM
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.
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?
2024-03-07 03:31 AM
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.
2024-03-11 08:02 PM
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