行空版K10在arduino IDE中启用LVGL文件系统(SD卡)的应用...
本帖最后由 科学王老师 于 2025-2-19 01:14 编辑昨天发了怎样调试好LVGL的显示部分,今天把我使用文件系统的经验,汇报给大家。以抛砖引玉。
lVGL本身带有文件系统,和一些文件系统的函数,但由于其使用环境很多,可能读取多种存储介质,所以,需要自己写存储装置的初始化部分。当然也可以自己写读写函数,但只写初始化部分是最简单的。启用文件系统,就可以读写SD卡上的文件了。
1、首先修改C:\Users\自己名\Documents\Arduino\libraries\lvgl\src\extra\libs\fsdrv目录下的lv_fs_fatfs.c文件。这是因为LVGL 8.3.10发布后,乐鑫发布的板子文件中,改变了一个变量名,由原来的DIR改变为FF_DIR,不修改会导致编译失败。新的lvgl 9.0是否随着esp32进行了修改,没有验证,大家可自行验证。添加两处内容,见下边代码。我安装的版本如下,至于最低到哪个版本没有上述改动,没验证。
/**
* @file lv_fs_fatfs.c
*
*/
/*********************
* INCLUDES
*********************/
#include "../../../lvgl.h"
#if LV_USE_FS_FATFS
/***********自己添加的内容 1*************/
#define FF_DIR DIR /* ESP IDF将“DIR”类型定义为“FF_DIR”。重命名为“DIR”以与此源文件一起使用 */
#define FATFS_DIR DIR /* Mbed操作系统将“DIR”类型定义为“FATFS_DIR”。重命名为“DIR”以与此源文件一起使用*/
/***********自己添加的内容 1*************/
#include "ff.h"
/*********************
* DEFINES
*********************/
/***********自己添加的内容 2*************/
#ifdef ESP_PLATFORM
#define DIR FF_DIR /*ESP IDF在其FF.h版本中将DIR类型定义为FF_DIR。在LVGL中也使用FF_DIR */
#endif
/***********自己添加的内容 2*************/
#if LV_FS_FATFS_LETTER == '\0'
#error "LV_FS_FATFS_LETTER must be an upper case ASCII letter"
#endif
添加这两处,已经做了标记。
2、由于K10板子设计的功能较多,一些引脚进行了重新定义,所以,我们需要找到SD卡的各引脚定义。下边是一些引入和定义,其中SD_XX四个是SD卡的引脚定义。
#include <Arduino.h>
#include <Wire.h>
#include "TCA9555.h"
#include <lvgl.h>
#include <TFT_eSPI.h>
#include <SPI.h>
#include <FS.h>
#include <SD.h>
//#include <../lvgl/examples/lv_examples.h>
//*#include <../lvgl/demos/lv_demos.h>
#define SDA_PIN 47
#define SCL_PIN 48
#define TFT_BL 0
TCA9535 gpio(0x20);
#define SD_MOSI 42
#define SD_MISO 41
#define SD_SCLK 44
#define SD_CS 40
#definecurrentRotation(3)
static SPIClass sdCardSpi;
3、在主文件的SETUP之前,添加如下SD卡初始化函数。
static void fs_init(void) {
sdCardSpi.begin(SD_SCLK, SD_MISO, SD_MOSI, SD_CS);//SCLK, MISO, MOSI, SS
if (!SD.begin(SD_CS, sdCardSpi)) {
Serial.println("SD卡挂载失败。");
return;
}
uint8_t cardType = SD.cardType();
if (cardType == CARD_NONE) {
Serial.println("未连接SD卡。");
return;
}
Serial.print("SD卡类型: ");
if (cardType == CARD_MMC) {
Serial.println("MMC");
} else if (cardType == CARD_SD) {
Serial.println("SDSC");
} else if (cardType == CARD_SDHC) {
Serial.println("SDHC");
} else {
Serial.println("UNKNOWN");
}
uint64_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.printf("SD Card Size: %lluMB\n", cardSize);
Serial.printf("Total space: %lluMB\n", SD.totalBytes() / (1024 * 1024));
Serial.printf("Used space: %lluMB\n", SD.usedBytes() / (1024 * 1024));
}
4、使用前要进行初始化。中间加了两个延时,经过测试,不加延时有初始化失败的概率,加上延时比较保险。
fs_init(); //初始化SD卡,
delay(200);
lv_fs_fatfs_init(); // 初始化文件系统
delay(200);
lv_example_show_png(); //自己写的演示
lv_example_show_font(); //自己写的演示
5、正常使用
#if LV_COLOR_DEPTH == 32
lv_img_set_src(img, "S:img_test/C2_32.png"); //读取卡上的文件,并交给LVGL在屏幕显示。
#elif LV_COLOR_DEPTH == 16
lv_img_set_src(img, "S:/img_test/zdbmp_2_16_r5.bmp"); //读取卡上的文件,并交给LVGL在屏幕显示。
#endif
lv_obj_align(img, LV_ALIGN_CENTER, 0, 0);
以上就是K10在arduino ide中启用文件系统的个人一些经验,希望给初学者一些借鉴。屏幕中的图片,就是读取SD卡上的读片。
补充:lv_conf.h文件中,必须启用文件系统。
/*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/
/*用于FATFS的API(需要单独添加)。使用f_open、f_read等*/
#define LV_USE_FS_FATFS 1//此处必须设置为1,以启用文件系统。
#if LV_USE_FS_FATFS
#define LV_FS_FATFS_LETTER 'S' /*设置驱动器可访问的大写字母(例如“A”)*/
#define LV_FS_FATFS_CACHE_SIZE 0 /*>0将此字节数缓存在lv_fs_read()中*/
#endif
经验教训:
1、arduino ide编译时,是按照目录搜索并包含的,如果怕自己改错,而把文件在原目录改名备份不行,IDE也会包含进来。
2、ESP32板子的核心支持,会随着问题的发现而更新,有些变动比较会导致程序失败(比如前边变量改名),出现失败时,除读报错信息之外,也要多搜索答案。
3、LVGL 也随着升级有些函数进行了较大变动,甚至函数变量个数都进行了改变,尽量别随意升级。而且升级会覆盖原来的一些改动和设置。
不错的分享 谢谢木子老师!
页:
[1]