
1.文件系统移植准备6 k3 [4 j; b6 P$ E 直接根据上几个章节移植的文件直接修改FATFS配置到LVGL文件系统。4 D! }$ e! s' Y& r 准备一张图片,尺寸不要超过屏幕大小。/ C$ m0 h$ ]' c7 w4 D. Y. o % `7 ^$ j. K, E ![]() 使用lvgl_image_convert软件将dog.png转换为dog.bin文件,并将dog.bin复制到SD卡根目录下。 输出格式为Bin_565 ![]() 4 U5 O# o t+ f. t 2.KEIL&LVGL文件系统配置 修改lv_conf.h文件. L3 E/ [5 \, F! H5 o" O #define LV_USE_FS_FATFS 1/ J0 |+ Y' s9 [' T% I. d5 J/ v; G B# n& B/ d$ x7 S. k #if LV_USE_FS_FATFS6 \% C/ c. G6 r6 G6 T #define LV_FS_FATFS_LETTER '0' // 卷标 ( N/ \# ~' K7 [- `4 J% t! ~8 z) ^ #define LV_FS_FATFS_CACHE_SIZE 2*512 // 读取大小 #endif4 c: }- v9 b9 n0 s $ v7 H. s+ c: u5 h; |; p: m* O 打开并使能lv_port_fs.c、lv_port_fs.h, lv_port_fs.c只需要修改一下几个函数就行,其他的暂时注释掉,以后若有需要在进行修改。我们这里就先实现图片的加载 static void fs_init(void); static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode);- o. R1 C/ U; N. k static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p);7 r# p; V' m7 E" Q static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); R, [' J# E. f* h static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence);% {5 P5 q. \* P: { - a, J; s" k) J& s3 O# t- R D, Q static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); % j2 p; g- [$ t! r static void * fs_dir_open(lv_fs_drv_t * drv, const char * path); static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn); static lv_fs_res_t fs_dir_close(lv_fs_drv_t * drv, void * dir_p);8 }3 I0 `4 m) Q * D- [) L9 @$ Q" R3 ]2 t0 F' V 下面的几个函数按顺序进行修改,先修改初始化函数void fs_init(void);。这里的记录就直接附截图了,还是自己手动配置一下记忆更深。 3 O$ {* A \7 }9 F8 o% U- F ![]() 8 N* z V1 q5 R. P4 S" K1 D ![]() ![]() + O! Q; w% C, y) Y) C; X: X 6 D, {, f7 H0 V9 S1 @* ]8 W7 j 3.文件系统测试' s+ U4 Q# Y ~) ^ 在上一章节记录的基础上面将按钮控件,替换称为一个带图片背景色的按钮。5 b6 s. Y/ i" M4 E V 先在初始化函数中初始化LVGL文件系统' K1 S, ?* l! [! ]/ s7 u ![]() main函数修改' z/ Z8 k" d1 t6 B ![]() 8 D' u& q; z4 I' ~1 S6 _) v" ] 实际效果。6 Y$ _4 G& c; l ![]() 0 e u6 v' t7 {, B j# E3 { 4.LVGL模拟器加载本地图片/ `6 Q" G9 V0 n7 M 打开建立的LVGL模拟器启动文件 ![]() 修改lv_conf.h中9 r- E" [0 A# h# f6 C$ N3 ~ 在这里一定要把LV_COLOR_DEPTH定义为16,在前面我们转换的图片输出格式是Bin_565,按默认的LV_COLOR_DEPTH定义为32,是显示不出来图片的。 9 J2 \5 L: C/ x: t 定义FS卷标为0跟KEIL中的一样,可以方便程序移植。1 H3 g7 \% a( @' W) K6 D: a + U \/ K' p G% t; ? #define LV_USE_FS_WIN32 '0' /*Uses CreateFile, ReadFile, etc*/ ![]() 修改lv_conf_internal.h 先在KEIL_LVGL\Simulator\LVGL.Simulator文件夹下面新建image文件夹并把dogmax.bin复制到里面。 ! R2 g! Y( X2 c, R4 r- X. R ![]() 4 x7 h7 {4 X: X! E 修改 #define LV_FS_WIN32_LETTER '0' // 卷标! p$ G3 x" Y4 I, A #define LV_FS_WIN32_PATH "image/" // 文件相对路径. L+ { B w- f; i" D #define LV_FS_WIN32_CACHE_SIZE 4*512 // 读取文件缓存大小/ U. S" C" y2 L& A' W6 H ![]() 在main函数中添加以下函数并运行。这里面的main函数内容其实与KEIL中的main函数差不多。 ![]() 运行效果。 ![]() 5.总结3 E5 D, {& n* f) p& n8 S% L 到这里差不多是把LVGL驱动配置完成了,我在移植配置KEIL工程和VS LVGL模拟器时可以看到两个工程引用的的lv_conf.h文件其实不是一个文件,在配置两个文件的路径时要重点注意。 在运行编译运行LVGL模拟器时,有时候模拟器并不会报错,但是会报错LVGL.Simulator.exe无法运行,这个时候需要将KEIL_LVGL\Simulator\Output\Binaries\Debug\x64文件夹下面的两个文件删除掉就行。这个问题暂时还没有发现是在哪里引入的BUG。 7 c& q" M) v4 ?/ l6 x' o6 P ![]() 这个移植是一学习记录的过程,自己踩过的坑不想再重复一次,也给大家一个参考,免的浪费时间自己摸索。 ( B1 L3 i( y. I+ D KEIL工程和visual studio模拟器工程其实可以通过合理的创建公共文件,实现模拟器调试后可以直接在keil中编译下载,这个在后面再谈论一下。& r1 ~7 s& ^8 U9 O# ` ; W3 I$ j3 E0 _1 f, I% Y$ f 为避免大家在我这里浪费时间,我这里先讲一下我会记录一下什么。 + ~0 q c0 r8 U4 M* a 首先的像按钮、列表、线条之类的单个控件的运用我这里是不会记录的,像LVGL官网、百问网等网站上面有好多高质量的介绍,我是肯定没那些大佬讲解的仔细的,我这里就直接用了,大家有需要的可以直接去那些网站学习。6 ~2 f( L/ q) |+ @ % s0 c6 P$ e* ^( I6 {, O8 k% a1 e 主要是记录一些控件的组合使用,大多是搭配具体的工程,还有就是一些比较晦涩的运用、调试过程遇到的一些坑。近期会学习记录页面管理器,页面之间的联动之类的运用,后期会做一个开发板专门用来学习LVGL,大家如果感觉今后会用得到的话,不妨先三连支持一下。 % j5 L( d% t- c8 U* F! c. h 作者:鹰头猫咪喵喵鱼 * J5 P5 s' W- |/ v2 K* \ |
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
OpenBLT移植到STM32F405开发板
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
STM32 以太网 MAC Loopback 的实现
STM32功能安全设计包,助力产品功能安全认证
基于STM32启动过程startup_xxxx.s文件经验分享
HRTIM 指南
ST 微控制器电磁兼容性 (EMC) 设计指南