|
|
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,因为数组声明了,但没使用,默认的优化等级会优化掉没使用的东西
----------------------------------------------------------------
第六步:(第一个工程)
下载,这个过程比较慢
----------------------------------------------------------------
第七步:(第二个工程)
做一个数组索引,和结构体,来描述在哪里,大小等信息
[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);
|
|