硬汉嵌入式论坛

 找回密码
 立即注册
查看: 138|回复: 2
收起左侧

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

[复制链接]

19

主题

54

回帖

111

积分

初级会员

积分
111
发表于 3 天前 | 显示全部楼层 |阅读模式
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

积分
123189
QQ
发表于 3 天前 | 显示全部楼层
这种简单得分散加载使用attribute 指定到外部SPI Flash太麻烦了。

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

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

使用道具 举报

19

主题

54

回帖

111

积分

初级会员

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

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

谢谢,我学习学习
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-27 22:55 , Processed in 1.111349 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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