芯片启动到LVGL初始化完成大体流程如下:

界面增加打印后代码如下:
static void drag_event_handler(lv_event_t * e)
{
lv_obj_t * obj = lv_event_get_target(e);
lv_indev_t * indev = lv_indev_get_act();
if(indev == NULL) return;
lv_point_t vect;
lv_indev_get_vect(indev, &vect);
lv_coord_t x = lv_obj_get_x(obj) + vect.x;
lv_coord_t y = lv_obj_get_y(obj) + vect.y;
lv_obj_set_pos(obj, x, y);
LOG_INFO(lvgl_example, "vect x:%d y:%d\r\n",vect.x,vect.y);
}
/**
* Make an object dragable.
*/
void lv_example_obj_2(void)
{
lv_obj_t * obj;
obj = lv_obj_create(lv_scr_act());
lv_obj_set_size(obj, 150, 100);
lv_obj_add_event_cb(obj, drag_event_handler, LV_EVENT_PRESSING, NULL);
lv_obj_t * label = lv_label_create(obj);
lv_label_set_text(label, "Drag me");
lv_obj_center(label);
}
按下复位键到滑动屏幕打印如下:
[INFO] [lcd] lcd_init start
[INFO] [lcd] lcd_init ok
[INFO] [project] BLE Peripheral
[INFO] [project] Local BDADDR: 0x112233445566
[INFO] [project] All service added
[INFO] [project] Start advertising...
[INFO] [lvgl_demo] vect x:0 y:0
[INFO] [lvgl_demo] vect x:0 y:0
[INFO] [lvgl_demo] vect x:0 y:0
[INFO] [lvgl_demo] vect x:0 y:0
[INFO] [lvgl_demo] vect x:0 y:0
[INFO] [lvgl_demo] vect x:0 y:0
[INFO] [lvgl_demo] vect x:0 y:0
[INFO] [lvgl_demo] vect x:4 y:2
[INFO] [lvgl_demo] vect x:8 y:11
[INFO] [lvgl_demo] vect x:6 y:5
[INFO] [lvgl_demo] vect x:8 y:5
[INFO] [lvgl_demo] vect x:7 y:4
[INFO] [lvgl_demo] vect x:5 y:3
[INFO] [lvgl_demo] vect x:4 y:2
[INFO] [lvgl_demo] vect x:4 y:1
[INFO] [lvgl_demo] vect x:5 y:1
[INFO] [lvgl_demo] vect x:4 y:1
[INFO] [lvgl_demo] vect x:2 y:0
[INFO] [lvgl_demo] vect x:5 y:-1
[INFO] [lvgl_demo] vect x:1 y:0
[INFO] [lvgl_demo] vect x:0 y:-1
[INFO] [lvgl_demo] vect x:1 y:0
[INFO] [lvgl_demo] vect x:0 y:-1
[INFO] [lvgl_demo] vect x:-1 y:-1
验证平台事物图:

视频展示效果如下:
lvgl跟手控件效果
使用lv_demo_widgets这个demo:

LOG打印如下:
LV_LOG_WARN("LV_FONT_MONTSERRAT_24 is not enabled for the widgets demo. Using LV_FONT_DEFAULT instead.");
#ifndef LV_LOG_WARN
# if LV_LOG_LEVEL <= LV_LOG_LEVEL_WARN
# define LV_LOG_WARN(...) _lv_log_add(LV_LOG_LEVEL_WARN, __FILE__, __LINE__, __func__, __VA_ARGS__)
# else
# define LV_LOG_WARN(...) do {}while(0)
# endif
#endif
这里打开宏"LV_USE_LOG ",默认的打印级别为:LV_LOG_LEVEL_WARN,这里设置LV_LOG_PRINTF 为1,使用printf输入出:
/*Enable the log module*/
#define LV_USE_LOG 1
#if LV_USE_LOG
/*How important log should be added:
*LV_LOG_LEVEL_TRACE A lot of logs to give detailed information
*LV_LOG_LEVEL_INFO Log important events
*LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem
*LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail
*LV_LOG_LEVEL_USER Only logs added by the user
*LV_LOG_LEVEL_NONE Do not log anything*/
#define LV_LOG_LEVEL LV_LOG_LEVEL_WARN
/*1: Print the log with 'printf';
*0: User need to register a callback with `lv_log_register_print_cb()`*/
#define LV_LOG_PRINTF 1
/*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/
#define LV_LOG_TRACE_MEM 1
#define LV_LOG_TRACE_TIMER 1
#define LV_LOG_TRACE_INDEV 1
#define LV_LOG_TRACE_DISP_REFR 1
#define LV_LOG_TRACE_EVENT 1
#define LV_LOG_TRACE_OBJ_CREATE 1
#define LV_LOG_TRACE_LAYOUT 1
#define LV_LOG_TRACE_ANIM 1
#endif /*LV_USE_LOG*/
_lv_log_add打印函数如下:
void _lv_log_add(lv_log_level_t level, const char * file, int line, const char * func, const char * format, ...)
{
if(level >= _LV_LOG_LEVEL_NUM) return; /*Invalid level*/
static uint32_t last_log_time = 0;
if(level >= LV_LOG_LEVEL) {
va_list args;
va_start(args, format);
/*Use only the file name not the path*/
size_t p;
for(p = strlen(file); p > 0; p--) {
if(file[p] == '/' || file[p] == '\\') {
p++; /*Skip the slash*/
break;
}
}
uint32_t t = lv_tick_get();
static const char * lvl_prefix[] = {"Trace", "Info", "Warn", "Error", "User"};
#if LV_LOG_PRINTF
printf("[%s]\t(%" LV_PRId32 ".%03" LV_PRId32 ", +%" LV_PRId32 ")\t %s: ",
lvl_prefix[level], t / 1000, t % 1000, t - last_log_time, func);
vprintf(format, args);
printf(" \t(in %s line #%d)\r\n", &file[p], line);
#else
if(custom_print_cb) {
char buf[512];
#if LV_SPRINTF_CUSTOM
char msg[256];
lv_vsnprintf(msg, sizeof(msg), format, args);
lv_snprintf(buf, sizeof(buf), "[%s]\t(%" LV_PRId32 ".%03" LV_PRId32 ", +%" LV_PRId32 ")\t %s: %s \t(in %s line #%d)\n",
lvl_prefix[level], t / 1000, t % 1000, t - last_log_time, func, msg, &file[p], line);
#else
lv_vaformat_t vaf = {format, &args};
lv_snprintf(buf, sizeof(buf), "[%s]\t(%" LV_PRId32 ".%03" LV_PRId32 ", +%" LV_PRId32 ")\t %s: %pV \t(in %s line #%d)\n",
lvl_prefix[level], t / 1000, t % 1000, t - last_log_time, func, (void *)&vaf, &file[p], line);
#endif
custom_print_cb(buf);
}
#endif
last_log_time = t;
va_end(args);
}
}
这里配置printf函数重映射,fputc_imp 应该在库中定义为fputc,这里查不到:
extern int (*fputc_imp)(int ch, FILE *f);
void log_init(void)
{
fputc_imp = fputc_uart0;
}
修改代码后工程输出的LOG为:

实验效果请看这个视频:
lv_demo_widgets

当前LVGL的代码是不关屏的,TP是以定时器去获取的,而追求功耗的案例应该还是靠TP的中断口去获取!
