硬汉嵌入式论坛

 找回密码
 立即注册
搜索
查看: 1354|回复: 11
收起左侧

[STM32F7] 利用分散加载文件提前下载大数据文件

[复制链接]

19

主题

59

回帖

116

积分

初级会员

积分
116
发表于 2026-6-24 13:45:58 | 显示全部楼层 |阅读模式
MCU:STM32F750
外置程序Flash:8MB
----------------------------------------------------------------
一个项目,没有sdram,没有sd卡,没有usb,有一个mcu lcd(800x480),需要有一个UI,要想好看一点,必不可少的就是图片,如果把图片做成c文件放在程序里边,下载文件会非常大,下载也非常慢,就想了想,如果能把图片的c文件提前放在qspi flash的固定位置,那么整个程序文件大小就完全能够接受了,问了问屌丝,的确可行,就只修改sct文件,增加一个region,然后图片的c文件数组使用__attribute__指定这个region,同时也需要下载算法支持多region,可是屌丝没有正确给出修改方案,折腾了一会,问了问元宝,总算修改正确。
需要两个工程,一个用于下载大数据,固定在某个位置,如果有多个数组,keil是自动紧接上一个往后排的,第二个工程去固定的位置读取数据,开发者自己知道,从哪儿开始,大小是多少,就能准确找到不同数组的位置和大小了
----------------------------------------------------------------
第一步:(第一个工程)
在keil里设置,使用用户自己的sct文件,其实就是默认生产的sct文件,然后再设置取消默认,这样每次编译后sct文件不会被重置
111.png
----------------------------------------------------------------
第二步:(第一个工程)
如果有使用killkeil.bat的,文本模式打开后,删除货注释:del *.sct /s
----------------------------------------------------------------
第三步:(第一个工程)
修改sct文件
在末尾增加一个region

2.png
; -------------------------------
; Load Region 2: Image Data
; -------------------------------
LR_QSPI_IMG 0x90200000 0x00100000  { ; 2~3MB for image
  ER_QSPI_IMAGES 0x90200000 0x00100000  {
    *.o (.qspi_image_data)
  }
}
----------------------------------------------------------------
第四步:(第一个工程)
将所有图片转换后的数组放在一个c文件中,
3.png

const unsigned char 随便什么名字[数组的大小] __attribute__((used, section(".qspi_image_data"))) =
.qspi_image_data就是sct文件中新region的的名字,记住一定要带"."
----------------------------------------------------------------
第五步:(第一个工程)
将优化等级设置为-o0,因为数组声明了,但没使用,默认的优化等级会优化掉没使用的东西
----------------------------------------------------------------
第六步:(第一个工程)
下载,这个过程比较慢
----------------------------------------------------------------
第七步:(第二个工程)
做一个数组索引,和结构体,来描述在哪里,大小等信息
[C] 纯文本查看 复制代码
typedef enum
{

	image_bg = 0,
	image_ic1,
	image_ic2,
	image_ic3,
	image_ic4,
	image_end,

} ImageType_t;

typedef struct
{

	uint16_t *data;
	uint16_t width;
	uint16_t height;
	uint32_t size;

} IMAGE_INFO;

定义
[C] 纯文本查看 复制代码
IMAGE_INFO image_info[image_end] =
{

	//从2MB位置开始
	[image_bg] =
	{
		.data = (uint16_t *)0x90200000,
		.width = 800,
		.height = 480,
		.size = 800 * 480 * 2,
	},

	[image_ic1] =
	{
		.data = (uint16_t *)0x90200000,
		.width = 48,
		.height = 48,
		.size = 48 * 48 * 3,
	},

	[image_ic2] =
	{
		.data = (uint16_t *)0x90200000,
		.width = 48,
		.height = 48,
		.size = 48 * 48 * 3,
	},

	[image_ic3] =
	{
		.data = (uint16_t *)0x90200000,
		.width = 48,
		.height = 48,
		.size = 48 * 48 * 3,
	},

	[image_ic4] =
	{
		.data = (uint16_t *)0x90200000,
		.width = 48,
		.height = 48,
		.size = 48 * 48 * 3,
	},

};

然后就可以正常的显示图片啦
TFTLCD_DrawPic(0, 0, image_info[image_bg].width, image_info[image_bg].height, image_info[image_bg].data);
IMG_8443.jpeg





回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
124427
QQ
发表于 2026-6-24 15:29:19 | 显示全部楼层
这种简单得分散加载使用attribute 指定到外部SPI Flash太麻烦了。

这种得完全不需要自定义分散加载,此贴得设置方案更简单,MDK右击这种就行了,这个得本质也是设置分散加载,只是不需要人为去定义了

爽,一种非常给力的STM32H7内部Flash和QSPI Flash混合运行程序的方式,不再需要用户单独制作BOOT和APP
https://forum.anfulai.cn/forum.p ... 1011&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

19

主题

59

回帖

116

积分

初级会员

积分
116
 楼主| 发表于 2026-6-24 16:01:59 | 显示全部楼层
eric2013 发表于 2026-6-24 15:29
这种简单得分散加载使用attribute 指定到外部SPI Flash太麻烦了。

这种得完全不需要自定义分散加载,此 ...

谢谢,我学习学习
回复

使用道具 举报

19

主题

59

回帖

116

积分

初级会员

积分
116
 楼主| 发表于 2026-6-29 11:16:23 | 显示全部楼层
eric2013 发表于 2026-6-24 15:29
这种简单得分散加载使用attribute 指定到外部SPI Flash太麻烦了。

这种得完全不需要自定义分散加载,此 ...

你好,我大致看了下混合运行的方案,如果我有一个1MB的大数组在程序里,是否意味着我每次下载程序都要重复下载这个大数组
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
124427
QQ
发表于 2026-7-1 10:13:10 | 显示全部楼层
jasonZJR 发表于 2026-6-29 11:16
你好,我大致看了下混合运行的方案,如果我有一个1MB的大数组在程序里,是否意味着我每次下载程序都要重 ...

不用,如果仅需下载一次,可以MDK option里面将外部算法文件删掉外部Flash的算法文件即可。,

这样外部的就不下载了。
回复

使用道具 举报

19

主题

59

回帖

116

积分

初级会员

积分
116
 楼主| 发表于 2026-7-1 14:59:24 | 显示全部楼层
eric2013 发表于 2026-7-1 10:13
不用,如果仅需下载一次,可以MDK option里面将外部算法文件删掉外部Flash的算法文件即可。,

这样外 ...

我帖子的意思是,先用A工程下载大数据,再用B工程下载正常的程序,两个工程都是下载到外部flash。如果用混合方案,好像无法做到
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
124427
QQ
发表于 2026-7-2 11:21:40 | 显示全部楼层
jasonZJR 发表于 2026-7-1 14:59
我帖子的意思是,先用A工程下载大数据,再用B工程下载正常的程序,两个工程都是下载到外部flash。如果用 ...

设置算法大小,一个是整个Flash都可以下载的算法,一个是前面部分用于i程序调试的。
回复

使用道具 举报

19

主题

59

回帖

116

积分

初级会员

积分
116
 楼主| 发表于 2026-7-2 14:07:03 | 显示全部楼层
eric2013 发表于 2026-7-2 11:21
设置算法大小,一个是整个Flash都可以下载的算法,一个是前面部分用于i程序调试的。

这样就需要两个下载算法了是吗,感觉还麻烦了。两个算法,用的时候还需要选择下对应的算法,这种方式我还有个疑问,算法设置好了,我如何只下载大数据部分到指定位置呢
回复

使用道具 举报

9

主题

174

回帖

201

积分

高级会员

积分
201
发表于 2026-7-2 14:15:18 | 显示全部楼层
多个下载算法可以同时加载也可以只加载一个。
回复

使用道具 举报

9

主题

174

回帖

201

积分

高级会员

积分
201
发表于 2026-7-2 14:15:27 | 显示全部楼层
多个下载算法可以同时加载也可以只加载一个。
回复

使用道具 举报

19

主题

59

回帖

116

积分

初级会员

积分
116
 楼主| 发表于 2026-7-2 15:23:34 | 显示全部楼层
tcs_stm32 发表于 2026-7-2 14:15
多个下载算法可以同时加载也可以只加载一个。

谢谢回复。我还有个疑问,两个外部下载算法,如何指定程序里边哪些部分使用A算法,哪些部分使用B算法呢
回复

使用道具 举报

9

主题

174

回帖

201

积分

高级会员

积分
201
发表于 2026-7-25 22:59:42 | 显示全部楼层
jasonZJR 发表于 2026-7-2 15:23
谢谢回复。我还有个疑问,两个外部下载算法,如何指定程序里边哪些部分使用A算法,哪些部分使用B算法呢

下载算法有地址范围
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-10-24 11:02 , Processed in 0.478338 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表