本帖最后由 科学王老师 于 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
- #define currentRotation (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 也随着升级有些函数进行了较大变动,甚至函数变量个数都进行了改变,尽量别随意升级。而且升级会覆盖原来的一些改动和设置。
|