IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 【RT-Thread&ART-PI】采用DMA2D加速来提高ART-PI使用LVGL的帧率 -> 正文阅读

[嵌入式]【RT-Thread&ART-PI】采用DMA2D加速来提高ART-PI使用LVGL的帧率

一、前言

通过学习之前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软件包

lvgl软件包

选项配置

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

更改LCD_PIXEL_FORMAT宏为RTGRAPHIC_PIXEL_FORMAT_RGB565

LCD_PIXEL_FORMAT

四、LVGL显示接口移植

CR寄存器

static void lcd_fb_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p)
{
    uint32_t OffLineSrc = LV_HOR_RES_MAX - (area->x2 - area->x1 + 1);
    uint32_t addr = (uint32_t) LtdcHandle.LayerCfg[0].FBStartAdress + 2 * (LV_HOR_RES_MAX * area->y1 + area->x1);

    // 中断传输
    // 模式 TC 中断使能
    DMA2D->CR = 0x00000000UL | (1 << 9);
    // 源地址
    DMA2D->FGMAR = (uint32_t) (uint16_t*) (color_p);
    // 目标地址
    DMA2D->OMAR = (uint32_t) addr;
    // 输入偏移
    DMA2D->FGOR = 0;
    // 输出偏移
    DMA2D->OOR = OffLineSrc;
    /* 前景层和输出区域都采用的RGB565颜色格式 */
    DMA2D->FGPFCCR = DMA2D_OUTPUT_RGB565;
    DMA2D->OPFCCR = DMA2D_OUTPUT_RGB565;

    // 多少行
    DMA2D->NLR = (area->y2 - area->y1 + 1) | ((area->x2 - area->x1 + 1) << 16);
    // 开启中断
    DMA2D->CR |= DMA2D_IT_TC | DMA2D_IT_TE | DMA2D_IT_CE;
    /* 启动传输 */
    DMA2D->CR |= DMA2D_CR_START;
    g_gpu_state = 1;
}

void DMA2D_IRQHandler(void)
{
    /*进入临界区*/
    rt_enter_critical();
    /*中断传输完成*/
    if ((DMA2D->ISR & DMA2D_FLAG_TC) != 0U)
    {
        if ((DMA2D->CR & DMA2D_IT_TC) != 0U)
        {
            DMA2D->CR &= ~DMA2D_IT_TC;  /*关闭中断*/
            DMA2D->IFCR = DMA2D_FLAG_TC;/*清除传输完成中断*/
            if (g_gpu_state == 1)
            {
                g_gpu_state = 0;
                /*lvgl刷屏接口*/
                lv_disp_flush_ready(&g_disp_drv);
            }
        }
    }
    /*退出临界区*/
    rt_exit_critical();
}

void LTDC_IRQHandler(void)
{
    rt_enter_critical();
    /* USER CODE END LTDC_IRQn 0 */
    HAL_LTDC_IRQHandler(&LtdcHandle);
    /* USER CODE END DMA2D_IRQn 1 */
    rt_exit_critical();
}

触摸显示接口

static bool touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
    static uint16_t last_x = 0;
    static uint16_t last_y = 0;

    //触摸按下了
    if (tp_dev.sta & TP_PRES_DOWN)
    {
        last_x = tp_dev.x[0];
        last_y = tp_dev.y[0];
        data->point.x = last_x;
        data->point.y = last_y;
        data->state = LV_INDEV_STATE_PR;
    }
    else//触摸松开了
    {
        data->point.x = last_x;
        data->point.y = last_y;
        data->state = LV_INDEV_STATE_REL;
    }

    //返回false代表没有缓冲的数据
    return false;
}

五、LVGL显示帧率工具

打开lv_conf.h中LV_USE_PERF_MONITOR的宏

帧率工具

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

六、编译下载

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

ART-PI显示

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-08 10:53:52  更:2021-09-08 10:55:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:50:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码