科学王老师 发表于 2025-2-18 12:44:51

行空版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 也随着升级有些函数进行了较大变动,甚至函数变量个数都进行了改变,尽量别随意升级。而且升级会覆盖原来的一些改动和设置。

木子哦 发表于 2025-2-18 13:34:12

不错的分享

科学王老师 发表于 2025-2-19 01:15:31

谢谢木子老师!
页: [1]
查看完整版本: 行空版K10在arduino IDE中启用LVGL文件系统(SD卡)的应用...