2024年最新LVGL学习 stm32f407-board-lvgl v8(1),2024年最新java高频面试题及答案
总结
秋招即将开始,校招的朋友普遍是缺少项目经历的,所以底层逻辑,基础知识要掌握好!
而一般的社招,更是神仙打架。特别强调,项目经历不可忽视;几乎简历上提到的项目都会被刨根问底,所以项目应用的技术要熟练,底层原理必须清楚。
这里给大家提供一份汇集各大厂面试高频核心考点前端学习资料。涵盖 HTML,CSS,JavaScript,HTTP,TCP协议,浏览器,Vue框架,算法等高频考点238道(含答案)!
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
资料截图 :



高级前端工程师必备资料包

* The buffer has to be greater than 1 display row
*
* There are 3 buffering configurations:
* 1. Create ONE buffer:
* LVGL will draw the display’s content here and writes it to your display
*
* 2. Create TWO buffer:
* LVGL will draw the display’s content to a buffer and writes it your display.
* You should use DMA to write the buffer’s content to the display.
* It will enable LVGL to draw the next part of the screen to the other buffer while
* the data is being sent form the first buffer. It makes rendering and flushing parallel.
*
* 3. Double buffering
* Set 2 screens sized buffers and set disp_drv.full_refresh = 1.
* This way LVGL will always provide the whole rendered screen in flush\_cb
* and you only need to change the frame buffer’s address.
*/
/\* Example for 1) \*/
static lv\_disp\_draw\_buf\_t draw_buf_dsc_1;
static lv\_color\_t buf_1[LV_HOR_RES_MAX \* 10]; /\*A buffer for 10 rows\*/
lv\_disp\_draw\_buf\_init(&draw_buf_dsc_1, buf_1, NULL, LV_HOR_RES_MAX \* 10); /\*Initialize the display buffer\*/
/\*-----------------------------------
* Register the display in LVGL
*----------------------------------*/
static lv\_disp\_drv\_t disp_drv; /\*Descriptor of a display driver\*/
lv\_disp\_drv\_init(&disp_drv); /\*Basic initialization\*/
/\*Set up the functions to access to your display\*/
/\*Set the resolution of the display\*/
disp_drv.hor_res = lcddev.width;
disp_drv.ver_res = lcddev.height;
/\*Used to copy the buffer's content to the display\*/
disp_drv.flush_cb = disp_flush;
/\*Set a display buffer\*/
disp_drv.draw_buf = &draw_buf_dsc_1;
/\*Required for Example 3)\*/
//disp\_drv.full\_refresh = 1
/\* Fill a memory array with a color if you have GPU.
* Note that, in lv_conf.h you can enable GPUs that has built-in support in LVGL.
* But if you have a different GPU you can use with this callback.*/
//disp_drv.gpu_fill_cb = gpu_fill;
/\*Finally register the driver\*/
lv\_disp\_drv\_register(&disp_drv);
}
/**********************
* STATIC FUNCTIONS
**********************/
/*Initialize your display and the required peripherals.*/
//static void disp_init(void)
//{
// /*You code here*/
//}
volatile bool disp_flush_enabled = true;
/* Enable updating the screen (the flushing process) when disp_flush() is called by LVGL
*/
void disp_enable_update(void)
{
disp_flush_enabled = true;
}
/* Disable updating the screen (the flushing process) when disp_flush() is called by LVGL
*/
void disp_disable_update(void)
{
disp_flush_enabled = false;
}
/*Flush the content of the internal buffer the specific area on the display
*You can use DMA or any hardware acceleration to do this operation in the background but
*‘lv_disp_flush_ready()’ has to be called when finished.*/
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
LCD\_Color\_Fill(area->x1,area->y1,area->x2,area->y2,(u16\*)color_p);
lv\_disp\_flush\_ready(disp_drv);
}
#else /*Enable this file at the top*/
/*This dummy typedef exists purely to silence -Wpedantic.*/
typedef int keep_pedantic_happy;
#endif
基本上只要修改disp\_flush函数,不同的屏幕显示接口移植
修改indev代码,配置好触摸屏驱动
/**
* @file lv_port_indev_templ.c
*
*/
/*Copy this file as “lv_port_indev.c” and set this value to “1” to enable content*/
#if 1
/*********************
* INCLUDES
*********************/
#include “lv_port_indev.h”
#include “…/lvgl.h”
#include “touch.h”
/*********************
* DEFINES
*********************/
/**********************
* TYPEDEFS
**********************/
/**********************
* STATIC PROTOTYPES
**********************/
static void touchpad_init(void);
static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
static bool touchpad_is_pressed(void);
static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y);
/**********************
* STATIC VARIABLES
**********************/
lv_indev_t * indev_touchpad;
static int32_t encoder_diff;
static lv_indev_state_t encoder_state;
/**********************
* MACROS
**********************/
/**********************
* GLOBAL FUNCTIONS
**********************/
void lv_port_indev_init(void)
{
static lv_indev_drv_t indev_drv;
/\*------------------
* Touchpad
* -----------------*/
/\*Initialize your touchpad if you have\*/
touchpad\_init();
/\*Register a touchpad input device\*/
lv\_indev\_drv\_init(&indev_drv);
indev_drv.type = LV_INDEV_TYPE_POINTER;
indev_drv.read_cb = touchpad_read;
indev_touchpad = lv\_indev\_drv\_register(&indev_drv);
/*------------------
* Touchpad
* -----------------*/
/*Initialize your touchpad*/
static void touchpad_init(void)
{
/*Your code comes here*/
tp_dev.init();
if (0 == (tp_dev.touchtype & 0x80))
{
TP_Adjust();
TP_Save_Adjdata();
}
}
/*Will be called by the library to read the touchpad*/
static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
static lv_coord_t last_x = 0;
static lv_coord_t last_y = 0;
/\*Save the pressed coordinates and the state\*/
if(touchpad\_is\_pressed())
{
touchpad_get_xy(&last_x, &last_y);
data->state = LV_INDEV_STATE_PR;
}
else {
data->state = LV_INDEV_STATE_REL;
}
/\*Set the last pressed coordinates\*/
data->point.x = last_x;
data->point.y = last_y;
}
/*Return true is the touchpad is pressed*/
static bool touchpad_is_pressed(void)
{
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)
{
(*x) = tp_dev.x[0];
(*y) = tp_dev.y[0];
}
#else /*Enable this file at the top*/
/*This dummy typedef exists purely to silence -Wpedantic.*/
typedef int keep_pedantic_happy;
#endif
10. 注意:移植 LVGL 必须开启 C99 模式

#### 主函数配置
参考实际工程的东西,这里的许多的头文件包含,全部在main.h中
int main(void)
{
Hareware_Iint();
printf(“Hareware_Iint [OK] \r\n”);
lv\_init(); // lvgl系统初始化
lv\_port\_disp\_init(); // lvgl显示接口初始化,放在lv\_init()的后面
lv\_port\_indev\_init(); // lvgl输入接口初始化,放在lv\_init()的后面
//lv\_example\_event\_1();
//lv\_example\_get\_started\_3();
//lv\_example\_anim\_timeline\_1();
//lv\_demo\_benchmark();
//lv\_example\_event\_3();
//lv\_example\_chart\_5();
//lv\_example\_list\_2();
//lv\_example\_roller\_3();
lv\_example\_meter\_1();
while (1)
{
tp_dev.scan(0);
lv\_task\_handler(); // lvgl的事务处理
}
}
### 移植效果




### 实用工具 | GUI-Guider的使用分享
[工具使用教程文章链接]( )
GUI Guider是恩智浦为LVGL开发了一个上位机GUI设计工具,可以通过拖放控件的方式设计LVGL GUI页面,加速GUI的设计。
设计完成的GUI页面可以在PC上仿真运行,确认设计完毕之后可以生成C代码,再整合到MCU项目中。

具体使用以后再说,先看看效果
lv_ui guider_ui;
int main(void)
{
Hareware_Iint();
printf(“Hareware_Iint [OK] \r\n”);
lv\_init(); // lvgl系统初始化
lv\_port\_disp\_init(); // lvgl显示接口初始化,放在lv\_init()的后面
lv\_port\_indev\_init(); // lvgl输入接口初始化,放在lv\_init()的后面
//lv\_example\_event\_1();
//lv\_example\_get\_started\_3();
最后
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
❤️ 谢谢支持,喜欢的话别忘了 关注、点赞哦。
初始化,放在lv_init()的后面
lv_port_indev_init(); // lvgl输入接口初始化,放在lv_init()的后面
//lv_example_event_1();
//lv_example_get_started_3();
最后
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
❤️ 谢谢支持,喜欢的话别忘了 关注、点赞哦。
[外链图片转存中…(img-x9v8tj40-1715740387000)]
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)