STM32F429中LTDC的DMA2D加速

液晶屏的时序问题?
每个液晶屏的时序都不一样,但总体上是类似的。如下图:

  

VDEN:    数据使能信号。
HSYNC:     每一行扫描的起始点, 在扫描过程中, 不会管上一行扫描有没有结束, 当出现这一个信号,即开始新一行的扫描.
VSYNC:      每一场扫描的起始点, 这与HSYNC相似的.
BACK PROCH:     因为有不同tft屏和不同扫描硬件, 并且HSYNC和VSYNC对于时序的约束力有限, 所以会加入一些容错的时间, 因此行扫描和场扫描都会有BACK PROCH: 和FRONT PROCH: , 并且会在HSYNC,VSYNC出现之后, 和正常分辨率扫描之后都将容错时序, 也就是在正常扫描的前后都加入容错时间, BACK PROCH: 虽然从字面上理解是后容错, 但通常会放在正常描述之前, 当然这还要看具体TFT屏的规格书.
FRONT PROCH:    也就是放在正常描述之后的容错时间. 同上.
CLK:     也就是正常扫描的时钟, 一个上升沿只会扫描一个pixel.

从下面这个示意图可以比较直观的看出:

  

注意:有些液晶屏给的参数单位可能不一样,需要自己计算。

  

各参数值确定方法如下:

VBPD:确定帧同步信号和帧数据传输前的一段延迟时间,是帧数据传输前延迟时间和行同步时钟间隔宽度的比值,如图,VBPD=t3/t6=1.02 mS/31.77μs=32。

VFPD:确定帧数据传输完成后到下一帧同步信号到来的一段延迟时间,是帧数据传输后延迟时间和行同步时钟间隔宽度的比值,如图,VFPD=t5/t6=0.35 ms/31.77μs=11。

VSPW:确定帧同步时钟脉冲宽度,是帧同步信号时钟宽度和行同步时钟间隔宽度的比值。如图,VSPW=t2/t6=0.06 ms/31.77μs=2。

HBPD:确定行同步信号和行数据传输前的一段延迟时间,描述行数据传输前延迟时间内VCLK脉冲个数,如图,VBPD=t7×VCLK=1.89 μs×25MHz=47。

HFPD:确定行数据传输完成后到下一行同步信号到来的一段延迟时间,描述行数据传输后延迟时间内VCLK脉冲个数,如图,HFPD=t9×VCLK=0.94 μs×25 MHz=24。

HSPW:确定行同步时钟脉冲宽度。描述行同步脉冲宽度时间内VCLK脉冲个数,如图,HSPW=3.77μs×25 MHz=94。

LTDC的使用问题?
可参考官方例程的配置,需要注意的是,它只是一个LCD控制器,需要定义缓存的地址。可以设置在flash里,但是不便于操作,一般还是建议设置外部SDRAM里。可参考下面这个PDF文档。

LTDC中DMA2D的使用问题?
429中LTDC的2D加速功能还比较简单,只有以下4种模式
    DMA2D功能:  
       DMA2D_M2M   从flash拷贝至显存
       DMA2D_M2M_PFC 从flash拷贝至显存,并可以进行颜色的格式转换,替换/不更改/混合
       DMA2D_M2M_BLEND 从flash拷贝至显存,并先进行前景与后景色混合
       DMA2D_R2M 拷贝固定颜色至显存
使用方式:

uint32_t DMA2D_OutAdd;
uint32_t DMA2D_InAdd;
void DMA2D_M2M_Config(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
{
    DMA2D_InitTypeDef      DMA2D_InitStruct;
    DMA2D_FG_InitTypeDef   DMA2D_FG_InitStruct;

    /* Enable the DMA2D Clock */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2D, ENABLE);

    /* DMA2D configuration */
    DMA2D_DeInit();

    /* Transfer mode */
    DMA2D_InitStruct.DMA2D_Mode = DMA2D_M2M;

    /* Color mode */
    DMA2D_InitStruct.DMA2D_CMode = DMA2D_RGB565;

    DMA2D_OutAdd = CurrentFrameBuffer + 2*(LCD_PIXEL_WIDTH*Ypos + Xpos);

    /* Output Address */
    DMA2D_InitStruct.DMA2D_OutputMemoryAdd = DMA2D_OutAdd;

    /* Number of lines : height */
    DMA2D_InitStruct.DMA2D_NumberOfLine = Height;

    /* Number of pixel per line : width */
    DMA2D_InitStruct.DMA2D_PixelPerLine = Width;

    /* Initialize the alpha and RGB values */
    DMA2D_InitStruct.DMA2D_OutputGreen = 0;
    DMA2D_InitStruct.DMA2D_OutputBlue = 0;
    DMA2D_InitStruct.DMA2D_OutputRed = 0;
    DMA2D_InitStruct.DMA2D_OutputAlpha = 0;

    /* Initialize the output offset */
    DMA2D_InitStruct.DMA2D_OutputOffset = (LCD_PIXEL_WIDTH - Width);

    /* Initialize DMA2D */
    DMA2D_Init(&DMA2D_InitStruct);

    /* Configure default values for foreground */
    DMA2D_FG_StructInit(&DMA2D_FG_InitStruct);

    /* Configure DMA2D foreground color mode */
    DMA2D_FG_InitStruct.DMA2D_FGCM = DMA2D_RGB565;

    /* Configure Input Address */
    DMA2D_FG_InitStruct.DMA2D_FGMA = CurrentFrameBuffer+BUFFER_OFFSET;

    /* Initialize foreground */
    DMA2D_FGConfig(&DMA2D_FG_InitStruct);

    /* Start Transfer */
    DMA2D_StartTransfer();

    /* Wait for CTC Flag activation */
    while(DMA2D_GetFlagStatus(DMA2D_FLAG_TC) == RESET)
    {
    }
}

原文地址:https://www.cnblogs.com/jiangzhaowei/p/10868610.html

时间: 2024-10-17 07:13:11

STM32F429中LTDC的DMA2D加速的相关文章

STM32F429之LTDC驱动图解

本文基于ST官方demo板STM32F429 Discovery硬件平台,以看图说话的形式给大家讲解LTDC的主要参数配置.关于本文提到的代码部分均摘自本人另一片文章<STM32F429之LTDC代码模板>,LCD硬件为240x320,驱动IC为ili9341.本文目的意在让大家通过几张图就能掌握STM32F429 LTDC控制器的配置要领,而从干涩的文字中解脱出来,方便记忆.当然本文只是讲解了LTDC一些常用的设置,关于更多细节的操作还是得参照ST的官方datasheet. 一.关于LTDC

[转]Android中不被硬件加速支持的操作

开启硬件加速之后,Android中的2D渲染管道可以支持绝大部分常用的Canvas的绘画操作函数以及那些很少被使用的操作函数.所有的那些用来呈现Android中的应用程序的绘画操作.默认的部件和布局以及常见的高级视觉效果(比如反射和纹理)都被支持.以下列表是已知的不被硬件加速所支持的操作:* Canvas     ** clipPath()     ** clipRegion()     ** drawPicture()     ** drawTextOnPath()     ** drawVe

unity中鼠标按下加速漫游,鼠标抬起减速漫游。

private bool IsMouseUpOrDown=true; //一开始默认是鼠标抬起状态 if (Input.GetMouseButtonDown(1)) //鼠标按下的瞬间状态 { IsMouseUpOrDown = false; //鼠标按下 } if (Input.GetMouseButton(1))  //鼠标持续按下的状态 { if (IsMouseUpOrDown == false) { if (moveSpeed >= 1.5f) { Debug.LogError("

c/c++ 代码中使用sse指令集加速

使用SSE指令,首先要了解这一类用于进行初始化加载数据以及将暂存器的数据保存到内存相关的指令, 我们知道,大多数SSE指令是使用的xmm0到xmm8的暂存器,那么使用之前,就需要将数据从内存加载到这些暂存器. 1. load系列,用于加载数据,从内存到暂存器 __m128 _mm_load_ss (float *p) __m128 _mm_load_ps (float *p) __m128 _mm_load1_ps (float *p) __m128 _mm_loadh_pi (__m128 a

Android中GPU硬件加速控制及其在2D图形绘制上的局限

图形的渲染可分为两种:软件渲染和硬件渲染.软件渲染是靠CPU计算各种坐标并绘制,主要是占用内存:硬件渲染是靠GPU,主要占用显存,一般的3D图形程序(OpenGL.DirectX)都是GPU加速的. 在Android3.0之前,2D绘图API只支持软件渲染模式,从Android3.0开始,2D绘图API开始支持GPU硬件渲染,即View中的Canvas的绘图操作会使用GPU,所以从Android 3.0(API Level 11)开始,View中就多了一些和硬件相关的方法.如果App的Andro

第28章 LTDC—液晶显示中英文

本章参考资料:<STM32F76xxx参考手册>.<STM32F7xx规格书>.库帮助文档<STM32F779xx_User_Manual.chm>. 关于开发板配套的液晶屏参数可查阅<5.0寸液晶屏数据手册>(或7.0寸数据手册)配套资料获知.本教程讲解时主要使用5寸屏来说明,对于我 们配套的7寸屏,使用原理及配置参数完全一致(该7寸屏与5寸屏都是800x480的分辨率,仅尺寸不一样). 在前面我们学习了如何使用LTDC外设控制液晶屏并用它显示各种图形,本

为你的应用加速 - 安卓优化指南

原文链接 : Speed up your app 原文作者 : UDI COHEN 译文出自 : 开发技术前线 www.devtf.cn.未经允许,不得转载! 译者 :zijianwang90 校对者: 状态 : 完成 几周之前,我在Droidcon NYC上有过一次关于Android性能优化的演讲. 我在这个演讲中花费了大量的时间,因为我想通过真实的例子展现性能问题,以及我是通过什么样的工具去发掘这些问题的.因为时间原因,在演讲中我不得不舍弃一半的内容.在这篇文章中,我会总结在演讲中我所讨论的

Android 中几个重要的View

SurfaceView, GLSurfaceView, SurfaceTexture以及TextureView是Android当中名字比较绕,关系又比较密切的几个类.本文基于Android 5.0(Lollipop)的代码理一下它们的基本原理,联系与区别. SurfaceView从Android 1.0(API level 1)时就有 .它继承自类View,因此它本质上是一个View.但与普通View不同的是,它有自己的Surface.我们知道,一般的Activity包含的多个View会组成Vi

Android应用程序UI硬件加速渲染环境初始化过程分析

在Android应用程序中,我们是通过Canvas API来绘制UI元素的.在硬件加速渲染环境中,这些Canvas API调用最终会转化为Open GL API调用(转化过程对应用程序来说是透明的).由于Open GL API调用要求发生在Open GL环境中,因此在每当有新的Activity窗口启动时,系统都会为其初始化好Open GL环境.这篇文章就详细分析这个Open GL环境的初始化过程. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! Open