最近调试R61509V这颗LCM驱动芯片时,出现在纯色测试画面下画面刷新有残留(tearing effect,即TE)的问题。根本原因是主控写图像数据的速度与LCM刷屏的速度不一致造成的,具体是刷屏速度要快于主控写速度。好在很多LCM驱动芯片都有一个Fmark脚,用来与主控同步,当Fmark发出一个信号给主控时,主控才开始写一帧数据,这样就可以保证两边同步。讲述前首先对几个概念描述:

(1)刷屏速度

刷屏率是指LCM刷新的速度,这个值一般在LCM的初始化CODE中会设定好。对于瑞萨的R61509V这颗LCD驱动,设定0x0010寄存器就是设定刷屏速度。根据公式:帧率=678KHZ/{(RTN)*DIV*(432+8+8)} ,其中678K是LCM内部的时钟源,RTN是每行的时钟数,DIV是分频系数,(432+8+8)则是行像素。测得的结果是:

0X011F  20HZ,最小频率.

0X011A  29HZ
0X0115  36HZ
0X0110  52HZ

0X001C  60HZ  
0X0018  70HZ

0X0014  80HZ

刷屏率太低会导致出现flicker现象,所以一般要设定在60HZ以上。

(2)主控写速度WR跟片选CS

这两个PIN脚对每个DBI的LCM都具备,两者的工作频率是一致的。主控每次写一帧数据时,会有一个片选信号,同时对应一个WR的写有效信号。主控的写频率的变化是由工作状态决定的,比如摄像时,拍摄动态物体的显示写速度就快于拍摄静态物体的显示写速度。

如果屏幕的画面没有更新,就会70ms update一次lcd,如果画面有动,就是最多33ms刷一次屏。意思就是CS频率只能限定在1/70到1/30,14.28HZ至33.33HZ之间。最高频率已经快于PAL或者NTSC的帧频,可以保证摄像头工作或者播放视频时不会出现丢帧现象。

(3)Fmark功能

要使能fmark,首先要保证主控的fmark脚与LCM的fmark脚是正确连接的;其次要在LCM初始化中使能屏的fmark功能,保证LCM周期性发出信号给主控,同时使能主控的fmark功能,保证主控收到一个fmark信号才写一帧数据。

LCM的fmark有两个参数可以配置:一是刷多少次屏发出一个fmark信号,比如不一定要每次刷屏都发fmark信号,可以刷几次屏发一次fmark信号;二是fmark的位置参数,可以让fmark迟滞几条线输出,目的是让主控晚点写数据到GRAM,避免TE。

举例:存在这样的情况,就是IC在从GRAM读完最后一行就输出te信号,此时BB开始写GRAM。但可能还要有一两条line的时间,IC才开始从GRAM的第一行读数据刷下二桢,而写GRAM的速度要慢于IC读GRAM的速度,此时可能还没有开始写。导致读GRAM超过写GRAM,所以会在上方产生tearing。要避免TE输出太早,导致写GRAM先开始,所以要加延迟,保证读老旧数据开始后,写GRAM才开始。

(4)fmark周期与CS周期

出现TE现象的根本原因是两边速度不一致,具体是LCM的刷新速度要快于主控送数据的速度,两者的速度要符合一定的范围才行。只要保证CS的周期在两个TE周期之间即可,也就是CS的写频率不能低于TE读频率的二分之一,Tearing出现的根本条件是读写有交叉。通常都是写Gram速度(WR)慢于lcd刷屏速度(TE),只要刷屏的位置不超过写Gram位置就不会有切屏现象。
      举个实例:比如CS差不多就比两个TE周期小一点,要刷两桢数据,首先第一桢刷屏开始刷屏了,表示读GRAM开始,它的速度比较快,它读的是老旧数据;紧接着主控开始写GRAM,大概写到GRAM的快一半时,这时候已经刷完一桢,然后开始刷第二桢,即又从GRAM的最上方开始读并刷屏,此时读出来的才是刚写入的新数据,在写完GRAM之前,读的步骤永远跟不上写的步骤,就不会出现tearing。

如果CS比两个TE周期大,假设相当于三个TE周期,那么只有在第三个TE读周期时,显示的数据才是写好的GRAM的数据;第一个TE读的是老旧的数据,第二个TE周期由于GRAM还没有写完,但读步骤赶上写GRAM步骤了,导致显式一部分是旧的一部分是新的,所以出现TE。此即本质。

若TE已经成功开启,依然有Teering现象(摄像头预览或者播放视频时尤其明显),可从如下方面思考分析。
1)是否使用了竖屏横用,导致对GRAM的读写方向不一致,一般会出现斜线切屏现象。
2)是否clock速度过低,FPS低于LCM自刷新率的1/2?
3)是否clock速率过快,超过LCM的自刷新率,导致写GRAM时可能从后面赶上读,导致Teering发生。
(5) TE类型

TE显示使能时,必须保证CPU的LCD TE使能和LCM驱动的TE功能都打开。LCM的TM使能有两种:VSYSC,VSYNC&HSYNC。图示如下:

=================================================================================================

首先,LCD控制器同LCD驱动器是有着本质区别的。简单来说LCD控制器在嵌入式系统中的功能如同显卡在计算机中所起到的作用。LCD控制器负责把显存(可能是内存中的指定域)中的LCD图形数据传输到LCD驱动器(LCD driver)上,并产生必须的LCD控制信号,从而控制和完成图形的显示,翻转,叠加,缩放等一系列复杂的图形显示功能。LCD驱动器则只负责把CPU发送的图像数据在LCD显示出来,不会对图像做任何的处理。独立显卡,就是个GPU模组加自己相应的外设,具备独立显存(RAM)。
集成显卡,是GPU与CPU共用内存。

=================================================================================================

帧数(帧率),就是画面改变的速度,只要显卡够强,帧数就能很高,只要帧数高画面就流畅。理论上,每一帧都是不同的画面。60fps就是每秒钟显卡生成60张画面图片。

刷新率,顾名思义,就是显卡将显示信号输出刷新的速度。60赫兹(hertz)就是每秒钟显卡向显示器输出60次信号。

假设帧数是刷新率的1/2,那么意思就是显卡每两次向显示器输出的画面是用一幅画面。相反,如果帧数是刷新率的2倍,那么画面每改变两次,其中只有1次是被显卡发送并在显示器上显示的。 所以高于刷新率的帧数都是无效帧数,对画面效果没有任何提升,反而可能导致画面异常。

=================================================================================================

渐渐兴起的OLED屏,都是没有背光概念的,用屏自身的命令来控制背光。修改方法参见FAQ,需要说明的一个地方:

static struct LCM_setting_table lcm_backlight_level_setting[] = {{0x51, 1, {0xFF}}, //0xFF最终会被覆写{0x53, 1, {0x20}},{REGFLAG_END_OF_TABLE,99, {}}
};static void lcm_setbacklight(unsigned int level)
{unsigned int default_level = 145;     //名为默认,实际是最低亮度unsigned int mapped_level = 0;if(level > 255) level = 255;if(level >0) mapped_level = default_level+(level)*(255-default_level)/(255);   //等份化elsemapped_level=0;// Refresh value of backlight level.lcm_backlight_level_setting[0].para_list[0] = mapped_level;   //覆盖结构体构成的数组的,第一个数组元素的para_list数组的第一个值LCM_PRINT(" lcm_setbacklight setting level is %d \r\n", level);push_table(lcm_backlight_level_setting, sizeof(lcm_backlight_level_setting) / sizeof(struct LCM_setting_table), 1);
}

LCM之Fmark功能 LCD控制器同LCD驱动器的差别 帧率与刷新率的关系 OLED背光相关推荐

  1. LCD控制器与帧率、刷新率的关系分析

    源:LCD控制器与帧率.刷新率的关系分析 LCM之Fmark功能 && LCD控制器同LCD驱动器的差别 && 帧率与刷新率的关系 && OLED背光

  2. LCD不带显存,是如何内存映射屏幕。S5PV210SoC在内存中选一段内存存放颜色数据,通过配置将LCD控制器和这一段内存连接起来,构成映射关系,LCD控制器就自动从显存中读取像素数据传给LCD驱动器

    一.LCD控制原理 S5PV210处理器中自带LCD控制器,控制LCD的显示,把 LCD 图像数据从一个位于系统内存的 video buffer 传送到一个外部的 LCD 驱动器接口. 类型: STN ...

  3. LCd控制器与lcd

    1.LCD控制器 1) 显示控制器主要负责从内存中或者FIFO通道中获取图像/视频数据,以一定的方式叠加.混合,将最终的图像送出到外部液晶显示器去显示,并具有0.1.2层的FIFO输入接口及一个外部F ...

  4. LCD控制器的原理及各寄存器功能的详细讲解

    LCD工作原理            如图4-24 所示,LCD 的横截面很像是很多层三明治叠在一起.每面最外一层是透明的玻璃基体,玻璃基体中间就是薄膜电晶体.颜色过滤器和液晶层可以显示出红.蓝和绿三 ...

  5. 【STM32F429开发板用户手册】第40章 STM32F429的LCD控制器LTDC基础知识和HAL库API

    最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 第40章       STM32F429的LCD控制器LTDC基础 ...

  6. Linux 2440 LCD 控制器

    嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤.一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便.如有错误之处,谢请指正. 共享资源,欢迎转载:http:/ ...

  7. ht1621b和单片机电平匹配_51单片机对HT1621 LCD 控制器的使用

    51 单片机对 HT1621 LCD 控制器的使用 HT1621 是一款 128 个位元的 LCD 控制器件,内部 RAM 直接对应 LCD 的显示单元.相应 的软件使它适用于包括 LCD 模块和显示 ...

  8. 第十七课(2)LCD控制器介绍

    LCD控制器主要功能和需要的设置: 取:从内存(FrameBuffer)取出某个像素的数据:之后需要把FrameBuffer地址.BPP.分辨率告诉LCD控制器: 发:配合其它信号把FrameBuff ...

  9. S3C2440开发板裸机程序系列06—LCD控制器

    1.     概述 S3C2440对LCD的支持还是很强大的,有广度有深度,这里只简单学一种,后续有精力再实践各种模式. 本篇从显示模式.显示时序.硬件连接.控制器寄存器设置等几个方面进行展开. 2. ...

最新文章

  1. KBMMW 的日志管理器
  2. 现在开始每天坚持写点啥。linux相关基础内容学习。
  3. 北邮王啸:图神经网络的两面性
  4. 【听说是线段树】bzoj1012 [JSOI2008]最大数maxnumber
  5. Python高阶函数用法
  6. 云炬随笔20210930
  7. 反骨仔的 2016 年度全文目录索引
  8. PageRank算法简介及Map-Reduce实现
  9. springboot整合servlet
  10. 《网络编程》ioctl 操作
  11. java数据库防火墙,数据库centos7防火墙导致java程序访问mongodb3.0.1时报错的问题分析...
  12. linux提升权限命令提示符,win10如何直接使用命令提示符提高管理员权限?
  13. java 可选参数_超干货详解:kotlin(4) java转kotlin潜规则
  14. GNOME界面简单使用
  15. 深度解析vue.js响应式原理解析与实现
  16. 编译WINDOWS版FFmpeg:编译SDL
  17. python 新闻热点_基于Python的新闻API调用代码实例
  18. 在ASP.NET 2.0中实现URL重写
  19. Structs框架原理
  20. Python:处理车辆控制单元MDF(CANApe数据)记录文件思路

热门文章

  1. #边学边记 必修5 高项:对人管理 第2章 项目沟通管理和干系人管理 2-1 沟通的基本概念
  2. Cadence OrCAD如何查看整页原理图中的元件的属性
  3. 04.两组比较_差异基因展示
  4. python人脸识别神器_教你用Python人脸识别自动开机,值得收藏
  5. 机载产品类别、层级及各自需要满足的适航要求
  6. 前端HTML、CSS、JS绘制三角形的方法
  7. 浪潮记(4):第一次
  8. java水浒传血战梁山泊,仿写题(共4分)读《三国演义》,我们可以领略到诸葛亮舌战群儒的风采;读《水浒传》,我们可以感受到众英雄梁山泊聚义的豪情;,。-七年级语文-魔方格...
  9. CSS3 Box Shadow
  10. AP RFC介绍:关于sRFC,aRFC,tRFC,qRFC和bgRFC