RTThreadIoTOS · 2021年10月11日

【ART-PI】用DMA2D来提高ART-PI-LVGL帧率

image.png

一、前言

通过学习之前LVGL的移植过程,我们掌握了对于移植LVGL所需要的显示、触摸接口。对于像高性能H7芯片的ART-PI我们该如何提升其显示效果,充分使用ART-PI的优势呢?

答案是可以的,通过使用"GPU"来为LVGL加速--DMA2D加速显存数据搬运

二、DMA2D介绍

在STM32高性能芯片中,可以使用DMA2D外设专门用来给LCD显示加速,有LTDC外设的型号中,通常也会配套有DMA2D。

DMA2D外设主要提供了两个功能:

  • DMA数据搬运:常用从寄存器到存储器、存储器到存储器两种模式,快速高效,并且不占用cpu资源;
  • 2D图形加速:支持快速格式转换和混合;

三、开启ART-PI-lvgl软件包

3.1、使能littlevgl2rtt软件包

image.png

3.2、修改lcd_port.h中LCD_PIXEL_FORMAT宏定义

更改LCD_PIXEL_FORMAT宏为RTGRAPHIC_PIXEL_FORMAT_RGB565

image.png

四、LVGL显示接口移植

image.png

 1static void lcd_fb_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p)
 2{
 3    uint32_t OffLineSrc = LV_HOR_RES_MAX - (area->x2 - area->x1 + 1);
 4    uint32_t addr = (uint32_t) LtdcHandle.LayerCfg[0].FBStartAdress + 2 * (LV_HOR_RES_MAX * area->y1 + area->x1);
 5
 6    // 中断传输
 7    // 模式 TC 中断使能
 8    DMA2D->CR = 0x00000000UL | (1 << 9);
 9    // 源地址
10    DMA2D->FGMAR = (uint32_t) (uint16_t*) (color_p);
11    // 目标地址
12    DMA2D->OMAR = (uint32_t) addr;
13    // 输入偏移
14    DMA2D->FGOR = 0;
15    // 输出偏移
16    DMA2D->OOR = OffLineSrc;
17    /* 前景层和输出区域都采用的RGB565颜色格式 */
18    DMA2D->FGPFCCR = DMA2D_OUTPUT_RGB565;
19    DMA2D->OPFCCR = DMA2D_OUTPUT_RGB565;
20
21    // 多少行
22    DMA2D->NLR = (area->y2 - area->y1 + 1) | ((area->x2 - area->x1 + 1) << 16);
23    // 开启中断
24    DMA2D->CR |= DMA2D_IT_TC | DMA2D_IT_TE | DMA2D_IT_CE;
25    /* 启动传输 */
26    DMA2D->CR |= DMA2D_CR_START;
27    g_gpu_state = 1;
28}
29
30void DMA2D_IRQHandler(void)
31{
32    rt_interrupt_enter();
33    /*中断传输完成*/
34    if ((DMA2D->ISR & DMA2D_FLAG_TC) != 0U)
35    {
36        if ((DMA2D->CR & DMA2D_IT_TC) != 0U)
37        {
38            DMA2D->CR &= ~DMA2D_IT_TC;  /*关闭中断*/
39            DMA2D->IFCR = DMA2D_FLAG_TC;/*清除传输完成中断*/
40            if (g_gpu_state == 1)
41            {
42                g_gpu_state = 0;
43                /*lvgl刷屏接口*/
44                lv_disp_flush_ready(&g_disp_drv);
45            }
46        }
47    }
48    rt_interrupt_leave();
49}
50
51void LTDC_IRQHandler(void)
52{
53    rt_interrupt_enter();
54    /* USER CODE END LTDC_IRQn 0 */
55    HAL_LTDC_IRQHandler(&LtdcHandle);
56    /* USER CODE END DMA2D_IRQn 1 */
57    rt_interrupt_leave();
58}

触摸显示接口

 1static bool touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
 2{
 3    static uint16_t last_x = 0;
 4    static uint16_t last_y = 0;
 5
 6    //触摸按下了
 7    if (tp_dev.sta & TP_PRES_DOWN)
 8    {
 9        last_x = tp_dev.x[0];
10        last_y = tp_dev.y[0];
11        data->point.x = last_x;
12        data->point.y = last_y;
13        data->state = LV_INDEV_STATE_PR;
14    }
15    else//触摸松开了
16    {
17        data->point.x = last_x;
18        data->point.y = last_y;
19        data->state = LV_INDEV_STATE_REL;
20    }
21
22    //返回false代表没有缓冲的数据
23    return false;
24}

五、LVGL显示帧率工具

打开lv_conf.h中LV_USE_PERF_MONITOR的宏
image.png

帧率的优化与编译器的优化等级也有关系,这里我使用的是O2等级进行编译

六、编译下载

可以看到,通过DMA2D的加速,LVGL可以流畅的显示最高33FPS,对于后续LVGL的应用层编写打下了基础。
image.png

原文链接:RTThread物联网操作系统

推荐阅读
基于ART-Pi实现的AI图像识别
【AI简报20210917期】自研IP出货将超1亿片、北邮等利用超分算法提出高性能视频传输方法
【AI简报20210910期】联想发布LA2智能嵌入式控制器、单目摄像头实时感知车辆形状

推荐阅读
关注数
8071
内容数
181
小而美的物联网操作系统,经过14年的累积发展,RT-Thread 已经拥有一个国内最大的嵌入式开源社区,同时被广泛应用于能源、车载、医疗、消费电子等多个行业,累积装机量超过4亿台,成为国人自主开发、国内最成熟稳定和装机量最大的开源 RTOS。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息