参考正点原子教程
一、移植前的准备
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
第二种缓冲模式,缓冲区为两个80010
第三种缓冲模式,缓冲区为两个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