STM32F429移植LVGL8.2.0

参考正点原子教程

一、移植前的准备

1.1 裸机工程

正点原子阿波罗STM32F429的触摸屏实验

1.2 lvgl源码

下载​8.2.0​ 版本:https://github.com/lvgl/lvgl/releases/tag/v8.2.0

二、移植lvgl

2.1 复制lvgl源码到工程中

demos:示例模板代码
src:lvgl源码
examples:lvgl示例和移植文件模板代码
lv_conf_template.h:配置文件模板代码
lvgl.h:lvgl头文件

1.工程新建文件夹,按此结构建文件夹,不用改头文件的引用
在这里插入图片描述
将src,examples,lv_conf_template.h,lvgl.h拷至lvgl文件夹中;
2.将配置文件​​lv_conf_template.h​​重命名为​​lv_conf.h​​;
3.将examples中除porting文件夹,其他全部删除
在这里插入图片描述
在这里插入图片描述
4.将demos文件夹拷至GUI_APP文件夹中
在这里插入图片描述

2.2 添加lvgl到工程中

1.添加lvgl源码,按下列目录添加到工程中。
在这里插入图片描述
在这里插入图片描述
2.添加头文件路径
在这里插入图片描述
3.编译测试是否文件添加成功。
有几千个报错,需要打开C99编译
在这里插入图片描述
在这里插入图片描述

2.3 修改lvgl配置文件

lv_conf.h,条件编译指令#if 0修改成#if 1
在这里插入图片描述

2.4 修改适配底层屏幕驱动

修改​​lv_port_disp.c​​文件。
(1)条件编译指令#if 0修改成#if 1,lv_port_disp.h文件也要将条件编译打开
在这里插入图片描述
(2)包含输出设备驱动头文件
在这里插入图片描述
(3)修改 ​​lv_port_disp_init​​ 函数,配置图形数据缓冲模式,设置屏幕尺寸(默认横屏):
第一种缓冲模式,缓冲区为一个80010
第二种缓冲模式,缓冲区为两个800
10
第三种缓冲模式,缓冲区为两个800*480
在这里插入图片描述
在这里插入图片描述
(4)修改​​disp_init​​函数,初始化屏幕设备,设置横屏:

static void disp_init(void)
{
    /*You code here*/
	LCD_Init();                     //初始化LCD	
    LCD_Display_Dir(1);             //如果是RGB屏的话,则强制设置为横屏显示 这一句还是很重要的,一开始没加,屏幕也没显示    
}

(5)修改​​disp_flush​​函数,配置打点输出:

static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
    /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/
    LCD_Color_Fill(area->x1, area->y1, area->x2, area->y2 , (u16*)color_p);
    lv_disp_flush_ready(disp_drv);
}

2.5 修改屏幕触摸驱动

修改​​lv_port_indev.c​​文件。
(1)条件编译指令#if 0修改成#if 1,lv_port_indev.h文件也要将条件编译打开
包含输出设备驱动头文件
在这里插入图片描述
(2)屏蔽掉lv_port_indev.c中lv_port_indev_init函数里关于鼠标、键盘、编码器等代码,只保留触摸屏部分的代码
在这里插入图片描述
(3)修改​​touchpad_init​​函数,适配触摸初始化,
修改​​touchpad_is_pressed​​函数,配置触摸检测函数
修改​​touchpad_get_xy​​函数,配置坐标获取函数

static void touchpad_init(void)
{
    /*Your code comes here*/
    tp_dev.init();				    //触摸屏初始化 
}
/*Return true is the touchpad is pressed*/
static bool touchpad_is_pressed(void)
{
    /*Your code comes here*/
    tp_dev.scan(0);
    if(tp_dev.sta&TP_PRES_DOWN)
    {
        return true;
    }
    return false;
}
/*Get the x and y coordinates if the touchpad is pressed*/
static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y)
{
    /*Your code comes here*/
    (*x) = tp_dev.x[0];
    (*y) = tp_dev.y[0];
}

2.6 添加lvgl心跳

(1)添加定时器驱动
参考正点原子官方例程定时器中断实验,将TIMER文件夹拷至工程中,并添加相应的头文件
(2)添加头文件
在这里插入图片描述
(3)在定时器中断回调中调用
在这里插入图片描述
(4)初始化定时器
在main.c中添加

TIM3_Init(999,89);

2.7 调用lvgl

(1)包含头文件
(2)初始化定时器,LVGL库,输入输出设备
(3)在while中每隔5s调用一次lv_timer_handler();

#include "timer.h"
#include "lvgl.h"
#include "lv_port_disp_template.h"
#include "lv_port_indev_template.h"

int main(void)
{
    HAL_Init();                     //初始化HAL库   
    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
    delay_init(180);                //初始化延时函数
    uart_init(115200);              //初始化USART
    LED_Init();                     //初始化LED 
    KEY_Init();                     //初始化按键
    SDRAM_Init();                   //初始化SDRAM

    TIM3_Init(999,89);
    lv_init();
    lv_port_disp_init();
    lv_port_indev_init();
    
    while(1)
    {
        lv_timer_handler();
        HAL_Delay(5);    
    }
}

2.8 添加音乐播放demo

(1)Middlewares\LVGL\GUI_APP\demos\music中的所有.c文件添加到工程
在这里插入图片描述
(2)添加头文件
在这里插入图片描述
(3)lv_conf.h中打开宏定义
在这里插入图片描述
(4)main.c中添加调用
在这里插入图片描述
(5)编译报错
在这里插入图片描述
解决方法,lv_conf.h中找到相应字体的宏定义设置为1即可
在这里插入图片描述
(6)编译,下载运行进行测试,可以正常显示

三、注意

1、lv_conf.h

/*Input device read period in milliseconds,触摸灵敏度*/
#define LV_INDEV_DEF_READ_PERIOD 5     /*[ms]*/
/*1: Show CPU usage and FPS count,显示帧率*/
#define LV_USE_PERF_MONITOR 1

2、如果有的demo下载发现屏幕亮但是不显示,修改栈的大小在这里插入图片描述
3、keil屏蔽警告的方法
在这里插入图片描述

四、代码

https://download.csdn.net/download/u010915068/87885694

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值