Porting the LVGL library.

Created at 2021-06-30 03:38:03

I have connected a TFT touch display to an STM32 Nucleo 144 board and I am trying to implement a GUI on it. I would like to port the LVGL library but don’t know how to do it yet.

Maybe someone could tell me how to do it better or what are the alternative versions of the LVGL library?


1 Answer
HappyTime 2021-07-07

LVGL porting guide Porting
Porting LVGL is easy, before porting LVGL you should conform you hardware is all good(lcd, touch etc...), then provide a point drawing function put_px(x, y, *color_p).

Here are the key steps

1 add lvgl in your project
2 Copy lvgl/lv_conf_template.h next to the lvgl directory and rename it to lv_conf.h add modify it.
3 provide a display buffer like before

/*A static or global variable to store the buffers*/
static lv_disp_draw_buf_t disp_buf;

/*Static or global buffer(s). The second buffer is optional*/
static lv_color_t buf_1[MY_DISP_HOR_RES * 10];
static lv_color_t buf_2[MY_DISP_HOR_RES * 10];

/*Initialize `disp_buf` with the buffer(s). With only one buffer use NULL instead buf_2 */
lv_disp_draw_buf_init(&disp_buf, buf_1, buf_2, MY_DISP_HOR_RES*10);

4 reigster the display buffer to LVGL

void my_flush_cb(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
    /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one
     *`put_px` is just an example, it needs to implemented by you.*/
    int32_t x, y;
    for(y = area->y1; y <= area->y2; y++) {
        for(x = area->x1; x <= area->x2; x++) {
            put_px(x, y, *color_p)

    /* IMPORTANT!!!
     * Inform the graphics library that you are ready with the flushing*/

static lv_disp_drv_t disp_drv;          /*A variable to hold the drivers. Must be static or global.*/
lv_disp_drv_init(&disp_drv);            /*Basic initialization*/
disp_drv.draw_buf = &disp_buf;          /*Set an initialized buffer*/
disp_drv.flush_cb = my_flush_cb;        /*Set a flush callback to draw to the display*/
disp_drv.hor_res = 320;                 /*Set the horizontal resolution in pixels*/
disp_drv.ver_res = 240;                 /*Set the vertical resolution in pixels*/

lv_disp_t * disp;
disp = lv_disp_drv_register(&disp_drv); /*Register the driver and save the created display objects*/

5 create a rtthread soft timer or a hard timer , call lv_tick_inc(5) in the timer callback function or interrupt function.
6 create a rtthread thread, call lv_timer_handler() eriodic in thread entry function.

Write Your Answer

Log in to publish your answer.,Click here to log in.