297浏览
查看: 297|回复: 2

[K10教程] 行空版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进行了修改,没有验证,大家可自行验证。添加两处内容,见下边代码。我安装的版本如下,至于最低到哪个版本没有上述改动,没验证。
行空版K10在arduino IDE中启用LVGL文件系统(SD卡)的应用...图1

  1. /**
  2. * @file lv_fs_fatfs.c
  3. *
  4. */
  5. /*********************
  6. *      INCLUDES
  7. *********************/
  8. #include "../../../lvgl.h"
  9. #if LV_USE_FS_FATFS
  10. /***********自己添加的内容 1*************/
  11. #define FF_DIR DIR    /* ESP IDF将“DIR”类型定义为“FF_DIR”。重命名为“DIR”以与此源文件一起使用 */
  12. #define FATFS_DIR DIR /* Mbed操作系统将“DIR”类型定义为“FATFS_DIR”。重命名为“DIR”以与此源文件一起使用*/
  13. /***********自己添加的内容 1*************/
  14. #include "ff.h"
  15. /*********************
  16. *      DEFINES
  17. *********************/
  18. /***********自己添加的内容 2*************/
  19. #ifdef ESP_PLATFORM
  20. #define DIR FF_DIR   /*ESP IDF在其FF.h版本中将DIR类型定义为FF_DIR。在LVGL中也使用FF_DIR */
  21. #endif
  22. /***********自己添加的内容 2*************/
  23. #if LV_FS_FATFS_LETTER == '\0'
  24.     #error "LV_FS_FATFS_LETTER must be an upper case ASCII letter"
  25. #endif
复制代码


添加这两处,已经做了标记。

2、由于K10板子设计的功能较多,一些引脚进行了重新定义,所以,我们需要找到SD卡的各引脚定义。下边是一些引入和定义,其中SD_XX四个是SD卡的引脚定义。
  1. #include <Arduino.h>
  2. #include <Wire.h>
  3. #include "TCA9555.h"
  4. #include <lvgl.h>
  5. #include <TFT_eSPI.h>
  6. #include <SPI.h>
  7. #include <FS.h>
  8. #include <SD.h>
  9. //#include <../lvgl/examples/lv_examples.h>
  10. //*#include <../lvgl/demos/lv_demos.h>
  11. #define SDA_PIN 47                        
  12. #define SCL_PIN 48        
  13. #define TFT_BL 0
  14. TCA9535 gpio(0x20);
  15. #define SD_MOSI     42
  16. #define SD_MISO     41
  17. #define SD_SCLK     44
  18. #define SD_CS       40
  19. #define  currentRotation  (3)
  20. static SPIClass sdCardSpi;   
复制代码



3、在主文件的SETUP之前,添加如下SD卡初始化函数。
  1. static void fs_init(void) {
  2.   sdCardSpi.begin(SD_SCLK, SD_MISO, SD_MOSI, SD_CS);  //SCLK, MISO, MOSI, SS
  3.   if (!SD.begin(SD_CS, sdCardSpi)) {
  4.     Serial.println("SD卡挂载失败。");
  5.     return;
  6.   }
  7.   uint8_t cardType = SD.cardType();
  8.   if (cardType == CARD_NONE) {
  9.     Serial.println("未连接SD卡。");
  10.     return;
  11.   }
  12.   Serial.print("SD卡类型: ");
  13.   if (cardType == CARD_MMC) {
  14.     Serial.println("MMC");
  15.   } else if (cardType == CARD_SD) {
  16.     Serial.println("SDSC");
  17.   } else if (cardType == CARD_SDHC) {
  18.     Serial.println("SDHC");
  19.   } else {
  20.     Serial.println("UNKNOWN");
  21.   }
  22.   uint64_t cardSize = SD.cardSize() / (1024 * 1024);
  23.   Serial.printf("SD Card Size: %lluMB\n", cardSize);
  24.   Serial.printf("Total space: %lluMB\n", SD.totalBytes() / (1024 * 1024));
  25.   Serial.printf("Used space: %lluMB\n", SD.usedBytes() / (1024 * 1024));
  26. }
复制代码

4、使用前要进行初始化。中间加了两个延时,经过测试,不加延时有初始化失败的概率,加上延时比较保险。
  1. fs_init();    //初始化SD卡,
  2.      delay(200);
  3.      lv_fs_fatfs_init(); // 初始化文件系统
  4.      delay(200);
  5.      lv_example_show_png();   //自己写的演示
  6.      lv_example_show_font();   //自己写的演示
复制代码

5、正常使用
  1. #if LV_COLOR_DEPTH == 32
  2.        lv_img_set_src(img, "S:img_test/C2_32.png");                     //读取卡上的文件,并交给LVGL在屏幕显示。
  3.     #elif LV_COLOR_DEPTH == 16
  4.       lv_img_set_src(img, "S:/img_test/zdbmp_2_16_r5.bmp");   //读取卡上的文件,并交给LVGL在屏幕显示。
  5.     #endif
  6.     lv_obj_align(img, LV_ALIGN_CENTER, 0, 0);
复制代码

行空版K10在arduino IDE中启用LVGL文件系统(SD卡)的应用...图2


以上就是K10在arduino ide中启用文件系统的个人一些经验,希望给初学者一些借鉴。屏幕中的图片,就是读取SD卡上的读片。

补充:lv_conf.h文件中,必须启用文件系统。

  1. /*API for FATFS (needs to be added separately). Uses f_open, f_read, etc*/
  2. /*用于FATFS的API(需要单独添加)。使用f_open、f_read等*/
  3. #define LV_USE_FS_FATFS 1  //此处必须设置为1,以启用文件系统。
  4. #if LV_USE_FS_FATFS
  5.     #define LV_FS_FATFS_LETTER 'S'         /*设置驱动器可访问的大写字母(例如“A”)*/
  6.     #define LV_FS_FATFS_CACHE_SIZE 0   /*>0将此字节数缓存在lv_fs_read()中*/
  7. #endif
复制代码

经验教训:
   1、arduino ide编译时,是按照目录搜索并包含的,如果怕自己改错,而把文件在原目录改名备份不行,IDE也会包含进来。
   2、ESP32板子的核心支持,会随着问题的发现而更新,有些变动比较会导致程序失败(比如前边变量改名),出现失败时,除读报错信息之外,也要多搜索答案。
   3、LVGL 也随着升级有些函数进行了较大变动,甚至函数变量个数都进行了改变,尽量别随意升级。而且升级会覆盖原来的一些改动和设置。

木子哦  管理员

发表于 2025-2-18 13:34:12

不错的分享
回复

使用道具 举报

科学王老师  见习技师
 楼主|

发表于 2025-2-19 01:15:31

谢谢木子老师!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail