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*/

  • 0
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值