说明:选择BMP解码图片的方式,是因为此方式不需要占用太多的RAM
一、主要参数及版本
MCU:STM32F103ZET6
LCD:2.8寸ILI9341,使用FSMC驱动
SPI FLASH:W25Q64
FATFS:R0.11
STM32Cube:Version 6.3.0
LittleVGL:V8.0.2
GUI Guider:GUI-Guider-1.3.1-GA,此上位机使用的是LVGL V8.0.2
二、基础说明
本文使用STM32 + MSC + FATFS + LVGL + 文件系统 + BMP直接解码SPI FLASH中的图片,显示在LCD上。
USB MSC + FATFS使用STM32Cube直接生成,这里不做介绍,主要以LVGL文件系统的移植和BMP解码移植为主要内容。
1、STM32Cube生成USB MSC和FATFS
2、移植LVGL到项目,并编译正常,版本V8.0.2
3、上位机UI设计软件采用NXP的GUI Guider
下载链接:
GUI Guider | NXP Semiconductors
三、添加文件系统
下载链接:
https://github.com/lvgl/lv_fs_if
1、将lv_fs_fatfs.c、lv_fs_if.c、lv_fs_if.h添加到项目
2、lv_conf.h修改
在lv_conf.h中添加:
/*File system interface*/
#define LV_USE_FS_IF 1
#if LV_USE_FS_IF
#define LV_FS_IF_FATFS 'U' //可以自定义
#endif /*LV_USE_FS_IF*/
下面一步很重要,不添加图片显示不了,默认是1,改为0
#define LV_USE_USER_DATA 0
3、在main.c中添加初始化lv_fs_if_init()
4、修改lv_fs_fatfs.c
修改fs_init()
这一步很重要,确少这一步会导致文件系统用不起来。
/**********************
* STATIC FUNCTIONS
**********************/
FATFS fs; /* Work area (file system object) for logical drives */
FRESULT res;
//UINT br, bw; /* File R/W count */
BYTE work[_MAX_SS]; /* Work area (larger is better for processing time) */
DWORD fre_clust;
/* Initialize your Storage device and File system. */
static void fs_init(void)
{
/* Initialize the SD card and FatFS itself.
* Better to do it in your code to keep this library utouched for easy updating*/
res = f_mount(&fs, "U", 1); //挂载文件系统到W25Q64
if (res==FR_NO_FILESYSTEM) //如果是新芯片还没有文件系统
{
f_mkfs("U", 0, sizeof(work));
}
}
四、添加BMP解码
下载链接:
GitHub - lvgl/lv_lib_bmp: BMP decoder library for LVGL
1、将lv_bmp.c、lv_bmp.h添加到项目
2、在main.c中添加初始化lv_bmp_init()
3、在需要使用的时候添加 #include “lv_bmp.h”
五、图片显示
1、在虚拟U盘中添加图片,注意LV_COLOR_DEPTH 16需要与BMP图片一致
2、读取图片
lv_img_set_src(ui->home_language,"U:/image/image.bmp");
注意:如果LCD上显示”No Data”,修改lv_conf.h中#define LV_MEM_SIZE (16U * 1024U) /*[bytes]*/ 大小