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-12 01:55 AM
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.
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
2022-07-12 01:55 AM
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.
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
2022-07-12 10:07 AM
Dupe thread was here https://community.st.com/s/question/0D53W00001eadPISAY/external-loader-fails-to-download
2022-07-16 04:28 AM
hi,
I have same problem with stm32cubeide 1.10.1 ,is it still a big?? does way that N. SANTINI said work?
Best Regard
2022-07-16 04:52 AM
Would depend if you have the *same* problem or a different one..
Outline your situation. What board and part are you using?
2022-07-16 11:10 AM
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
2022-07-16 01:34 PM
Have you tried using the 0x450.stldr from STM32 Cube Programmer 2.6.0 in the manner suggested by @N. SANTINI ?
2022-07-17 09:10 AM
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?
2022-07-26 08:27 AM
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.
2022-07-26 02:27 PM
Ok, and did you try the method suggested in the thread to remediate it? Did that succeed?