高级会员

- 积分
- 876
- 金钱
- 876
- 注册时间
- 2014-8-14
- 在线时间
- 281 小时
|
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文件不会被重置
----------------------------------------------------------------
第二步:(第一个工程)
如果有使用killkeil.bat的,文本模式打开后,删除货注释:del *.sct /s
----------------------------------------------------------------
第三步:(第一个工程)
修改sct文件
在末尾增加一个region
; -------------------------------
; Load Region 2: Image Data
; -------------------------------
LR_QSPI_IMG 0x90200000 0x00100000 { ; 2~3MB for image
ER_QSPI_IMAGES 0x90200000 0x00100000 {
*.o (.qspi_image_data)
}
}
----------------------------------------------------------------
第四步:(第一个工程)
将所有图片转换后的数组放在一个c文件中,
const unsigned char 随便什么名字[数组的大小] __attribute__((used, section(".qspi_image_data"))) =
.qspi_image_data就是sct文件中新region的的名字,记住一定要带"."
----------------------------------------------------------------
第五步:(第一个工程)
将优化等级设置为-o0,因为数组声明了,但没使用,默认的优化等级会优化掉没使用的东西
----------------------------------------------------------------
第六步:(第一个工程)
下载,这个过程比较慢
----------------------------------------------------------------
第七步:(第二个工程)
做一个数组索引,和结构体,来描述在哪里,大小等信息
- 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;
复制代码 定义
- 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,
- },
- };
复制代码 上边的data地址都是一样的,我们可以不用自己去一个一个算,我们利用固定的起始地址和大小,上电之后计算一次即可
- for(uint16_t i = 1; i < image_end; i++)
- {
- image_info[i].data = image_info[i - 1].data + (image_info[i - 1].size >> 1);
- }
复制代码 然后就可以正常的显示图片啦
TFTLCD_DrawPic(0, 0, image_info[image_bg].width, image_info[image_bg].height, image_info[image_bg].data);
|
|