STM32F4xx 移植 LVGL8

STM32F407ZGT6 移植 LVGL8

目录

  1. 移植环境
  2. 工程准备
  3. 移植lvgl
  4. 测试
  5. 工程源码

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工程中有demosexamples两个文件夹,这两个是一些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文件中默认是关闭的,我们需要把它打开
在这里插入图片描述

程序测试结果:
在这里插入图片描述

工程源码

Github源码地址

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值