参考自正点原子LittleVGL移植教程
本来是想直接快速入手一下littleVGL的,正点原子的移植教程做的很好,但版本是V6.0(现在更新到了V8.3),而我想移植最新版,所以全程试水,移植花了我大半天时间,遇到一堆坑,下面就介绍我移植的过程(大体步骤和正点原子相同,但是细节有些差异),仅供参考。
下载littleVGL源码
littleVGL 的官方网址为: https://littlevgl.com
littleVGL 的 github 网址为: https://github.com/littlevgl/lvgl
littleVGL 的在线文档网址为: https://docs.littlevgl.com/zh-CN/html/index.html
我直接到github下载最新版源码,当前最新版为V8.3
下载后,得到lvgl-master
文件夹。
准备Keil工程
这里和正点原子移植教程一样,选用正点原子触摸屏实验工程作为工程模板(可到正点原子资料下载中心下载)。
将main.c无关代码删除,仅留下main.c
核心代码
导入littleVGL库到Keil
在Keil工程根目录下创建两个文件夹,GUI/ 用来存放littleVGL源码,GUI_APP/ 用来存放图像应用(目前为空)。
拷贝源码
正点原子教程只拷贝了两个文件夹到Keil目录,但最新版和V6.0的源码目录结构变化很大,保险起见,我将刚才下载的所有littleVGL文件复制到了GUI文件夹(失败移植多次后总结出来的经验~~)【不过所有文件的大小有100M(其中demo/占50M),如果后面想减少工程占用空间,可以删除部分文件,但第一次移植,就全复制吧。】
复制完成后,重命名源码根目录下的lv_conf_template.h
,改为lv_conf.h
,这是littleVGL的全局配置文件,很重要。
Keil目录修改完成了,接下来还需要在Keil工程中添加源码文件,在工程目录结构里新建两个分组,命名GUI 和 GUI_APP,然后将源码目录下src/
里所有.c
文件文件添加到GUI分组中(注意是所有!包括子目录下的.c
文件)。【这是一个折磨人的工作,因为子目录有点多,特别是有些目录下还有多层子目录,且很多子目录就一个.c
文件。。。只能说Keil这个IDE不够人性化】
添加文件一定要仔细,我第一次因为少添加了源文件,报了各种莫名其妙的错误。
添加完文件后,我们还需要做 2 个比较重要的小操作,加大项目的栈空间到 2KB 和使能 C99 编译器功
能。【我也不知道为什么,教程这样规定的,照做就行了】
差点忘了,刚才添加完.c
文件,没有将它们的头文件路径进行声明,继续使用魔法棒,添加头文件路径,下面这两个就够了,其他的后面需要再添加。
之前我还在考虑子目录下的头文件是否要管,但第一次失败后,我才发现,源码根目录下的lvgl.h
已经把几乎所有头文件都包含了,这也是我选择把完整源码复制到Keil工程目录的原因,省的到时丢三落四。
修改lv_conf.h
这是一个全局配置文件,里面很多配置项,看得人眼花缭乱。其实这个文件不需怎么修改,至少我几乎没怎么改动(当然#if 0是一定要改的)。
第二个改动是参考正点原子移植教程,改了一下动态内存大小。
此时我们编译一下Keil工程,发现报了很多找不到lv_conf.h
,解决办法有两个:
- 将
lv_conf.h
移动到src/
的上上层目录,即当前lv_conf.h
的上层目录; - 或者添加宏声明
LV_CONF_INCLUDE_SIMPLE
,这样编译器就会从所有已包含的头文件路径去找lv_conf.h
我不想动源文件的结构,选择了添加宏声明:
再次编译,还有一个错误,这是增加C99
后才会报的错,解决办法是在函数前加个类型void
本以为这是最后一个错误,没想到再编译还有错,上一次成功移植没遇到的错误。
找了很久,没找到原因,仔细看Build Out
信息,发现有一些xx_1.o
类的文件,怀疑是重复添加了相同的.c
文件,当时在添加.c
文件时觉得很奇怪,以前重复添加会提示,今天直接给我加进去了(Keil出Bug了)。删除一些重复添加的.c
文件后,依然报错。但是后面我重开Keil软件,再编译,竟然成功了。。搞不懂了。
但是有19个警告,正点原子移植教程中有一步时消除警告的,虽然和我遇到的警告不一样,但试了一下,有一点效果,警告少了一些。
在 Misc Controls 中填入
--diag_suppress=68 --diag_suppress=111 --diag_suppress=550
移植底层显示驱动
littleVGL提供的底层显示驱动文件在GUI/examples/porting/
路径下,
在GUI文件夹内新建一个文件夹lvgl_driver
,用于存放底层驱动代码,
同时将他们重命名(删掉_template)
接着在Keil工程中添加源文件和头文件路径
对lv_port_disp.h
做如下修改:
对lv_port_disp.c
做如下修改:
使能,同时添加显示屏的驱动头文件
设置缓存方式,我选择10行缓存,我所用的屏幕分辨率为320*480,所以行宽为320,
设置分辨率
调用正点原子的LCD填充函数
移植底层触摸驱动
对lv_port_indev.h
做如下修改:
对lv_port_indev.c
做如下修改:
使能,同时添加触摸屏的驱动头文件
将除触摸屏以外的其他设备初始化屏蔽
触摸屏驱动修改比较简单,只需要添加“判断是否按下”和“获取按下坐标”两部分底层代码
添加GUI心跳节拍
正点原子触摸屏实验里没有定时器功能代码,需要另外添加,我们这节把定时器实验的timer/
文件夹拷贝到我们的工程中。
接着将源文件和头文件进行添加
修改定时器3的中断服务函数
在main()进行初始化
最后不要忘了添加定时器固件库
运行demo
打开lv_conf.h
,使能一个demo(好几个我都测试失败了),到其他地方使能也行
找到刚才使能的demo的位置
在工程中添加源文件,由于整个源代码的头文件都被工程包含,如果要想使用demo里的函数,只需要包含一个绝对路径的头文件(如下图)
最后,在main.c进行相关初始化,同时运行demo:
编译烧录
这是一个压力测试的demo。