我会使用便宜的
STM32F750N8-DISCO 评估板来运行 ETH/I2C/SPI/IR/编码器/触摸屏应用程序,但 64K 的闪存对我的程序来说太小了。
现在我的程序运行带有 1Mbit 闪存的 STM32F746G-DISCO,它使用大约 450K。
我还使用 QSPI N25Q128A 来存储静态图像。
是否可以从 QSPI 启动程序或在 QSPI 中移动部分程序以节省闪存空间?
对于图像,我使用以下方法。
- #include
- #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)
我不为任何相关方工作,这是一项超过 5 分钟的任务。
设置您的链接描述文件或分散文件以提取 QSPI 地址空间中的所有只读代码和数据,即 0x90000000 +32MB,或其他。
查找用于控制传输和内存启动的 ISP 和 BSP 示例,并移交到 QSPI 中的独立映像。不要重新初始化时钟或内存,以免切断站立的腿。
STM32Cube_FW_H7_V1.8.0ProjectsSTM32H750B-DKExamplesQSPIQSPI_MemoryMappedDual
STM32Cube_FW_H7_V1.8.0ProjectsSTM32H743I-EVALExamplesQSPIQSPI_ExecuteInPlace
STM32Cube_FW_H7_V1.8.0DriversBSPSTM32H750B-DKstm32h750b_discovery_qspi.c
STM32Cube_FW_H7_V1.8.0ProjectsSTM32H750B-DKApplicationsUSB_HostMSC_Standalonereadme.txt
“在这个应用程序中,代码从 QSPI 外部存储器执行,而数据在内部 SRAM 存储器中。”