参考正点原子教程

一、移植前的准备

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.工程新建文件夹,按此结构建文件夹,不用改头文件的引用

luajit 移植到 stm32_luajit 移植到 stm32


将src,examples,lv_conf_template.h,lvgl.h拷至lvgl文件夹中;

2.将配置文件lv_conf_template.h重命名为lv_conf.h;

3.将examples中除porting文件夹,其他全部删除

luajit 移植到 stm32_stm32_02


luajit 移植到 stm32_单片机_03


4.将demos文件夹拷至GUI_APP文件夹中

luajit 移植到 stm32_嵌入式硬件_04

2.2 添加lvgl到工程中

1.添加lvgl源码,按下列目录添加到工程中。

luajit 移植到 stm32_stm32_05


luajit 移植到 stm32_stm32_06


2.添加头文件路径

luajit 移植到 stm32_嵌入式硬件_07


3.编译测试是否文件添加成功。

有几千个报错,需要打开C99编译

luajit 移植到 stm32_stm32_08


luajit 移植到 stm32_嵌入式硬件_09

2.3 修改lvgl配置文件

lv_conf.h,条件编译指令#if 0修改成#if 1

luajit 移植到 stm32_嵌入式硬件_10

2.4 修改适配底层屏幕驱动

修改lv_port_disp.c文件。

(1)条件编译指令#if 0修改成#if 1,lv_port_disp.h文件也要将条件编译打开

luajit 移植到 stm32_luajit 移植到 stm32_11


(2)包含输出设备驱动头文件

luajit 移植到 stm32_stm32_12


(3)修改 lv_port_disp_init 函数,配置图形数据缓冲模式,设置屏幕尺寸(默认横屏):

第一种缓冲模式,缓冲区为一个80010
第二种缓冲模式,缓冲区为两个800
10

第三种缓冲模式,缓冲区为两个800*480

luajit 移植到 stm32_初始化_13


luajit 移植到 stm32_stm32_14


(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文件也要将条件编译打开

包含输出设备驱动头文件

luajit 移植到 stm32_嵌入式硬件_15


(2)屏蔽掉lv_port_indev.c中lv_port_indev_init函数里关于鼠标、键盘、编码器等代码,只保留触摸屏部分的代码

luajit 移植到 stm32_stm32_16


(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)添加头文件

luajit 移植到 stm32_单片机_17


(3)在定时器中断回调中调用

luajit 移植到 stm32_stm32_18


(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文件添加到工程

luajit 移植到 stm32_单片机_19


(2)添加头文件

luajit 移植到 stm32_单片机_20


(3)lv_conf.h中打开宏定义

luajit 移植到 stm32_luajit 移植到 stm32_21


(4)main.c中添加调用

luajit 移植到 stm32_嵌入式硬件_22


(5)编译报错

luajit 移植到 stm32_初始化_23


解决方法,lv_conf.h中找到相应字体的宏定义设置为1即可

luajit 移植到 stm32_stm32_24


(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下载发现屏幕亮但是不显示,修改栈的大小

luajit 移植到 stm32_单片机_25


3、keil屏蔽警告的方法

luajit 移植到 stm32_单片机_26