STM32F407ZGT6 移植 LVGL8
目录
- 移植环境
- 工程准备
- 移植lvgl
- 测试
- 工程源码
1. 移植环境
LVGL版本:v8.3.4
IDE: EIDE(vscode插件)
芯片:STM32F407ZGT6
屏幕:3.2寸 320*240 TFT
屏幕驱动IC:ILI9341
触摸驱动IC:GT9147
2. 工程准备
2.1 stm32代码工程要准备好lcd初始化和timer定时器外设的初始化
lcd.c要先实现好 void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color)
函数,后面lvgl工程代码实现调用的就是接口
初始工程框架
HARDWARE
文件夹
2.2 下载lvgl代码,直接git clone github上面的地址
git clone git@github.com:lvgl/lvgl.git
图片显示lvgl工程版本为v8.3.4
3. 移植lvgl
3.1 在代码工程下新建lvgl和lvgl_driver两个文件夹目录
3.2 到下载好的lvgl工程目录,将src文件夹,lvgl.h,lv_conf_template.h复制到stm32工程的lvgl文件夹中,并且将lv_conf_template.h文件改名为lv_conf.h。
lvgl工程中有demos和examples两个文件夹,这两个是一些lvgl官方的测试测序,可以复制过来方便测试学习。
3.3 进入lvgl工程examples\porting目录下,有以下6个文件,其中lv_port_disp_template是配置屏幕和lvgl的驱动文件,我们暂时先移植这两个文件lv_port_disp_template.c,lv_port_disp_template.h到stm32工程lvgl_driver目录下,并改名为lv_port_disp.c lv_port_disp.h。
复制好的工程目录:
3.4 修改相关文件
在stm32工程中,将lvgl/lv_conf.h下15行处的#if 宏判断改为1
在stm32工程中,将lvgl_driver下lv_port_disp.h #if 宏判断打开,修改包含lvgl.h头文件的路径为 “…/lvgl/lvgl.h”
在stm32工程中,将lvgl_driver下lv_port_disp.c #if 宏判断打开,并将 #include “lv_port_disp_template.h” 修改为 #include “lv_port_disp.h”,同时修改你的屏幕宽度和高度,我这里是320*240。
同时头文件添加lcd.h,后面会用到lcd的相关接口。
lv_port_disp.c往下滑,lv_port_disp_init() 函数中85~100行是三个缓冲类型的初始化,分别为单缓冲,双缓冲和全缓冲,缓冲等级越高能提升ui显示性能,但同时也更占据内存。我们这里选择第一个单缓冲(也可选择双缓冲,stm32f407zgt6内存足够),将其他两个缓冲注释掉。
同时还要实现lv_port_disp.c中的 static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
函数,在这里我们包含lcd头文件 #include "lcd.h"
,将LCD屏幕的显示实现调用我们写好的接口。
到这里lvgl的文件移植就基本结束了。
4. 移植测试
这里测试我们用lvgl官方demo里的lv_demo_music()例程进行测试。(这个测试需要在移植的时候将demos文件夹移植到工程中)
main.c:
#include "stm32f4xx.h"
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "lcd.h"
#include "timer.h"
#include "lvgl.h"
#include "lv_port_disp.h"
#include "lv_demos.h"
void tim_lv_tick();
int main(void)
{
delay_init(168); //滴答定时器初始化
Led_Init(); //LED初始化
LCD_Init(); //LCD初始化
Timer_InitDef TIM_2_conf=
{
.TIMx = TIM2,
.ms = 1,
.NVIC_Priority = 0,
.event_handler = tim_lv_tick,
};
timer_init(&TIM_2_conf); //配置定时器
lv_init(); //lvgl初始化
lv_port_disp_init(); //显示驱动初始化
lv_demo_music(); //demo
while(1)
{
lv_task_handler();
}
}
void tim_lv_tick()
{
lv_tick_inc(1); // lvgl 的 1ms 心跳
}
添加lvgl相关头文件,配置1ms定时器,定时调用 lv_tick_inc(1) 函数,lvgl配置初始化,调用 lv_demo_music() 进行测试,while(1)死循环中放入lv_task_handler()
使用lvgl的demo需要从lv_conf.h函数中打开相关配置,否则编译会不通过
找到lv_conf.h文件,在文件最后几行,把music这个demo的相关配置打开
同时music demo会用到12号和16号字体,lv_conf.h文件中默认是关闭的,我们需要把它打开
程序测试结果: