代码拉取完成,页面将自动刷新
要求 | 说明 |
---|---|
微控制器 | 16、32 、64 位的微控制器或处理器 |
主控频率(Hz) | > 16 MHz 时钟速度 |
Flash/ROM | > 64 kB ,如果使用非常多的部件,推荐 > 180 kB |
内存(RAM) | 8kB(建议配置 24kB) |
源码下载下来后我们先初步的把一些杂乱的无关紧要的东西删一删,如下图所示:
余下的各文件夹和文件的功能如下表所示:
文件/文件夹 | 说明 |
---|---|
demos | LVGL 提供的综合演示源码 |
docs | LVGL 文献,主要说明 LVGL 每个部件的使用方法 |
env_support | 环境的支持(MDK、ESP、RTThread) |
examples | LVGL 例程源码和 LVGL 输入设备驱动,显示屏驱动文件 |
scripts | LVGL 相关脚本工具 |
src | LVGL 源文件(LVGL 部件源码、第三方库) |
tests | 官方人员的测试代码,该文件夹用户无需了解 |
LICENCE.txt | 定义了软件的使用权和限制 |
lv_conf_template.h | LVGL 的配置文件 |
lvgl.h | LVGL 包含的头文件 |
上表中,与 LVGL 移植相关的有 examples 文件夹、src 文件夹、lv_conf_template.h 和 lvgl.h 文件,其他的部分均与移植无关,用户可以选择忽略。接下来我们分别看一下 examples、src 这两个文件夹的文件结构。
该文件夹主要包含 LVGL 部件实例、动画实例、其他第三方库实例以及输入设备和显示器驱动文件等内容,具体如下图所示:
其中只有 porting 文件夹与移植相关,其他文件夹中存放的是各种实例
文件 | 描述 |
---|---|
core | LVGL 核心源码(事件、组、对象、坐标、样式、主题) |
draw | LVGL 绘画驱动(图片、解码、DMA2D、圆、线、圆弧、和文本) |
extra | LVGL 的拓展内容(布局、第三方库、其他测试、主题以及部件) |
font | LVGL 字库 |
gpu | LVGL 针对图形加速 |
hal | 硬件抽象层(显示驱动程序、输入设备程序以及 LVGL 系统滴答) |
misc | 主要描述 LVGL 其他定义(动画、内存管理、日志) |
widgets | LVGL 基础部件 |
移植 LVGL 前需要完成显示驱动和触摸驱动,这在前面的几个章节中我们已经完成了,除此之外我们还需要一个 1ms 的定时器中断,不过 CubeIDE 生成的代码中默认的 systick 就是 1ms 中断,直接使用 1ms 中断吧,省点事。
继续把源码中无用的东西删一删,把 example 文件夹中的 porting 文件夹拷贝出来,然后把整个 example 文件夹全部删除,保留 src 文件夹,将 lv_conf_template.h 文件改名为 lv_conf.h, 其余文件或文件夹全部删掉。具体如下图所示:
porting 文件夹下的文件名也改一下,如下图所示:
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
/* USER CODE BEGIN SysTick_IRQn 1 */
lv_tick_inc(1);
/* USER CODE END SysTick_IRQn 1 */
}
warning: #warning Please define or replace the macro MY_DISP_HOR_RES with the actual screen width, default value 320 is used for now. [-Wcpp]
/*********************
* DEFINES
*********************/
#define MY_DISP_HOR_RES 1024
#define MY_DISP_VER_RES 600
/*Initialize your display and the required peripherals.*/
static void disp_init(void)
{
/*You code here*/
// 点亮背光
HAL_GPIO_WritePin(LCD_BL_GPIO_Port, LCD_BL_Pin, GPIO_PIN_SET);
}
void lv_port_disp_init(void)
{
/*-------------------------
* Initialize your display
* -----------------------*/
disp_init();
/*------------------------------------
* Create a display and set a flush_cb
* -----------------------------------*/
lv_display_t * disp = lv_display_create(MY_DISP_HOR_RES, MY_DISP_VER_RES);
lv_display_set_flush_cb(disp, disp_flush);
/* Example 1
* One buffer for partial rendering*/
static lv_color_t buf_1_1[MY_DISP_HOR_RES * 100]; /*A buffer for 10 rows*/
lv_display_set_buffers(disp, buf_1_1, NULL, sizeof(buf_1_1), LV_DISPLAY_RENDER_MODE_PARTIAL);
// /* Example 2
// * Two buffers for partial rendering
// * In flush_cb DMA or similar hardware should be used to update the display in the background.*/
// static lv_color_t buf_2_1[MY_DISP_HOR_RES * 50];
// static lv_color_t buf_2_2[MY_DISP_HOR_RES * 50];
// lv_display_set_buffers(disp, buf_2_1, buf_2_2, sizeof(buf_2_1), LV_DISPLAY_RENDER_MODE_PARTIAL);
// /* Example 3
// * Two buffers screen sized buffer for double buffering.
// * Both LV_DISPLAY_RENDER_MODE_DIRECT and LV_DISPLAY_RENDER_MODE_FULL works, see their comments*/
// static lv_color_t buf_3_1[MY_DISP_HOR_RES * MY_DISP_VER_RES];
// static lv_color_t buf_3_2[MY_DISP_HOR_RES * MY_DISP_VER_RES];
// lv_display_set_buffers(disp, buf_3_1, buf_3_2, sizeof(buf_3_1), LV_DISPLAY_RENDER_MODE_DIRECT);
}
#include "lcd.h"
lv_display_t* glv_display = NULL;
static void disp_flush(lv_display_t * disp_drv, const lv_area_t * area, uint8_t * px_map)
{
if(disp_flush_enabled)
{
glv_display = disp_drv;
lcd_fill_area_with_pixmap(area->x1, area->y1, area->x2 - area->x1 + 1, area->y2 - area->y1 + 1, (uint16_t *)px_map);
}
/* IMPORTANT!!! 刷新完成通知放到了 LCD 区域填充完成中断(DMA2D 传输完成中断) 中 */
// lv_display_flush_ready(disp_drv);
}
/* LCD 区域填充完成回调 */
#include "lvgl.h"
extern lv_display_t* glv_display;
void lcd_fill_finished(void)
{
lv_display_flush_ready(glv_display);
}
lv_init(); /* lvgl init */
lv_port_disp_init(); /* lvgl 显示接口初始化,放到 lv_init() 之后 */
while(1)
{
static uint32_t cnt_5ms;
if(HAL_GetTick() >= cnt_5ms + 5)
{
cnt_5ms = HAL_GetTick();
lv_timer_handler();
}
}
/*Color depth: 8 (A8), 16 (RGB565), 24 (RGB888), 32 (XRGB8888)*/
#define LV_COLOR_DEPTH 16
/*For big endian systems set to 1*/
#define LV_BIG_ENDIAN_SYSTEM 0
lv_obj_t *label = lv_label_create(lv_scr_act());
lv_label_set_text(label,"Hello!!!");
lv_obj_center(label);
void lv_port_indev_init(void)
{
/*------------------
* Touchpad
* -----------------*/
/*Initialize your touchpad if you have*/
/* 初始化触摸屏 */
touchpad_init();
/*Register a touchpad input device*/
/* 创建一个输入设备 */
indev_touchpad = lv_indev_create();
/* 设置输入设备类型:触摸屏 */
lv_indev_set_type(indev_touchpad, LV_INDEV_TYPE_POINTER);
/* 注册输入设备-绑定触摸坐标读取函数 */
lv_indev_set_read_cb(indev_touchpad, touchpad_read);
}
static void touchpad_init(void)
{
/*Your code comes here*/
touch_init();
}
static bool touchpad_is_pressed(void)
{
/*Your code comes here*/
return !!gTouchPoint.touch_num;
}
static void touchpad_get_xy(int32_t * x, int32_t * y)
{
/*Your code comes here*/
*x = gTouchPoint.tp[0].xPos;
*y = gTouchPoint.tp[0].yPos;
}
lv_obj_t* switch1 = lv_switch_create(lv_scr_act());
lv_obj_center(switch1);
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。