OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 57|回复: 0

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

[复制链接]

24

主题

136

帖子

0

精华

高级会员

Rank: 4

积分
876
金钱
876
注册时间
2014-8-14
在线时间
281 小时
发表于 昨天 13:45 | 显示全部楼层 |阅读模式
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,因为数组声明了,但没使用,默认的优化等级会优化掉没使用的东西
----------------------------------------------------------------
第六步:(第一个工程)
下载,这个过程比较慢
----------------------------------------------------------------
第七步:(第二个工程)
做一个数组索引,和结构体,来描述在哪里,大小等信息
  1. typedef enum
  2. {

  3.         image_bg = 0,
  4.         image_ic1,
  5.         image_ic2,
  6.         image_ic3,
  7.         image_ic4,
  8.         image_end,

  9. } ImageType_t;

  10. typedef struct
  11. {

  12.         uint16_t *data;
  13.         uint16_t width;
  14.         uint16_t height;
  15.         uint32_t size;

  16. } IMAGE_INFO;
复制代码
定义
  1. IMAGE_INFO image_info[image_end] =
  2. {

  3.         //从2MB位置开始
  4.         [image_bg] =
  5.         {
  6.                 .data = (uint16_t *)0x90200000,
  7.                 .width = 800,
  8.                 .height = 480,
  9.                 .size = 800 * 480 * 2,
  10.         },

  11.         [image_ic1] =
  12.         {
  13.                 .data = (uint16_t *)0x90200000,
  14.                 .width = 48,
  15.                 .height = 48,
  16.                 .size = 48 * 48 * 3,
  17.         },

  18.         [image_ic2] =
  19.         {
  20.                 .data = (uint16_t *)0x90200000,
  21.                 .width = 48,
  22.                 .height = 48,
  23.                 .size = 48 * 48 * 3,
  24.         },

  25.         [image_ic3] =
  26.         {
  27.                 .data = (uint16_t *)0x90200000,
  28.                 .width = 48,
  29.                 .height = 48,
  30.                 .size = 48 * 48 * 3,
  31.         },

  32.         [image_ic4] =
  33.         {
  34.                 .data = (uint16_t *)0x90200000,
  35.                 .width = 48,
  36.                 .height = 48,
  37.                 .size = 48 * 48 * 3,
  38.         },

  39. };
复制代码
上边的data地址都是一样的,我们可以不用自己去一个一个算,我们利用固定的起始地址和大小,上电之后计算一次即可
  1. for(uint16_t i = 1; i < image_end; i++)
  2.         {
  3.                 image_info[i].data = image_info[i - 1].data + (image_info[i - 1].size >> 1);
  4.         }
复制代码
然后就可以正常的显示图片啦
TFTLCD_DrawPic(0, 0, image_info[image_bg].width, image_info[image_bg].height, image_info[image_bg].data);
IMG_8443.jpeg
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-6-25 01:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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