RT-Thread论坛
直播中

硕达科讯

9年用户 966经验值
私信 关注
[问答]

在RT-Thread中怎么使用LVGL将SD内容显示出来?

我在使用HMI-Board板想使用LVGL将SD卡里的内容显示在屏幕上,因为初学不太懂rtthread的操作。自动创建的lvgl中没有包含相关文件,是需要自己添加吗?还是rtthread已经再封装了


回帖(1)

符筹荣

2025-10-9 17:30:17

在 RT-Thread 中使用 LVGL 显示 SD 卡内容,需要手动配置文件系统和 LVGL 的文件接口。以下是详细步骤:




1. 确保 SD 卡驱动和文件系统正常工作


步骤:




  1. 挂载 SD 卡

    rt_hw_board_init() 或应用代码中初始化 SD 卡并挂载文件系统(如 FATFS):


    #include 

    int sd_mount(void) {
       if (dfs_mount("sd0", "/", "elm", 0, 0) == 0) {
           rt_kprintf("SD card mounted to /n");
       } else {
           rt_kprintf("SD card mount failedn");
       }
    }
    INIT_APP_EXPORT(sd_mount); // 自动初始化


    • 确认设备名(如 sd0)与你的板卡一致(查看 SD 卡驱动注册的设备名)。




  2. 测试文件系统

    在终端使用命令检查 SD 卡内容:


    ls /            # 查看根目录
    cat /test.txt   # 测试读取文件





2. 配置 LVGL 文件系统接口


步骤:




  1. 启用 LVGL 文件系统支持

    rtconfig.h 或通过 ENV 工具 (menuconfig) 配置:


    # 进入 RT-Thread ENV 配置
    menuconfig


    • 路径:  
      RT-Thread Components → GUI → LVGL → [*] Enable file system

    • 设置驱动器号(如 'S'):
      (S) LV_FS_FATFS_LETTER  # 驱动器字母(自定义)




  2. 修改 LVGL 文件系统驱动

    编辑 lv_conf.h


    #define LV_USE_FS_FATFS    1
    #define LV_FS_FATFS_LETTER 'S' // 与 menuconfig 中一致



  3. 实现文件操作接口

    在工程中添加 lv_port_fs.c(参考模板:packages/lvgl/port/lv_port_fs.c)。关键函数:


    void lv_port_fs_init(void) {
       lv_fs_drv_t fs_drv;
       lv_fs_drv_init(&fs_drv);
       fs_drv.letter = LV_FS_FATFS_LETTER;
       fs_drv.open_cb = fs_open;
       fs_drv.close_cb = fs_close;
       fs_drv.read_cb = fs_read;
       // ... 其他回调(write, seek 等)
       lv_fs_drv_register(&fs_drv);
    }


    • 回调函数需用 RT-Thread 的 DFS API 实现(如 openread)。






3. 显示 SD 卡内容


示例:显示图片




  1. 初始化 LVGL 文件系统

    在 LVGL 初始化后调用:


    extern void lv_port_fs_init(void); // 声明
    int lvgl_init(void) {
       lv_init();
       lv_port_fs_init(); // 初始化文件系统接口
       // ... 其他初始化(显示驱动、输入设备等)
    }



  2. 加载并显示图片  


    lv_obj_t *img = lv_img_create(lv_scr_act());
    lv_img_set_src(img, "S:/images/pic.jpg"); // 路径格式: "驱动器字母:/路径"
    lv_obj_center(img);





4. 处理常见问题


1) SD 卡无法挂载



  • 检查驱动是否注册:list_device 查看是否有 sd0 设备。

  • 确认接线是否正确(CLK、CMD、DAT0-3)。


2) LVGL 无法打开文件



  • 路径格式正确:"S:/path/to/file"(注意斜杠方向和冒号)。

  • 实现所有必要的文件回调(openreadseek 等)。


3) 图片显示失败



  • 确保格式支持:LVGL 内置支持 JPG、PNG(需启用 LV_USE_PNGLV_USE_SJPG)。

  • 检查内存:大图片需要足够堆内存(可在 lv_conf.h 增加 LV_MEM_SIZE)。




5. 完整代码片段


lv_port_fs.c 核心回调示例:


#include 
#include // RT-Thread 文件系统头文件

static void *fs_open(lv_fs_drv_t *drv, const char *path, lv_fs_mode_t mode) {
    int fd = open(path, O_RDONLY);
    return (void *)(intptr_t)fd;
}

static lv_fs_res_t fs_read(lv_fs_drv_t *drv, void *file_p, void *buf, uint32_t btr, uint32_t *br) {
    int fd = (int)(intptr_t)file_p;
    *br = read(fd, buf, btr);
    return (*br > 0) ? LV_FS_RES_OK : LV_FS_RES_UNKNOWN;
}

// 实现其他回调: close、seek 等...



关键点总结:



























步骤 内容
1. 挂载 SD 卡 使用 dfs_mount 挂载 FATFS 到路径(如 /
2. 配置 LVGL 启用 LV_USE_FS_FATFS 并设置驱动器字母
3. 实现接口 添加 lv_port_fs.c 并注册文件操作回调
4. 使用路径 加载文件时使用 "X:/path" 格式(X 为驱动器字母)

通过以上步骤,你的 HMI-Board 即可通过 LVGL 显示 SD 卡中的图片、文本等内容。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分