stm32移植LVGL

1. LVGL简介

LVGL是一个免费的开源图形库,提供创建具有易于使用的图形元素、漂亮的视觉效果和低内存占用的嵌入式GUI。

 

2. LVGL移植要求

 MCU的要求
  a.微控制器:16、32 或64 位微控制器或处理器
  b.主控频率(Hz):> 16 MHz 时钟速度
  c.Flash/ROM:>64 kB,如果使用非常多的部件(推荐> 180 kB)
  d.内存(RAM):
    静态 SRAM:~2 kB,取决于使用的功能和对象类型
    堆栈:>2kB(推荐>8 kB)
    动态数据(堆):>4 KB (如果使用多个对象,建议>32 kB)
    显示缓冲区:>“水平分辨率”像素(推荐 >10*“水平分辨率”)
    MCU (RAM)或外部存储器分配的一个帧缓冲区

 显示屏的要求
    ①具有8/16/24/32位色深的显示屏。
    ② HDMI 端口的显示器。
    ③ 小型单色显示器。
    ④灰度显示。
    ⑤ LED 矩阵。
    ⑥其它可以控制像素颜色/状态的显示器。

3.LVGL源码下载与介绍

https://github.com/lvgl/lvgl/

demos:LVGL提供的综合例程源码
docs:LVGL文献,主要说明LVGL每个部件的使用方法
env support:环境的支持(MDK、ESP、RTThread)
examples:LVGL例程源码和LVGL输入设备驱动,显示屏驱动文件
scripts:LVGL手稿(与MicroPython有关)
src:LVGL源文件(LVGL部件源码、第三方库)
tests:官方人员的测试代码,这个文件夹用户无需了解
lv_conf_template.h:LVGL的剪裁文件
lvgl.h:LVGL包含的头文件

examples文件夹中:
anim:LVGL 动画例程实例
arduino:开源电子平台(不需要了解)
assets:图片资源
event:LVGL 事件机制实例
get_started:LVGL 获取状态实例
layouts:LVGL 布局实例(flex/grid)
libs:LVGL 移植第三方库实例
others:LVGL 其他测试
porting:LVGL 输入设备驱动和文件系统驱动以及显示器驱动
scroll:LVGL 滚动实例
styles:LVGL 对象样式实例
widgets:LVGL 部件实例

src文件夹:
core:LVGL核心源码(事件、组、对象、坐标、样式、主题等)
draw:LVGL绘画驱动(图片,解码、DMA2D、圆、线、圆弧、和文本等)
extra:LVGL额外的文件(布局、第三方库、其他测试、主题以及部件)
font:LVGL字库
gpu:LVGL针对图形加速(该文件夹的内容在draw文件夹内定义)
hal:硬件抽象层(显示驱动程序、输入设备程序以及提供LVGL系统滴答)
misc:主要描述LVGL其他定义(动画、内存管理、日志等等文件)
widgets:LVGL基础部件

 

无操作系统移植:
1.移植准备工作
https://github.com/lvgl/lvgl/
找到lv_conf_template. h重命名为lv_conf. h->打开 lv_conf. h 文件,修改条件编译指令#if 0改为#if 1->保留examples、src、lv_conf.h、lvgl.h文件夹,其他的全删除->打开examples文件夹,保留porting文件夹,其他的全删除
2. 向工程添加文件
文件夹命名,创建Middlewares->

在lvgl文件夹中存放examples、src、lv_conf.h、lvgl.h文件->向工程添加文件:“品”新建组Middlewares/lvgl/examples/porting、Middlewares/lvgl/src/core、Middlewares/lvgl/src/draw、Middlewares/lvgl/src/extra、Middlewares/lvgl/src/font、Middlewares/lvgl/src/gpu、Middlewares/lvgl/src/hal、Middlewares/lvgl/src/misc、Middlewares/lvgl/src/widgets、Middlewares/LVGL/GUI_APP的10个组->添加.c文件:core、font、hal、misc、widgets同名,draw添加sw文件夹与其他.c,extra除了libs文件夹外都要添加,gpu添加draw-stm32_dma2d与draw-sdl,examples/porting添加porting文件夹中lv_port_disp_template和lv_port_indev_template->
添加头文件路径:“魔术棒”--C/C++--Include Paths->LVGL-GUI,LVGL-GUI-lvgl,LVGL-GUI-lvgl-src,LVGL-GUI-lvgl-examples-porting->
忽略特定的警告:“魔术棒”--C/C++--Misc Controls中填入“-diag_suppress-68-diag_suppress=11l --diag suppress=188--diag suppress-223--diag suppress=546 diag_suppress=-l295”->勾选“C99Mode”
3.修改工程文件
添加VGL时基:添加定时器time.c文件->编译->修改#include "LED.h"为#include "lvgl.h"->修改LED2=!LED2;为lv_tick_inc(1);->在main.c文件中初始化定时器TIM4_Init(999,71);->
修改lvgl采集驱动和触摸驱动->修改显示驱动lv_port_disp_template.c文件->修改输入设备驱动lv_port_indev_template.c文件
4.移植官方例程
将官方例程的demo文件夹复制到LVGL-GUI_APP中->"品"添加文件->“魔术棒”--C/C++--Include Paths指定头文件路径


1. LVGL系统总览

2. lv_conf.h配置文件解析
  2.1颜色设置:颜色深度、屏幕透明等设置
  2.2 内存设置:内存存储器(内/外)、分配内存大小
  2.3 HAL(硬件抽象层)设置:刷新周期、输入设备读取周期以及tick时钟来源
  2.4 特征设置:绘画、加速刷新、日志、断言以及帧率计算功能
  2.5 编译器设置:关于编译器设置
  2.6 字体设置:选择系统字体以及声明自定义字体
  2.7 文本设置:字符编码、文本特性
  2.8 控件设置:使能/失能核心部件
  2.9 特别设置:额外的部件、主题、布局、第三方库等设置
3. LVGL初始化
    第一步:首先调用lv_init初始化LVGL图形库。
    第二步:lv_port_disp_init注册显示驱动程序和lv_port_indev_init输入设备驱动程序。
    第三步:lv_tick_inc(x)在x中断中每毫秒调用一次。
    第四步:lv_timer_handler每隔几毫秒周期调用一次,处理与LVGL相关的任务。
4. 显示设备
lv_disp_draw_buf_t /*绘制缓冲区*/
lv_disp_drv_t /*包含回调函数以与显示交互并操作低级绘图行为*/
    1.显示驱动程序编写:
    缓冲区初始化完成后,lv_disp_drv_t显示驱动程序编写步骤如下:
    第一步:lv_disp_drv_init(&disp_drv)初始化显示设备。
    第二步:字段设置(显示设备分辨率、设置显示缓冲区等等设置)。
    第三步:调用函数lv_disp_drv_register(&disp_drv)注册显示设备。
    4.2 屏幕旋转的步骤:
    ①设置sw_rotate标志设置为1。
    ② 使用旋转函数进行旋转。
    lv_disp_set_rotation(lv_disp_get_default(), LV_DISP_ROT_180) ;
 4.3显示接口API函数
  4.3.1注册显示设备相关函数

  注册显示设备相关函数
        lv_disp_drv_init():初始化显示驱动程序
        lv_disp_draw_buf_init():初始化显示缓冲区
        lv_disp_drv_register():注册一个初始化的显示驱动程序
        lv_disp_drv_update():在运行时更新驱动程序
        lv_disp_remove():移除显示器
        lv_disp_set_default():设置默认显示设备
        lv_disp_get_default():获取默认显示设备
        lv_disp_get_hor_res():获取显示器的水平分辨率
        lv_disp_get_ver_res():获取显示器的垂直分辨率
        lv_disp_get_physical_hor_res():获取显示器的完整/物理水平分辨率
        lv_disp_get_physical_ver_res():显示器的完整/物理垂直分辨率
        lv_disp_get_offset_x():获取完整/物理显示的水平偏移
        lv_disp_get_offset_y():从完整/物理显示获取垂直偏移
        lv_disp_get_antialiasing():获取是否为显示器启用了抗锯齿功能
        lv_disp_get_dpi():获取显示器的 DPI
  屏幕旋转 API 函数
        lv_disp_set_rotation():设置此显示的旋转
        lv_disp_get_rotation():获取此显示器的当前旋转
  其他显示接口 API 函数
        lv_disp_get_next():获取下一个显示设备
        lv_disp_get_draw_buf:获取显示器的内部缓冲区

5. 输入设备
LVGL输入设备是在lv_port_indev_template.c文件中定义的
 5.1 触摸设备
 5.2 光标设备
 5.3输入设备相关API函数

        lv_indev_drv_init():使用默认值初始化输入设备驱动程序
        lv_indev_drv_register():注册一个初始化的输入设备驱动程序
        lv_indev_drv_update():在运行时更新驱动程序
        lv_indev_delete():移除输入设备
        lv_indev_get_next():获取下一个输入设备
        lv_indev_read():从输入设备读取数据

6. LVGL滴答
    LVGL任务处理:要处理 LVGL 的任务或者回调函数,需要 lv_timer_handler 定期调用,如以下方法所示:
    ① main 函数的 while(1)。
    ②定时中断(优先级低于lv_tick_inc) 。
    ③ 定期执行OS任务。
7.LVGL日志
    lv_conf.h文件中找到宏定义LV_USE_LOG置1操作
  ① LV_LOG_LEVEL_TRACE:很多日志提供详细信息。
    ② LV_LOG_LEVEL_INFO:记录重要事件。
    ③ LV_LOG_LEVEL_WARN:记录是否发生了不必要的事情,但没有引起问题。
    ④ LV_LOG_LEVEL_ERROR:唯一关键问题,系统可能会发生故障。
    ⑤ LV_LOG_LEVEL_USER:仅用户消息。
    ⑥ LV_LOG_LEVEL_NONE:不要记录任何内容级别高于设置的日志级别的事件也将记录。

LVGL基础知识:

    1. LVGL对象介绍
    在 LVGL 中,用户界面的基本构建块是对象,也称为小部件。例如:按钮、标签、图片、列表、图表或文本区域等部件,都是简称对象。
  1.1 对象的基本属性(公用属性)
  ① 大小② 父类③ 样式④ 事件⑤ 位置
  lv_obj_set_<widget>_size/pos
  lv_obj_get_<widget>_size/pos
  1. 2 对象的具体属性(私有属性)
  ① 当前值② 最小值和最高值
  1.3 LVGL工作机制
   1.3.1 LVGL父类与子类的区别
   
   1.3.2创建对象与删除对象
    创建对象:lv_obj_t * lv_<widget>_create(lv_obj_t * parent,<other parameters if any>);
    删除对象:
     1. lv obj_del(lv_obj_t * obj)
     2. lv_obj_del_async(lv_obj_t * obj)
     3. lv_obj_clean(lv_obj_t * obj)
     4. lv_obj_del_delayed(lv_obj_t * obj,uint32_t delay_ms)
   1.3.3 LVGL屏幕函数
    (1) 创建屏幕:lv_obj_t * scrl = lv_obj_create(NULL);
    (2)获取活动的屏幕:lv_scr_act
    (3) 加载屏幕:lv_scr_load(scr1) /*加载屏幕*/
    (4)动画加载屏幕: lv_scr_load_anim(scr, transition_type, time, delay, auto_del)
   其他函数
        LV_SCR_LOAD_ANIM_NONE:延时毫秒后立即切换
        LV_SCR_LOAD_ANIM_OVER_LEFT/RIGHT/TOP/BOTTOM:将新屏幕移到给定方向上
        LV_SCR_LOAD_ANIM_MOVE_LEFT/RIGHT/TOP/BOTTOM:将当前屏幕和新屏幕都移至给定方向
        LV_SCR_LOAD_ANIM_FADE_ON:使新屏幕淡入旧屏幕
   1.3.4LVGL图层
    (1)创建对象的顺序
    (2)前台和后台
    ① lv_obj_set_top函数
    ② lv_obj_move_foreground函数
    ③ lv_obj_move_background函数
    (3)LVGL顶层和系统层 lv_obj_add_flag(lv_layer_top(),LV_OBJ_FLAG_CLICKABLE);/*设置可点击*/
    LVGL具有两个特殊的层,分别名为layer_top和layer_sys
    2. LVGL布局介绍
  2.1对象坐标的设置
   像素:
        lv_obj_set_x(obj,10)/*设置对象x轴坐标*/
        lv_obj_set_y(obj,10)/*设置对象y轴坐标*/
        lv_obj_set_pos(obj,10,10)/*设置对象x,y轴坐标 */
   百分比:
        lv_obj_set_x(obj,lv_ct(10))/*设置对象x轴坐标*/
        lv_obj_set_y(obj,lv_pct(10))/*设置对象y轴坐标*/
        lv_obj_set_pos(obj,lv_pct(10),lv_pct(10))/*设置对象x,y轴坐标*/
  2.2对象尺寸设置:
        lv_obj_set_width(obj,200); /*设置对象的宽度*/
        lv_obj_set_height(obj,100); /*设置对象的高度*/
        lvobj_set_size(obj,200,100); /*设置对象的高度和宽度*/
        lv_obj_set_height(obj,lv_pct(100)); /*设置对象的高度为屏幕高度*/
  2.3对象的对齐设置
  对齐的方式主要有:左对齐,右对齐,居中对齐,两端对齐等对齐方式。
  
void lv_obj_align(struct_lv_obj_t*obj,/*要对齐的对象*/
    lv_align_t_  align,/*要对齐的模式*/
    lv_coord_t_ x_ofs,/*要对齐后向x轴偏移量*/
    lv_coord_t y_ofs);/*要对齐后向y轴偏移量*/

 
void lv_obj_align(struct_lv_obj_t * obj,/*要对齐的对象*/
  const struct _lv_obj_t * base, //向谁对齐
    lv_align_t align,/*要对齐的模式*/
    lv_coord_t x_ofs,/*要对齐后向x轴偏移量*/
    lv_coord_t y_ofs);/*要对齐后向y轴偏移量*/
    3. LVGL样式属性(设置外观)
  3.1普通样式设置
     static lv_style_t style_btn; /* 定义样式变量 */
     lv_style_init (&style_btn) ; /* 样式初始化 */
     lv_style_set_bg_color(&style_btn, lv_color_hex(0x115588)); /* 设置背景 */
     lv_style_set_bg_opa (&style_btn, LV_OPA_50); /* 设置背景透明度 */
     lv_style_set_border_width(&style_btn, 2); /* 设置边框的宽度 */
     lv_style_set_border_color(&style_btn, lv_color_black()); /* 设置边框的大小 */
     lv_obj_t * obj = lv_obj_create(lv_scr_act()); /* 创建一个对象 */
     lv_obj_add_style(obj, & style_btn, LV_STATE_DEFAULT) ; /* 设置对象 1 的样式 */
     lv_obj_t * obj1 = lv_obj_create(lv_scr_act()); /* 创建一个对象 1 */
     lv_obj_add_style (obj1, & style_btn, LV_STATE_DEFAULT) ; /* 设置对象 1 的样式 */
     lv_style_set_<property_name>(&style, <value>);
        3.2本地样式设置
        /*创建一个对象*/
        lv_obj* objlv_obj_create(lv_scr_act());
        /*设置对象背景颜色*/
        lv_obj_set_style_bg_color (obj,lv_color_red (),LV_STATE_DEFAULT);
        /*创建一个对象1*/
        lv_obj_t * objl = lv_obj_create(lv_scr_act ())
        /*设置对象1背景颜色*/
        lv_obj_set_style_bg_color (obj1,lv_color_red(),LV_STATE_DEFAULT);
        lv_obj_set_style_<property_name>(obj,<value>,<selector>);
  3.3部件组成部分
        LV_PART_MAIN:像矩形一样的背景
        LV_PART_SCROLLBAR:滚动条
        LV_PART_INDICATOR:指示器,例如滑块、条形图、开关或复选框的复选框
        LV_PART_KNOB:旋转纽
        LV_PART_SELECTED:选择框
        LV_PART_ITEMS:项(表格单元格)
        LV_PART_TICKS:刻度(图表或仪表)
        LV_PART_CURSOR:光标(文本区域或图表)
        LV_PART_CUSTOM_FIRST:添加自定义部件

   3.4部件的状态
        LV_STATE_DEFAULT:正常状态
        LV_STATE_CHECKED:切换或选中
        LV_STATE_FOCUSED:通过键盘或编码器聚焦或通过触摸板/鼠标单击
        LV_STATE_FOCUS_KEY:通过键盘或编码器而不是通过触摸板/鼠标聚焦
        LV_STATE_EDITED:由编码器编辑
        LV_STATE_HOVERED:鼠标悬停(现在不支持)
        LV_STATE_PRESSED:已按下
        LV_STATE_SCROLLED:滚动状态
        LV_STATE_DISABLED:禁用状态
        LV_STATE_USER_1:自定义状态
        LV_STATE_USER_2:自定义状态
        LV_STATE_USER_3:自定义状态
        LV_STATE_USER_4:自定义状态
        /*添加/清除状态*/
        lv_obj_add/clear_state(obj,part,LV_STATE_...)
        /*添加多个状态*/
        lv_obj_add_state(obj,part,LV_STATE_PRESSED | LV_PRESSED_CHECKED)
  例子:
static lv_style_t style_btn;/*定义样式变量*/ 
lv_style_init(&style_btn);/*样式初始化*/ 
/*设置背景*/ 
lv_style_set_bg_color(&style_btn,lv_palette_main(LV_PALETTE_GREEN)); 
/*创建进度条部件*/ 
lv_obj_t*lv slider = lv_slider_create(lv_scr_act()); 
/*居中设置*/ 
lv_obj_center(lv_slider); 
/*正常状态下设置指示器的样式属性*/ 
lv_obj_add_style(lv_slider,&style_btn,LV_PART_INDICATOR | LV_STATE_DEFAULT);
/*创建对比部件*/ 
lv_obj_t* lv_obj1 = lv_slider_create(lv_scr_act()); 
/*向外底下中间对齐*/ 
lv_obj_align_to(lv_objl,lv_obj,LV_ALIGN_OUT_BOTTOM_MID,0,20);


  3.5大小与位置属性(样式属性)
  3.5.1 (width)宽度
  3.5.2 (min_width)最小宽度 lv_obj_set_width
  3.5.3 (max_width)最大宽度
  3.5.4(height )高度
  3.5.5 (min_height )最小高度
  3.5.6 (max_height )最大高度 lv_obj_set_height ()
  3.5.7 X 坐标属性
  3.5.8 Y坐标属性
  3.5.9 (Align)对齐属性
  3.5.10 (transform_width)变换宽度属性
  3.5.11 (transform_height)变换高度属性
  3.5.12 (translate_x)偏移X坐标属性
  3.5.13 (translate_y)偏移Y坐标属性
  3.5.14 (transform_zoom)缩放属性(默认大小256)
  3.5.15 (transform_angle)旋转属性
  3.6填充属性(样式属性)
  3.6.1. (pad_top)顶部填充属性
  3.6.2. (pad-bottom)底部填充属性
  3.6.3. (pad_left)左边填充属性
  3.6.4. (pad_right)右边填充属性
  3.6.5.(pad_row)行之间填充属性
  3.6.6.(pad_column)列之间填充属性
  3.7背景属性(样式属性)
  3.7.1.(bg_color)背景属性
  3.7.2.(bg_opa)背景透明属性(0-255)
  3.7.3 (bg-grad_color)背景梯度颜色属性
  3.7.4 (bg_grad_dir)背景梯度方向属性 LV_GRAD_DIR_NONE/HOR/VER
  3.7.5 (bg_grad_stop)背景梯度起点属性
  3.7.6.(bg_img_src)背景图片源属性
  3.7.7.(bg_img_opa)背景图片透明度属性(0-255)
  3.7.8.(bg_img_recolor)背图片重绘属性
  3.7.9.(bg_img_recolor_opa)背景图片重绘透明属性
  例子

/* 创建图片部件 */
 lv_app_img = lv_img_create (lv_scr_act ()); 
/* 设置图片源 */
 lv_img_set_src(lv_app_img, &image) ; 
/* 居中 */
 lv_obj_center (lv_app_img) ; 
/* 设置图像重着色的强度 */
 lv_obj_set_style_bg_img_recolor_opa (lv_app_img, 255, LV_PART_MAIN) ; 
/*设置一个颜色混合到背景图像 */
 lv_obj_set_style_bg_img_recolor( lv_app_img, lv_color_make (255, 255, 255), LV_STATE_DEFAULT);

  3.7.10. (bg_img_tiled)背景图片平铺属性
  3.8 边框属性(样式属性)
  3.8.1. (border_color)边框颜色
  3.7.2. (border_opa)边框透明度
  3.7.3.(border width)边框宽度
  3.7.4.(border_side)边框内侧
  3.7.5.(border_post)边框绘制
  3.9轮廓属性(样式属性)
  
  3.9.1.(outline_width) 轮廓宽度属性
  3.9.2.(outline_color)轮廓颜色属性
  3.9.3 (outline_opa)轮廓透明度属性
  3.9.4 (outline_pad) 轮廓间隙属性
  3.10阴影属性(样式属性)
  3.10.1. (shadow_width)阴影宽度属性
  3.10.2. (shadow_ofs_x)阴影偏移X轴方向属性
  3.10.3. (shadow_ofs_y)阴影偏移Y轴方向属性
  3.10.4. (shadow_spread)阴影范围属性
  3.10.5. (shadow_color)阴影颜色属性
  3.10.6 (shadow_opa)阴影透明属性
  3.11图片属性(样式属性)
  3.11.1. (img_opa)图片透明度属性
  3.11.2. (ing_recolor)图片重绘属性
  3.11.3. (img_recolor_opa)图片重绘透明属性
  3.12线属性(样式属性)
  3.12.1. (line_width)线的宽度属性
  3.12.2. (line_rounded)线的端点属性
  3.12.3. (line_color)线的颜色属性
  3.12.4. (line_opa)线的透明度属性
  3.13圆弧属性(样式属性)
  3.13.1. (arc_width)圆弧宽度属性
  3.13.2 (arc_rounded)圆弧端点
  3.13.3. (arc_color)圆弧颜色属性
  3.13.4. (arc_opa)圆弧透明度属性
  3.14文本属性(样式属性)
  3.14.1.(text_color)文本颜色属性
  3.14.2.(text_opa)文本透明度属性
  3.14.3.(text_font)文本字体属性
  3.14.4. (text_letter_space)文本字符空间属性
  3.14.5. (text_decor)文装饰属性
  3.14.6. (text_align)文本对齐属性
  3.15其他属性(样式属性)
  3.15.1.(radius)设置圆角的半径属性
  3.15.2.(opa)透明度
  3.15.3. (anim)动画属性
  3.15.4. (anim_time)动画时间属性
  3.15.5. (anim_speed)动画速度属性
  3.15.6.(layout)布局属性
  3.15.7. (base_dir)对象方向属性 LV_BIDI_DIR_LTR/RTL/AUTO
  

posted @ 2024-05-26 16:11  阿Q熊  阅读(1216)  评论(0)    收藏  举报