lvgl学习之屏幕与刷新

①如何创造一个屏幕并显示

在hal_init()函数中写入一下代码

/*Create a display buffer*/
  static lv_disp_draw_buf_t disp_buf1;
  static lv_color_t buf1_1[MONITOR_HOR_RES * 100];
  static lv_color_t buf1_2[MONITOR_HOR_RES * 100];
  lv_disp_draw_buf_init(&disp_buf1, buf1_1, buf1_2, MONITOR_HOR_RES * 100);

  /*Create a display*/
  static lv_disp_drv_t disp_drv;
  lv_disp_drv_init(&disp_drv); /*Basic initialization*/
  disp_drv.draw_buf = &disp_buf1;
  disp_drv.flush_cb = monitor_flush;
  disp_drv.hor_res = MONITOR_HOR_RES;
  disp_drv.ver_res = MONITOR_VER_RES;
  disp_drv.antialiasing = 1;

  lv_disp_t * disp = lv_disp_drv_register(&disp_drv);

②lvgl显存方式分为3种

单buffer

画面会被拆分成buffer的size大小,分块刷新,当只有局部刷新时,比如说点击了一个按钮按钮变高亮,那么他就只会刷局部画面。

官方推荐大小 1/10 screen size,拆分太小,刷屏接口又慢的话,不仅帧率低,还会有感人的拉窗帘。

static lv_disp_buf_t disp_buf;
static lv_color_t buf[LV_HOR_RES_MAX * LV_VER_RES_MAX / 10];                     /*Declare a buffer for 1/10 screen size*/
lv_disp_buf_init(&disp_buf, buf, NULL, LV_HOR_RES_MAX * LV_VER_RES_MAX / 10);    /*Initialize the display buffer*/

非全尺寸双buffer
顾名思义,两个buffer,实际上就是PING-PONG模式,这种情况适合有dma或者其他显存加速设备的芯片,在一块buffer使用dma等外设后台刷屏时,lvgl可以再前台渲染显示进另一块显存,也就是说渲染和刷屏并发执行,理论是比单显存要好的,不过跟硬件和屏幕大小有关。

      static lv_disp_buf_t draw_buf_dsc_2;  //两个半屏缓存
      static lv_color_t draw_buf_2_1[LV_HOR_RES_MAX * LV_VER_RES_MAX/2];                        /*A buffer for 10 rows*/
      static lv_color_t draw_buf_2_2[LV_HOR_RES_MAX * LV_VER_RES_MAX/2];                        /*An other buffer for 10 rows*/
      lv_disp_buf_init(&draw_buf_dsc_2,draw_buf_2_2, draw_buf_2_1, LV_HOR_RES_MAX *LV_VER_RES_MAX/2);   /*Initialize the display buffer*/

全尺寸双buffer
两个全尺寸buffer,虽然直觉看上去和非全尺寸双buffer应该区别不大,但实际上,这个是专门为带TFT驱动的MCU准备的。双全尺寸与前两种不同,在任何时候,给出的buffer都是全屏大小的buffer,而不是局部刷新只提供刷新部分的buffer窗口,这么做的的好处是刷屏,只需要更改TFT驱动的显存地址,而不需要将LVGL的buffer再搬运到TFT驱动的显存,就可完成刷屏动作。

F429带LTDC,也就是TFT驱动,理论上应当使用该类型。
不过实测帧没有提升反而大幅下降。。。。有点奇怪。

刷屏修改LTDC的显存地址, 当LTDC刷到最后一行,中断回调提示LVGL屏幕刷完。代码如下
 

      static lv_disp_buf_t draw_buf_dsc_2;  //两个全屏缓存
      static lv_color_t draw_buf_2_1[LV_HOR_RES_MAX * LV_VER_RES_MAX];                        /*A buffer for 10 rows*/
      static lv_color_t draw_buf_2_2[LV_HOR_RES_MAX * LV_VER_RES_MAX];                        /*An other buffer for 10 rows*/
      lv_disp_buf_init(&draw_buf_dsc_2,draw_buf_2_2, draw_buf_2_1, LV_HOR_RES_MAX *LV_VER_RES_MAX);   /*Initialize the display buffer*/

lvgl学习之屏幕与刷新_第1张图片

你可能感兴趣的:(嵌入式)