littlevgl读取sd卡FatFS图像文件--Apple的学习笔记

一,前言

之前littlevgl_7.11源码分析(2)--Apple的学习笔记中我就提及到移植了littlevgl中的文件系统,但是没有成功,所以通过调试后,对Fatfs这些文件系统相关变量加深了了解,然后就解决了此问题。

二,问题解决

调试过程我就不多说了,直接把我遇到的问题及解决方案说下。

  1. lv_port_fs.c中如下2个变量很重要,letter就是FAT32的盘符。我的example中传入的是lv_img_set_src(bg_img, "0:applefile/river.bin");盘符是0,盘符必须统一。
    fs_drv.file_size = sizeof(file_t);
    fs_drv.letter = '0';

另外一个就是上面的file_t需要重定义typedef FIL file_t;原因就是lvgl源码的文件系统它可以移植为posix及fatfs文件系统,posix中file_t就用int重定义即可,因为它的意思就是linux中的fd。而对于我移植的是FATFS,则要定义为FIL。lvgl的文件系统结构体为lv_fs_file_t,为了可以兼容posix和FATFS文件系统,它就分了2个成员。

typedef struct {
    void * file_d;
    lv_fs_drv_t * drv;
} lv_fs_file_t;
  1. 我之前遇到的问题,f_open->follow_path返回的值是错误的,导致最终无法打开文件。后来查到ff.c也就是fatfs源码包中的关键变量find_volume中fs = FatFs[vol]static FATFS *FatFs[_VOLUMES];原来是一个地址,一开始我还以为是一块内存区域,所以我在fs_init中f_mount后进行了lv_mem_free(fs);导致lv_port_fs_init函数中lv_fs_drv_register的时候建立链表头的_lv_drv_ll的时候用了受污染的内存区域。主要是FATFS结构体中fs_type不对,期望为3,污染区域为driver的letter字符0就是0x30。导致的问题。解决方法是在fs_init中删除lv_mem_free(fs);

三, APP代码及运行效果

按下按钮后切换图片,一共我就放入了2张图片。

lv_obj_t *bg_img;
static void btn_event_cb(lv_obj_t *btn, lv_event_t event)
{
    if (event == LV_EVENT_PRESSED)
    {
        // if(event == LV_EVENT_CLICKED) {
        static uint8_t cnt = 0;
        cnt++;
        /* change picture */
        if (cnt % 2)
        {
            lv_img_set_src(bg_img, "0:applefile/kenan.bin");
        }
        else
        {
            lv_img_set_src(bg_img, "0:applefile/river.bin");
        }
        /*Get the first child of the button which is the label and change its text*/
        lv_obj_t *label = lv_obj_get_child(btn, 0);
        lv_label_set_text_fmt(label, "Button: %d", cnt);
    }
}

/**
 * Create a button with a label and react on click event.
 */
void lv_example_get_started_1(void)
{
    bg_img = lv_img_create(lv_scr_act(), NULL);
    lv_img_set_src(bg_img, "0:applefile/river.bin");
    lv_obj_move_background(bg_img);
    
    lv_obj_t *btn = lv_btn_create(lv_scr_act(), NULL); /*Add a button the current screen*/
    lv_obj_set_pos(btn, 10, 10);                       /*Set its position*/
    lv_obj_set_size(btn, 100, 50);                     /*Set its size*/
    lv_obj_set_event_cb(btn, btn_event_cb);            /*Assign a callback to the button*/

    lv_obj_t *label = lv_label_create(btn, NULL); /*Add a label to the button*/
    lv_label_set_text(label, "Button");           /*Set the labels text*/
}
image.png

四,总结

啊哈!lvgl中的3类porting文件我都用了,现在文件系统已经可以访问sd卡中的fat32格式,之后有空再加一个usb驱动来直接访问sd卡,那么做个数码相框一类的应用就很方便,省的要拔下屏幕再拔出sd卡再通过PC修改SD中的内容。不过我这块开发板是stm32f407没有dma2d加速,所以有明显的刷屏感,这个将来考虑下尝试再做优化,不过与本次littlevgl的应用及源码分析无关,所以先跳过。

你可能感兴趣的:(littlevgl读取sd卡FatFS图像文件--Apple的学习笔记)