目前LVGL版本已经更新到8.3版本,FATFS也是在嵌入式领域常用的文件系统。网上许多在LVGL上移植FATFS的教程大都是基于LVGL7版本的,而且过程较为凌乱。本文旨在帮助大家了解在LVGL8上移植FATFS文件系统的过程。
两种库的适配很简单,说白了就是在一方的函数中调用另一方的函数。下面介绍如何将LVGL与FATFS的函数关联起来。
这里我认为大家已经下载了LVGL和FATFS的官方库,并且已经会单独使用LVGL和FATFS进行测试(本文只讲他们之间如何适配)。下面是下载链接:
LVGL: https://github.com/lvgl/lvgl
FATFS: http://elm-chan.org/fsw/ff/00index_e.html
使用LVGL的文件系统时,函数的调用关系为:LVGL调用FATFS,FATFS调用单片机底层SD卡或FLASH驱动函数。
在适配过程中,我们主要关注3个文件:LVGL中有两个:lv_fs.c
和lv_fs_fatfs.c
。FATFS中有1个:ff.c
。
lv_fs.c
是提供给用户使用的函数,比如lv_fs_open
、lv_fs_close
、lv_fs_read
等。
ff.c
是FATFS文件系统对底层磁盘操作的函数。
lv_fs_fatfs.c
是连接上面两部分的过度文件。
调用关系:
lv_fs.c
文件中打开文件函数:
可以看到,在函数内部实际上调用的是设备的打开文件回调函数。
此回调函数会在lv_fs_fatfs.c
中注册。
lv_fs_fatfs.c
:
到这里LVGL和FATFS之间的调用关系就十分的清晰明了了。
注意:文件中的lv_fs_fatfs_init
函数,是在lv_extra.c
中的函数lv_extra_init
调用的。而lv_extra_init
在lv_init
中被调用,所以用户就不需要自己调用上面的lv_fs_fatfs_init
函数注册回调函数了。
同时注意也要在lv_conf.h
中打开使用FATFS文件系统的宏开关。
这里的LV_FS_FATFS_LETTER
是单个字符,正点原子把SD卡盘符设置为0
,这里注意要写为‘0’
,而不能写为‘0:’
或者‘0/’
,否则使用文件系统函数会报错。我就是这个问题卡了好久。
综上可知,在LVGL中使用FATFS文件系统,同时在单片机上使用,只需要下面几步:
1、在lv_conf.h
中打开LV_USE_FS_FATFS
宏开关同时设置磁盘的盘符。
2、在工程中添加FATFS文件系统移植文件。
3、在FATFS文件中的diskio.c
中添加底层磁盘驱动函数。
到此,LVGL和FATFS的适配已经完成,下面进行测试。
首先进行SD卡初始化和文件系统挂载
然后进行LVGL初始化,最主要的是lv_init函数,在此函数里面进行文件系统初始化。
最后调用LVGL的文件系统函数进行测试:
输出结果:
可以看到,系统从SD卡中读取了8个字符,说明LVGL的文件系统函数可以正常使用。