首页 > 其他分享 >GD32F470II芯片LVGL不同驱动方式对比

GD32F470II芯片LVGL不同驱动方式对比

时间:2023-04-21 11:15:56浏览次数:46  
标签:disp IPA 芯片 drv lv color LVGL buf GD32F470II

1、硬件对比

屏幕尺寸:  800*480 

颜色格式:  RGB565

一帧数据:  800*480*2 = 768000 = 750k

LCD 频率 :   32MHz/768000 = 41 HZ

lvgl fps :    33

优化等级:   AC5-O3

新硬件:GD32F470II

SDRAM :  32bit带宽 ,120MHz

MCU:    240MHz, 768K RAM, 2M Flash 

lv_demo_benchmark()的结果如下:

 

 

老硬件:GD32F450zg

SDRAM :  16bit带宽 ,100MHz

MCU:    200MHz, 256K RAM, 1M Flash 

lv_demo_benchmark()的结果如下:

 而跑我自己的开机动画则是如下情况:

 可以看到新版硬件比老版本速度提升了3倍,显然MCU那40MHz并不是主力,大部分是32Bit SDRAM起到的功劳。

这里的结论就是,800*480 的屏至少32Bit SDRAM起步,否则就只能播放下PPT。

驱动方面对帧率的影响也非常大,下面把几个主流的驱动方式贴出来做对比。

2、驱动对比

1、GD32官方驱动

核心就两个函数

 1 void lv_port_disp_init(void)
 2 {
 3     /*-------------------------
 4      * Initialize your display
 5      * -----------------------*/
 6     disp_init();
 7 
 8     /*-----------------------------
 9      * Create a buffer for drawing
10      *----------------------------*/
11 
12     static lv_disp_buf_t draw_buf_dsc_2;
13     static lv_color_t draw_buf_2_1[COLOR_BUF_SIZE] __attribute__((at(0xC0080000))); 
14     static lv_color_t draw_buf_2_2[COLOR_BUF_SIZE] __attribute__((at(0xC0100000)));
15     lv_disp_buf_init(&draw_buf_dsc_2, draw_buf_2_1, draw_buf_2_2, COLOR_BUF_SIZE);   /*Initialize the display buffer*/
16 
17     /*-----------------------------------
18      * Register the display in LVGL
19      *----------------------------------*/
20 
21     lv_disp_drv_t disp_drv;                         /*Descriptor of a display driver*/
22     lv_disp_drv_init(&disp_drv);                    /*Basic initialization*/
23 
24     /*Set up the functions to access to your display*/
25 
26     /*Set the resolution of the display*/
27     disp_drv.hor_res = LV_HOR_RES_MAX;
28     disp_drv.ver_res = LV_VER_RES_MAX;
29 
30     /*Used to copy the buffer's content to the display*/
31     disp_drv.flush_cb = disp_flush;
32 
33     /*Set a display buffer*/
34     disp_drv.buffer = &draw_buf_dsc_2;
35     
36     rcu_periph_clock_enable(RCU_IPA);
37 
38 #if LV_USE_GPU
39     /*Optionally add functions to access the GPU. (Only in buffered mode, LV_VDB_SIZE != 0)*/
40 
41     /*Blend two color array using opacity*/
42     disp_drv.gpu_blend_cb = gpu_blend;
43 
44     /*Fill a memory array with a color*/
45     disp_drv.gpu_fill_cb = gpu_fill;
46 #endif
47 
48     /*Finally register the driver*/
49     lv_disp_drv_register(&disp_drv);
50     
51 #ifdef USE_IPA_INT
52     nvic_irq_enable(IPA_IRQn, 0, 1);
53 #endif
54 }

 

 1 static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
 2 {
 3     /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/
 4 #ifndef USE_IPA_INT
 5     uint32_t time_out;
 6 #endif
 7     uint16_t offline;
 8     offline = LV_HOR_RES_MAX - (area->x2 - area->x1 + 1);
 9     
10     IPA_CTL = 0x0;
11     IPA_FMADDR = (uint32_t)color_p;
12     IPA_DMADDR = (uint32_t)(uint32_t)LCD_FRAME_BUFFER + 2*(LV_HOR_RES_MAX*area->y1+area->x1);
13     IPA_FLOFF = 0;
14     IPA_DLOFF = offline;
15     IPA_FPCTL = FOREGROUND_PPF_RGB565;
16     IPA_IMS = (uint32_t)((area->x2 - area->x1 + 1) << 16) | (uint16_t)(area->y2 - area->y1 + 1);
17     
18 #ifdef USE_IPA_INT
19     g_disp_drv = disp_drv;
20     /* enable IPA interrupt */
21     IPA_CTL |= IPA_CTL_FTFIE | IPA_CTL_TAEIE | IPA_CTL_WCFIE;
22     IPA_CTL |= IPA_CTL_TEN;
23     g_ipa_flag = 1;
24 #else
25     IPA_CTL |= IPA_CTL_TEN;
26     /* Wait until transfer is done */
27     while (IPA_CTL & IPA_CTL_TEN)
28     {
29         if(time_out++ >= 0XFFFFFFFF) break;
30     }
31 
32     /* IMPORTANT!!!
33      * Inform the graphics library that you are ready with the flushing*/
34     lv_disp_flush_ready(disp_drv);
35 #endif
36 }

我使用的就是这个代码,达到的效果就是上面看到的

2、2个图层互切

 1 static void DEMO_FlushDisplay(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
 2 {
 3     if (color_p == buf2_1)
 4     {
 5         tli_layer_disable(LAYER0);
 6         tli_layer_enable(LAYER1);
 7         tli_reload_config(TLI_REQUEST_RELOAD_EN);
 8     }
 9     else if (color_p == buf2_2)
10     {
11         tli_layer_disable(LAYER1);
12         tli_layer_enable(LAYER0);
13         tli_reload_config(TLI_REQUEST_RELOAD_EN);
14     }
15 
16     /* IMPORTANT!!!
17      * Inform the graphics library that you are ready with the flushing*/
18     lv_disp_flush_ready(disp_drv);
19 }

这种方式我没有成功,因为设置两个图层后,我的layer1不显示,只有layer0显示,也不知道为什么。而且其速度应该跟3相似,所以也没有特别考究。

3、LCD和LVGL公用双buf

 1 void lv_port_disp_init(void)
 2 {
 3     /*-------------------------
 4      * Initialize your display
 5      * -----------------------*/
 6     disp_init();
 7 
 8     /*-----------------------------
 9      * Create a buffer for drawing
10      *----------------------------*/
11     /* Example for 3) also set disp_drv.full_refresh = 1 below*/
12     static lv_disp_draw_buf_t draw_buf_dsc_3;
13     static lv_color_t *buf_3_1 = (lv_color_t * )(LVGL_MemoryAdd);             /*A screen sized buffer*/
14     static lv_color_t *buf_3_2 = (lv_color_t * )(LVGL_MemoryAdd + LCD_Width*LCD_Height*sizeof(lv_color_t));           /*Another screen sized buffer*/
15     lv_disp_draw_buf_init(&draw_buf_dsc_3, buf_3_1, buf_3_2, LCD_Width * LCD_Height);   /*Initialize the display buffer*/
16 
17     /*-----------------------------------
18      * Register the display in LVGL
19      *----------------------------------*/
20 
21     static lv_disp_drv_t disp_drv;                  /*Descriptor of a display driver*/
22     lv_disp_drv_init(&disp_drv);                    /*Basic initialization*/
23 
24     /*Set up the functions to access to your display*/
25 
26     /*Set the resolution of the display*/
27     disp_drv.hor_res = LCD_Width;
28     disp_drv.ver_res = LCD_Height;
29 
30     /*Used to copy the buffer's content to the display*/
31     disp_drv.flush_cb = disp_flush;
32 
33     /*Set a display buffer*/
34     disp_drv.draw_buf = &draw_buf_dsc_3;
35 
36     /*Required for Example 3)*/
37     disp_drv.full_refresh = 1; //双缓冲需要打开此设置
38 
39 
40     /*Finally register the driver*/
41     lv_disp_drv_register(&disp_drv);
42 }
 1 static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
 2 {
 3     /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/
 4 
 5     LTDC_Layer1->CFBAR = (uint32_t)color_p;
 6 
 7     /*IMPORTANT!!!
 8     *Inform the graphics library that you are ready with the flushing*/
 9     lv_disp_flush_ready(disp_drv);
10 }

这个方案的重点有两个:

1、LCD使用的显存地址就是LVGL的帧地址,LVGL把乒乓buf中的一个填写好后直接把这个地址交给LCD驱动去往屏幕上刷,少了帧缓冲到显存之间的搬运

2、disp_drv.full_refresh = 1; //双缓冲需要打开此设置,也就是这种刷新方式是全屏刷新,没有局部刷新了。相当于局部虽然刷新一个点,但是disp_flush传进来的也是整帧的地址。(不知道整帧内容是不是也是需要整帧生成)

网友使用的就是这种方式,开启GPU后STM32F429能跑到45FPS

 下一步就是研究GD32的GPU使用方法

  

标签:disp,IPA,芯片,drv,lv,color,LVGL,buf,GD32F470II
From: https://www.cnblogs.com/xjxcxjx/p/17339643.html

相关文章

  • lvgl
    ESP32WROVERBLVGLVSCODEPLATFOMARDUINO[env:esp-wrover-kit]platform=espressif32board=esp-wrover-kitframework=arduinomonitor_speed=115200lib_ldf_mode=deep+lib_deps=bodmer/TFT_eSPI@^2.4.75lvgl/lvgl@^8.3.1LVGL:https://blog.csdn.net/......
  • ASEMI代理ADI亚德诺AD9951YSVZ车规级芯片
    编辑-ZAD9951YSVZ芯片参数:型号:AD9951YSVZ输入电容:3pF输入阻抗:1.5kΩ占空比:50%REFCLK输入功率:+3dBm满刻度输出电流:10mA输出偏移:0.6µA输出电容:5pF电压符合范围:AVDD–0.5~AVDD+0.5V最高频率:25Mbps最高结温:150°C数字输入电压:–0.7Vto+5.25V数字输出电流......
  • CH224单芯片集成USB PD等多种快充协议
    CH224单芯片集成PD3.0/2.0,BC1.2等升压快充协议,内置PD通讯模块,高集成度,外围精简。支持输出电压检测功能,并且提供过温、过压保护等。可广泛应用于各类电子设备拓展高功率输入,如无线充电器、电动牙刷、锂电池电动工具等各类应用场合。2、功能特点l l l l l支持5V至15V输入电压支持......
  • 高性能双麦阵列拾音束语音降噪消回音处理芯片 nr2048
       NR2048芯片采用先进的语音处理技术,芯片拥有8k-16k频率采样,旨在嘈杂环境中改进语音通话的清晰度,以及有助于改善语音识别命令输入 NR2048芯片拥有先进的双麦克风阵列拾音束成型技术可以追踪通话者的声音,过滤掉不需要的背景噪音,提供自然的声音为任何环境中的用户提供清......
  • 低功耗蓝牙MESH芯片PHY6222/PHY6252 适用于无线耳麦
    旅游带团专用无线耳麦讲解器 无线讲解器已经成为讲解场所的主要设备。该装置分为发射器和接收器。讲师会用发射器说话,听者会戴上接收器听讲话。 产品功能及适用场合:1. 可实现讲解员用正常音量讲解,配接听耳机的客人无论距离讲解员远近(200米内)可听清讲解员的讲解。讲解比较......
  • 【万象奥科】瑞芯微RK3568四核核心板芯片简介
    引言  RK3568是瑞芯微出品的一款定位中高端的通用型SoC,采用22nm先进制程工艺,集成4核 arm 架构 A55 处理器和 Mali G52 2EE 图形处理器,支持4K解码和1080P编码。RK3568支持 SATA/PCIE/USB3.0 等各类型外围接口,内置独立的NPU,可用于轻量级人工智能应用。  RK3568......
  • ASEMI代理ADI亚德诺AD8638ARJZ-REEL7车规级芯片
    编辑-ZAD8638ARJZ-REEL7芯片参数:型号:AD8638ARJZ-REEL7偏移电压:3μV输入偏置电流:1.5pA输入失调电流:7pA输入电压范围:−0.1~+3V共模抑制比:133dB输入电阻:22.5TΩ差模输入电容:4pF共模输入电容:1.7pF输出电压高:4.985V输出电压低:7.5mV短路电流:±19mA闭环输出阻抗:4.2Ω电源抑制比:14......
  • FS2462原厂24W大功率同步整流芯片 大电流降压IC
    FS2462是泛海微自主开发的5A降压型同步整流芯片,是国内首家大电流同步5A芯片,内部集成极低RDS内阻20豪欧金属氧化物半导体场效应晶体管的(MOSFET)。输入工作电压宽至4.75V到21V,输出电压1.0V可调至20V。5A的连续负载电流输出可保证系统各状态下稳定运行。其效率高达95%,满足各系统日益......
  • 手表无线充插座充电方案应用ic——泛海微无线充芯片FS68003
    FS68003是一款高集成度、高效率,符合WPCQi标准的无线充电接收芯片。芯片内部集成效率高达95%以上的全同步整流电路、功率输出电路,反向保护电路,极低的热损耗,好的应用体验。内部集成的动态整流电压控制,有效提升了芯片的瞬态响应及系统效率。FS68003采用SOP8极小封装,配合外围精简的应......
  • DC/DC升压恒压IC 干电池玩具专用芯片FS2113
    DC/DC升压恒压IC 干电池玩具专用芯片FS2113DC/DC升压恒压IC 干电池玩具专用芯片FS2113这些升压IC方案适用于干电池类小家电,应用领域 1~3 个干电池的电子设备。 LED 手电筒、LED 灯、血压计 电子词典、汽车防盗器、充电器、VCR、PDA 等手持电子设备等产品总共有四种封装形 ......