LittleVGL学习笔记(1)—获取源码实现仿真并移植到STM32
一、获取源码
注意,以下选用的littleVGL 版本为:v7.7.0
提前安装好 Visual Studio 2019
安装好 keil MDK
-
在github 上获取源码:https://github.com/lvgl/lvgl.git -
获取demo源码:https://github.com/lvgl/lv_demos.git -
获取littleVGL 驱动源码:https://github.com/lvgl/lv_drivers.git -
获取Visual Studio 仿真工程源码:https://github.com/lvgl/lv_sim_visual_studio.git
如图:
二、在visual Studio 上实现仿真
- 将 lv_demos-7.7.0 文件夹下的所有文件拷贝到 lv_sim_visual_studio-7.7.0\visual_studio_2017_sdl\lv_examples中
- 将lv_drivers-7.7.0文件夹下的所有文件拷贝到lv_sim_visual_studio-7.7.0\visual_studio_2017_sdl\lv_drivers中
- 将lvgl-7.7.0文件夹下的所有文件拷贝到lv_sim_visual_studio-7.7.0\visual_studio_2017_sdl\lvgl中
- 双击打开 lv_sim_visual_studio-7.7.0文件夹下的lv_sim_visual_studio_sdl.sln
如图: 5. 运行示例代码
如图:
效果如图:
三、移植littleVGL 到STM32上
注意:本人使用的是STM32F103VCT6平台
- 在整个工程文件目录下新建GUI、GUI_APP文件夹
如图: - 在GUI 文件夹下新建三个文件夹:lv_drivers、lv_examples、lvg(个人习惯)
如图: - 将lvgl-7.7.0\lvgl-7.7.0\examples\porting中的所有文件拷贝到上一步的lv_drivers中,并将后面的 _template 删除(个人习惯)
如图: - 将 E:\01.MCU\05.GUI\sim\lvgl-7.7.0\lvgl-7.7.0\src中所有文件拷贝到第二步中的 lvg文件夹中。
如图: - 将 lv_demos-7.7.0 文件夹中的文件全部拷贝第二步中的lv_examples文件夹中。
如图: - 在keil 工程目录中新建三个文件分支(如图1),并把 GUI\lvg\src下的文件的C文件全部添加到GUI分组下(如图2)。
图1: 图2: - 把 lv_examples下的 lv_ex_conf_template.h拷贝到 GUI目录下(图1),
把lvg文件目录下的lv_conf_template.h拷贝到GUI目录下(图2)。并改为如图3所示。
图1: 图2: 图 3: 8. 在GUI_Drives 分组下添加 lv_drives文件夹中的 lv_port_disp.c(图1),并打开lv_port_disp.c文件,使能文件(图2),往下滑,在 ==lv_port_disp_init(void)==函数下选择一个缓存方案(如图3),我选择方案1,继续往下滑,找到 ==static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)==函数添加液晶的打点函数(如图4) 图1: 图2: 图3: 图4:
-
接下来就是添加路劲了 如图: -
经过以上几步就算移植完成了(比较啰嗦),接下来是配置littleVGL,打开工程中GUI目录下的lv_conf.h文件(只要能打开啥软件都可以),选择使能或不使能相关功能(如图2),我的配置源码在后面的附录。 图1: 图2: -
添加littleVGL节拍,这里通过定时器实现,时间1ms 如图: -
接下来打开 GUI\lv_examples\src\lv_ex_widgets\lv_ex_keyboard文件下的 lv_ex_keyboard_1.c文件(如图1),拷贝里面的代码(如图2),将拷贝的代码粘贴到main 函数下(如图3),并初始化液晶定时器等。
注意: 我这里为了方便演示,不是很规范,规范一点就把.c文件拷贝到GUI_APP文件夹下,并在keil工程中添加到GUI_APP分组下。
图1: 图2: 图3:
- 编译下载到STM32板子,效果如图,OK
总结
通过移植发现各个版本之间还是有一定的差距,不过差距都不是很大。 之前我把littleVGL移植到STM32 HAL库的工程,一个很简单的Demo都爆空间不足,后来我改用标准库后就完美结局空间不足的尴尬局面,不难发现,如果使能了全部控件后,对MCU FLash 是个不小的考验。
附录
lv_conf.h 源码
```c
#if 1
#ifndef LV_CONF_H
#define LV_CONF_H
#include <stdint.h>
#define LV_HOR_RES_MAX (480)
#define LV_VER_RES_MAX (320)
#define LV_COLOR_DEPTH 16
#define LV_COLOR_16_SWAP 0
#define LV_COLOR_SCREEN_TRANSP 0
#define LV_COLOR_TRANSP LV_COLOR_LIME
#define LV_ANTIALIAS 1
#define LV_DISP_DEF_REFR_PERIOD 30
#define LV_DPI 130
#define LV_DISP_SMALL_LIMIT 30
#define LV_DISP_MEDIUM_LIMIT 50
#define LV_DISP_LARGE_LIMIT 70
typedef int16_t lv_coord_t;
#define LV_MEM_CUSTOM 0
#if LV_MEM_CUSTOM == 0
# define LV_MEM_SIZE (16U * 1024U)
# define LV_MEM_ATTR
# define LV_MEM_ADR 0
# define LV_MEM_AUTO_DEFRAG 1
#else
# define LV_MEM_CUSTOM_INCLUDE <stdlib.h>
# define LV_MEM_CUSTOM_ALLOC malloc
# define LV_MEM_CUSTOM_FREE free
#endif
#define LV_MEMCPY_MEMSET_STD 0
#define LV_ENABLE_GC 0
#if LV_ENABLE_GC != 0
# define LV_GC_INCLUDE "gc.h"
# define LV_MEM_CUSTOM_REALLOC your_realloc
# define LV_MEM_CUSTOM_GET_SIZE your_mem_get_size
#endif
#define LV_INDEV_DEF_READ_PERIOD 30
#define LV_INDEV_DEF_DRAG_LIMIT 10
#define LV_INDEV_DEF_DRAG_THROW 10
#define LV_INDEV_DEF_LONG_PRESS_TIME 400
#define LV_INDEV_DEF_LONG_PRESS_REP_TIME 100
#define LV_INDEV_DEF_GESTURE_LIMIT 50
#define LV_INDEV_DEF_GESTURE_MIN_VELOCITY 3
#define LV_USE_ANIMATION 1
#if LV_USE_ANIMATION
typedef void * lv_anim_user_data_t;
#endif
#define LV_USE_SHADOW 1
#if LV_USE_SHADOW
#define LV_SHADOW_CACHE_SIZE 0
#endif
#define LV_USE_OUTLINE 1
#define LV_USE_PATTERN 1
#define LV_USE_VALUE_STR 1
#define LV_USE_BLEND_MODES 1
#define LV_USE_OPA_SCALE 1
#define LV_USE_IMG_TRANSFORM 1
#define LV_USE_GROUP 1
#if LV_USE_GROUP
typedef void * lv_group_user_data_t;
#endif
#define LV_USE_GPU 0
#define LV_USE_GPU_STM32_DMA2D 0
#define LV_GPU_DMA2D_CMSIS_INCLUDE
#define LV_USE_GPU_NXP_PXP 0
#define LV_USE_GPU_NXP_PXP_AUTO_INIT 0
#define LV_USE_GPU_NXP_VG_LITE 0
#define LV_USE_FILESYSTEM 0
#if LV_USE_FILESYSTEM
typedef void * lv_fs_drv_user_data_t;
#endif
#define LV_USE_USER_DATA 0
#define LV_USE_PERF_MONITOR 0
#define LV_USE_API_EXTENSION_V6 1
#define LV_USE_API_EXTENSION_V7 1
#define LV_IMG_CF_INDEXED 1
#define LV_IMG_CF_ALPHA 1
#define LV_IMG_CACHE_DEF_SIZE 1
typedef void * lv_img_decoder_user_data_t;
#define LV_BIG_ENDIAN_SYSTEM 0
#define LV_ATTRIBUTE_TICK_INC
#define LV_ATTRIBUTE_TASK_HANDLER
#define LV_ATTRIBUTE_FLUSH_READY
#define LV_ATTRIBUTE_MEM_ALIGN_SIZE
#define LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_LARGE_CONST
#define LV_ATTRIBUTE_FAST_MEM
#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning
#define LV_ATTRIBUTE_DMA
#define LV_TICK_CUSTOM 0
#if LV_TICK_CUSTOM == 1
#define LV_TICK_CUSTOM_INCLUDE "Arduino.h"
#define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis())
#endif
typedef void * lv_disp_drv_user_data_t;
typedef void * lv_indev_drv_user_data_t;
#define LV_USE_LOG 0
#if LV_USE_LOG
# define LV_LOG_LEVEL LV_LOG_LEVEL_WARN
# define LV_LOG_PRINTF 0
#endif
#define LV_USE_DEBUG 1
#if LV_USE_DEBUG
#define LV_USE_ASSERT_NULL 1
#define LV_USE_ASSERT_MEM 1
#define LV_USE_ASSERT_MEM_INTEGRITY 0
#define LV_USE_ASSERT_STR 0
#define LV_USE_ASSERT_OBJ 0
#define LV_USE_ASSERT_STYLE 0
#endif
#define LV_FONT_MONTSERRAT_8 0
#define LV_FONT_MONTSERRAT_10 0
#define LV_FONT_MONTSERRAT_12 0
#define LV_FONT_MONTSERRAT_14 1
#define LV_FONT_MONTSERRAT_16 0
#define LV_FONT_MONTSERRAT_18 0
#define LV_FONT_MONTSERRAT_20 0
#define LV_FONT_MONTSERRAT_22 0
#define LV_FONT_MONTSERRAT_24 0
#define LV_FONT_MONTSERRAT_26 0
#define LV_FONT_MONTSERRAT_28 0
#define LV_FONT_MONTSERRAT_30 0
#define LV_FONT_MONTSERRAT_32 0
#define LV_FONT_MONTSERRAT_34 0
#define LV_FONT_MONTSERRAT_36 0
#define LV_FONT_MONTSERRAT_38 0
#define LV_FONT_MONTSERRAT_40 0
#define LV_FONT_MONTSERRAT_42 0
#define LV_FONT_MONTSERRAT_44 0
#define LV_FONT_MONTSERRAT_46 0
#define LV_FONT_MONTSERRAT_48 0
#define LV_FONT_MONTSERRAT_12_SUBPX 0
#define LV_FONT_MONTSERRAT_28_COMPRESSED 0
#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0
#define LV_FONT_SIMSUN_16_CJK 0
#define LV_FONT_UNSCII_8 0
#define LV_FONT_CUSTOM_DECLARE
#define LV_FONT_FMT_TXT_LARGE 0
#define LV_USE_FONT_COMPRESSED 1
#define LV_USE_FONT_SUBPX 1
#if LV_USE_FONT_SUBPX
#define LV_FONT_SUBPX_BGR 0
#endif
typedef void * lv_font_user_data_t;
#define LV_USE_THEME_EMPTY 1
#define LV_USE_THEME_TEMPLATE 1
#define LV_USE_THEME_MATERIAL 1
#define LV_USE_THEME_MONO 1
#define LV_THEME_DEFAULT_INCLUDE <stdint.h>
#define LV_THEME_DEFAULT_INIT lv_theme_material_init
#define LV_THEME_DEFAULT_COLOR_PRIMARY lv_color_hex(0x01a2b1)
#define LV_THEME_DEFAULT_COLOR_SECONDARY lv_color_hex(0x44d1b6)
#define LV_THEME_DEFAULT_FLAG LV_THEME_MATERIAL_FLAG_LIGHT
#define LV_THEME_DEFAULT_FONT_SMALL &lv_font_montserrat_14
#define LV_THEME_DEFAULT_FONT_NORMAL &lv_font_montserrat_14
#define LV_THEME_DEFAULT_FONT_SUBTITLE &lv_font_montserrat_14
#define LV_THEME_DEFAULT_FONT_TITLE &lv_font_montserrat_14
#define LV_TXT_ENC LV_TXT_ENC_UTF8
#define LV_TXT_BREAK_CHARS " ,.;:-_"
#define LV_TXT_LINE_BREAK_LONG_LEN 0
#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3
#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3
#define LV_TXT_COLOR_CMD "#"
#define LV_USE_BIDI 0
#if LV_USE_BIDI
#define LV_BIDI_BASE_DIR_DEF LV_BIDI_DIR_AUTO
#endif
#define LV_USE_ARABIC_PERSIAN_CHARS 0
#define LV_SPRINTF_CUSTOM 0
#if LV_SPRINTF_CUSTOM
# define LV_SPRINTF_INCLUDE <stdio.h>
# define lv_snprintf snprintf
# define lv_vsnprintf vsnprintf
#else
# define LV_SPRINTF_DISABLE_FLOAT 1
#endif
#if LV_USE_USER_DATA
typedef void * lv_obj_user_data_t;
#define LV_USE_USER_DATA_FREE 0
#if LV_USE_USER_DATA_FREE
# define LV_USER_DATA_FREE_INCLUDE "something.h"
# define LV_USER_DATA_FREE (user_data_free)
#endif
#endif
#define LV_USE_OBJ_REALIGN 1
#define LV_USE_EXT_CLICK_AREA LV_EXT_CLICK_AREA_TINY
#define LV_USE_ARC 1
#define LV_USE_BAR 1
#define LV_USE_BTN 1
#define LV_USE_BTNMATRIX 1
#define LV_USE_CALENDAR 1
#if LV_USE_CALENDAR
# define LV_CALENDAR_WEEK_STARTS_MONDAY 0
#endif
#define LV_USE_CANVAS 1
#define LV_USE_CHECKBOX 1
#define LV_USE_CHART 1
#if LV_USE_CHART
# define LV_CHART_AXIS_TICK_LABEL_MAX_LEN 256
#endif
#define LV_USE_CONT 1
#define LV_USE_CPICKER 1
#define LV_USE_DROPDOWN 1
#if LV_USE_DROPDOWN != 0
# define LV_DROPDOWN_DEF_ANIM_TIME 200
#endif
#define LV_USE_GAUGE 1
#define LV_USE_IMG 1
#define LV_USE_IMGBTN 1
#if LV_USE_IMGBTN
# define LV_IMGBTN_TILED 0
#endif
#define LV_USE_KEYBOARD 1
#define LV_USE_LABEL 1
#if LV_USE_LABEL != 0
# define LV_LABEL_DEF_SCROLL_SPEED 25
# define LV_LABEL_WAIT_CHAR_COUNT 3
# define LV_LABEL_TEXT_SEL 0
# define LV_LABEL_LONG_TXT_HINT 0
#endif
#define LV_USE_LED 1
#if LV_USE_LED
# define LV_LED_BRIGHT_MIN 120
# define LV_LED_BRIGHT_MAX 255
#endif
#define LV_USE_LINE 1
#define LV_USE_LIST 1
#if LV_USE_LIST != 0
# define LV_LIST_DEF_ANIM_TIME 100
#endif
#define LV_USE_LINEMETER 1
#if LV_USE_LINEMETER
# define LV_LINEMETER_PRECISE 1
#endif
#define LV_USE_OBJMASK 1
#define LV_USE_MSGBOX 1
#define LV_USE_PAGE 1
#if LV_USE_PAGE != 0
# define LV_PAGE_DEF_ANIM_TIME 400
#endif
#define LV_USE_SPINNER 1
#if LV_USE_SPINNER != 0
# define LV_SPINNER_DEF_ARC_LENGTH 60
# define LV_SPINNER_DEF_SPIN_TIME 1000
# define LV_SPINNER_DEF_ANIM LV_SPINNER_TYPE_SPINNING_ARC
#endif
#define LV_USE_ROLLER 1
#if LV_USE_ROLLER != 0
# define LV_ROLLER_DEF_ANIM_TIME 200
# define LV_ROLLER_INF_PAGES 7
#endif
#define LV_USE_SLIDER 1
#define LV_USE_SPINBOX 1
#define LV_USE_SWITCH 1
#define LV_USE_TEXTAREA 1
#if LV_USE_TEXTAREA != 0
# define LV_TEXTAREA_DEF_CURSOR_BLINK_TIME 400
# define LV_TEXTAREA_DEF_PWD_SHOW_TIME 1500
#endif
#define LV_USE_TABLE 1
#if LV_USE_TABLE
# define LV_TABLE_COL_MAX 12
# define LV_TABLE_CELL_STYLE_CNT 4
#endif
#define LV_USE_TABVIEW 1
# if LV_USE_TABVIEW != 0
# define LV_TABVIEW_DEF_ANIM_TIME 300
#endif
#define LV_USE_TILEVIEW 1
#if LV_USE_TILEVIEW
# define LV_TILEVIEW_DEF_ANIM_TIME 300
#endif
#define LV_USE_WIN 1
#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)
# define _CRT_SECURE_NO_WARNINGS
#endif
#endif
#endif
|