lvgl显示速度优化及界面工具试用--Apple的学习笔记

一,前言

之前littlevgl读取sd卡FatFS图像文件--Apple的学习笔记我提及了显示刷屏慢的问题,今天我要来解决下。然后官网的界面代码生成工具无法登陆,但是找到了NXP也有一个基于LVGL的界面代码生成工具,所以试用下。

二,显示速度优化方法

  1. 首先想到显示加速,大家第一反应就是使用DMA,但是我的芯片stm32f407的ram是192K(128+64(不支持DMA)),而屏幕是3.2寸(240320)。简单来算240320*3=150K了,所以靠内部ram是不够使用DMA的,而我没买外部sdram。此方案不能使用。
  2. 考虑将双buffer的buffer值开大些,keil中添加了sct链接文件,使用了64Kccmram。但是没看出效果。并且把rgb8888从32bit改成了16bit rgb565也没什么效果。
  3. 网上查了下用描点法绘制速度慢,所以我改了下code,我的屏幕是ili9341,我直接设置显示区,然后w*h后直接写入。果然速度变快了,而且之前由于rgb8888改成了rgb565,并且lv_men_init的32K大数组我放入了ccmram,那么我的buffer就可以开的比较大,最后我初始化了单buffer,循环4段画完。刷屏从30ms改成了10ms,优化后速度提高还是很明显的,基本上是可接受的程度。不像之前一段段拉窗帘的感觉了。
    优化效果.gif

    disp_flush中我用了
    LCD_drawFastRGBBitmap(area->x1,area->y1,(uint16_t*)color_p,area->x2-area->x1+1,area->y2-area->y1+1);
void LCD_drawFastRGBBitmap(int16_t x, int16_t y, uint16_t *bitmap, int16_t w, int16_t h)
{
    uint32_t i=0;
    LCD_Set_Window(x, y, w, h);
    uint32_t size = w * h;
    LCD_WriteRAM_Prepare();         
    for(uint32_t i = 0; i < size; i++)
    {
        LCD_WR_DATA(bitmap[i]);
    }
}

三,使用IDE生成界面应用代码

显示加速完成后,可以考虑美观画面,不如布局呀,透明度呀!我期望提高效率,所以用IDE来开发应用界面,让其自动生成code是比较理想的。网上无意中找到了NXP的基于lvgl的界面IDE工具。

image.png

使用起来还是很方便的,只是回调函数貌似还需要手写代码,关于界面的排版完全用它生成的code即可。移植也很便捷,把generated文件夹copy我的keil工程,只是修改下头文件路径。不过它生成的图像不是sd读取的,直接把图像生成了c文件作为img_src,这个初始化稍微改下。lv_img_set_src(ui->screen_img_1,"0:applefile/river.bin");效果不错,如下:
image.png

image.png

四,遇到的问题及解决方法

  1. 按键无法调用回调函数
    nxp工具中我设置了开发板key按下后,调用回调函数,然后对象我绑定的btn1,但是无法调用回调函数,跟踪代码,我按下key被扫描到后,它传入的是screen对象。所以我将events_init_screen中初始化回调函数绑定到了ui->screen对象上后解决。
  2. 我用rgb565的图片会产生跑飞的现象,原因是hardfault,估计是stm32要4字节对齐的原因或者堆栈不够。另外一个跑飞是memloc时候时候无法分配而卡死,这是因为我在初始化buffer的时候h*w/3导致为50K,大于内部分配的32Kram,然后我把32K扩大到50K,反正64Kccmram就给这个变量用,就解决了。当然我也尝试了初始化小buffer的时候为h*w/4差不多就是37K,也没有问题。了解了根本原因后再修改的话方法可以多种多样。

五,小结

至少我已经找到了显示加速的一种方法,总结下来就是rgb8888改成rgb565同时不使用描点法写屏幕即可。另外NXP的IDE用起来还是比较简单的。

你可能感兴趣的:(lvgl显示速度优化及界面工具试用--Apple的学习笔记)