• LVGL学习笔记


    芯片启动到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);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    按下复位键到滑动屏幕打印如下:

    [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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    验证平台事物图:
    在这里插入图片描述

    视频展示效果如下:

    lvgl跟手控件效果

    配置LOG

    使用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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这里打开宏"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*/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    _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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    这里配置printf函数重映射,fputc_imp 应该在库中定义为fputc,这里查不到:

    extern int (*fputc_imp)(int ch, FILE *f);
    
    void log_init(void)
    {
        fputc_imp = fputc_uart0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    修改代码后工程输出的LOG为:
    在这里插入图片描述
    实验效果请看这个视频:

    lv_demo_widgets

    显示输出

    在这里插入图片描述

    输入设备(TP)

    当前LVGL的代码是不关屏的,TP是以定时器去获取的,而追求功耗的案例应该还是靠TP的中断口去获取!
    在这里插入图片描述

  • 相关阅读:
    windows域控批量创建账号方法
    眼内衍射透镜的设计与分析
    第三方在线地图源有哪些?
    怎么在 CSDN 写好技术博客
    JavaWeb之利用Filter实现权限拦截小实战【过滤器】
    121. 买卖股票的最佳时机
    web前端之float布局与flex布局
    【无代码】【VR开发】【Unity】【VRTK】4-导入VRTK Tilia Package
    行业洞察 | 你的语音小助手的词汇量够吗?
    我为什么要使用GPT????
  • 原文地址:https://blog.csdn.net/chengdong1314/article/details/128032553