2022-01-28 08:28 AM
I would to use the cheap STM32F750N8-DISCO evaluation board to run a ETH/I2C/SPI/IR/encoder/touch-screen application but the 64K of flash is very little for my program.
Now my program run a STM32F746G-DISCO with 1Mbit of flash and it use about 450K.
I use also the QSPI N25Q128A to store the static images.
Is possible boot the program from QSPI or move part of the program in QSPI to save flash space ?
For the images I use this following method.
#include <stdint.h>
#pragma pack(push, 1)
typedef struct Center2_tagBITMAPFILEHEADER {
uint16_t bfType;
uint32_t bfSize;
uint16_t bfReserved1;
uint16_t bfReserved2;
uint32_t bfOffBits;
} Center2_BITMAPFILEHEADER; // size is 14 bytes
typedef struct Center2_tagBITMAPINFOHEADER {
uint32_t biSize;
uint32_t biWidth;
uint32_t biHeight;
uint16_t biPlanes;
uint16_t biBitCount;
uint32_t biCompression;
uint32_t biSizeImage;
uint32_t biXPelsPerMeter;
uint32_t biYPelsPerMeter;
uint32_t biClrUsed;
uint32_t biClrImportant;
} Center2_BITMAPINFOHEADER; // size is 40 bytes
typedef struct Center2_tag_Struct {
// offset 0, size 14
Center2_BITMAPFILEHEADER fileHeader;
// offset 14, size 40
Center2_BITMAPINFOHEADER infoHeader;
// offset 54, size 129600 words
uint16_t data[129600];
} Center2_Struct;
#ifndef IMG_NO_DATA
#if defined ( __ICCARM__ )
#pragma location = ".textqspi"
#else
__attribute__((section(".textqspi")))
#endif
const Center2_Struct Center2 = {
...
}
#else
extern const Center2_Struct Center2;
#endif
#pragma pack (pop)
Solved! Go to Solution.
2022-01-28 02:30 PM
I don't work for any of the involved parties, and it's more than a 5 minute task.
Set your linker script or scatter file to pull all the Read-Only code and data in the QSPI address space, ie 0x90000000 +32MB, or whatever.
Find ISP and BSP examples for the control transfer, and memory bring-up, and do hand-off to the stand-alone image in QSPI. Don't reinitialize the clocks, or memory, lest you cut off the legs you're standing on.
STM32Cube_FW_H7_V1.8.0\Projects\STM32H750B-DK\Examples\QSPI\QSPI_MemoryMappedDual
STM32Cube_FW_H7_V1.8.0\Projects\STM32H743I-EVAL\Examples\QSPI\QSPI_ExecuteInPlace
STM32Cube_FW_H7_V1.8.0\Drivers\BSP\STM32H750B-DK\stm32h750b_discovery_qspi.c
STM32Cube_FW_H7_V1.8.0\Projects\STM32H750B-DK\Applications\USB_Host\MSC_Standalone\readme.txt
"In this application, the code is executed from QSPI external memory while data are in internal SRAM memory."
2022-01-28 09:24 AM
The die has 1MByte so I wouldn't worry too much for testing ideas, etc.
No, you can't boot from QSPI as you have to get the clocks, pins and interface aligned to the specifics of the board, and chips involved, but the "boot loader" can be very thin.
I would get the loader tasked with bringing up all the clocks, PLLs memories (QSPI, SDRAM, etc), and then transfer control into an image held in QSPI, and not repeat the bring-up exercise again.
The Vector Table can be relocated via SCB->VTOR, and could be in RAM
2022-01-28 09:33 AM
ok, I cannot boot from QSPI but can I move part of the my program in QSPI to save flash space like I do for the images ?
2022-01-28 09:52 AM
Yes, the design supports execute-in-place
2022-01-28 11:29 AM
Could you show me a sample ?
2022-01-28 02:30 PM
I don't work for any of the involved parties, and it's more than a 5 minute task.
Set your linker script or scatter file to pull all the Read-Only code and data in the QSPI address space, ie 0x90000000 +32MB, or whatever.
Find ISP and BSP examples for the control transfer, and memory bring-up, and do hand-off to the stand-alone image in QSPI. Don't reinitialize the clocks, or memory, lest you cut off the legs you're standing on.
STM32Cube_FW_H7_V1.8.0\Projects\STM32H750B-DK\Examples\QSPI\QSPI_MemoryMappedDual
STM32Cube_FW_H7_V1.8.0\Projects\STM32H743I-EVAL\Examples\QSPI\QSPI_ExecuteInPlace
STM32Cube_FW_H7_V1.8.0\Drivers\BSP\STM32H750B-DK\stm32h750b_discovery_qspi.c
STM32Cube_FW_H7_V1.8.0\Projects\STM32H750B-DK\Applications\USB_Host\MSC_Standalone\readme.txt
"In this application, the code is executed from QSPI external memory while data are in internal SRAM memory."
2022-01-31 12:07 AM
I see that using this modification the function go in QSPI and the flash used is reduced.
Is this correct ?
static void Page1(void);
// void Page1(void);
main()
{
...
Page1();
...
}
static void __attribute__((section(".textqspi"), noinline)) Page1(void)
//void Page1()
{
...
}
In any case I see that it possible pass in the QSPI only some user parts of code because other parts like the graphic lib must run in flash.