你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

IAP更新内部和外部两个Flash遇到的问题

[复制链接]
kokoro 提问时间:2019-9-3 10:21 /
项目中用到外部NorFlash,用来存放图形和字体等内容,内部Flash存储应用程序,更新固件使用的是IAP的方式。其中应用程序存放在内部 0x800 0000开始的地址区域中,图形库存放在外部 0x9000 0000开始的地址空间中。现在遇到个问题,就是使用IAR生成的Bin文件如果遇到地址不连续的情况会产生一个巨大的文件(GB级别)。如何设置IAR生成两个bin文件,一个应用程序的,一个库的,这样我用IAP更新的时候可以灵活更新(更新其中一个或者全部)。有大神知道该怎么做吗?
收藏 评论13 发布时间:2019-9-3 10:21

举报

13个回答
DavidTan 回答时间:2019-9-3 10:44:48
生成bin文件估计是不行的,生成HEX,然后在上位机做一下处理会好一点
疯de_恒 回答时间:2019-9-3 10:46:55
IAR直接生成APP的bin文件就可以了,库文件可以用图形原文件。这样bin文件的大小就正常了。至于需要更新APP还是图片库,由通讯协议定义,发过去的命令要更新app就更新app,接下来IAP收到的数据就更新到APP去,反之亦然。
废鱼 回答时间:2019-9-3 10:58:25
图形库时单独的库吧,烧写文件的时候,选择烧写地址写入图形库即可。我用字库的时候时这样写的。或自己写一个程序吧两个bin文件合成一个文件即可。
kokoro 回答时间:2019-9-3 11:03:14
す疯Ⅱ恒す 发表于 2019-9-3 10:46
IAR直接生成APP的bin文件就可以了,库文件可以用图形原文件。这样bin文件的大小就正常了。至于需要更新APP ...

谢谢回复。我这图片比较多,现在是直接定义成数组到外部Flash中(icf中配置了9000 0000开始的区域,引用时直接使用数组名,外部flash开启了内存映射模式),想的是可以直接生成一个库文件的bin,但是如果用原文件,一个是数量太多了,还有如果直接放在外部Flash中,我程序里如何去引用这些图片呢?
kokoro 回答时间:2019-9-3 11:04:33
tgw860910 发表于 2019-9-3 10:44
生成bin文件估计是不行的,生成HEX,然后在上位机做一下处理会好一点

生成hex得需要有专门的软件去提取分割才行吧...要不没法直接烧写,毕竟有一些附加信息什么的。
kokoro 回答时间:2019-9-3 11:11:08
安 发表于 2019-9-3 10:58
图形库时单独的库吧,烧写文件的时候,选择烧写地址写入图形库即可。我用字库的时候时这样写的。或自己写一 ...

我现在是把所有字体和图形都定义成字节数组的方式到外部存储器(0x9000 0000开始),使用时GUI直接引用数组名,因为外部Flash开启了内存映射,可以直接访问。但是生成bin文件时就很大了。不知怎么处理。
你说的这种方式,如果要引用这些库里的图形或字体该如何引用呢?
DavidTan 回答时间:2019-9-3 11:18:04
kokoromi 发表于 2019-9-3 11:04
生成hex得需要有专门的软件去提取分割才行吧...要不没法直接烧写,毕竟有一些附加信息什么的。 ...

HEX文件解析起来挺简单的,自己做一个解析、转换、分割的小软件应该也很快。
先用IAR生成整个工程的HEX文件,再用自己做的小软件把HEX文件解析出来,并且根据地址分割成两个bin文件

点评

又要自己写小软件...搞单片机的真是苦,啥都得会。  发表于 2019-9-3 11:20
奏奏奏 回答时间:2019-9-3 11:42:28
tgw860910 发表于 2019-9-3 11:18
HEX文件解析起来挺简单的,自己做一个解析、转换、分割的小软件应该也很快。
先用IAR生成整个工程的HEX文 ...

赞成这个解决方案
刚解析过HEX烧录文件

楼主要搞清楚哪些工作是MCU能做,哪些工作是MCU擅长做的。
废鱼 回答时间:2019-9-3 13:45:19
ST的很简单,编译器都是支持生成BIN文件的。同时图形库肯定时固定的。比如1M的FLASH,就建立一个1M的缓冲区按照指定地址写入数据即可。在读取库时,用指着读取就可以了。我用字库都是这么做的。会用c#或者VB写个简单的应用程序,对自己也有好处。方便自己对数据的处理。万事能不求人,坚决不求人。
疯de_恒 回答时间:2019-9-3 13:45:41
kokoromi 发表于 2019-9-3 11:03
谢谢回复。我这图片比较多,现在是直接定义成数组到外部Flash中(icf中配置了9000 0000开始的区域,引用 ...

你可以在图片库的开头放一个引导表啊,不同图片的基地址、大小都能记录起来,你程序里先读这个引导表,然后你在程序里+0x90000000的地址直接读就可以了。
wujique 回答时间:2019-9-3 17:50:40
1 不要搞太复杂了。将你说的库单独放到外边,不要跟程序一起编译。好处很多。
2 数据固定放到外边,程序不会引用? 映射了就直接地址引用,没映射就接口读。
3 文件很多?到底多少?你说现在是做成数组放到程序中了,那你是已经将图片转为数组了?
是一个数组还是多个数组? TXT2BIN或者BIN2txt这两个小工具,可以了解。
4 如果你不会写什么小工具,用uedit也可以很好处理数据啊,列模式了解了解。
kokoro 回答时间:2019-9-4 08:55:37
感谢大家的解答,现在已经放弃直接编译库的方式了,采用小工具把所有图片和字体都整合成一个bin文件,然后在应用程序中直接引用地址的方式。

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版