每个VSYNC信号表示一帧数据的开始;每个HSYNC信号表示一行数据的开始,无论这些数据是否有效;每个VCLK信号表示正在传输一个像素的数据,无论它是否有效。数据是否有效只是对CPU的LCD控制器来说的,LCD根据VSYNC、HSYNC、VCLK不停的读取总线数据并显示。
image-20210719223036418
上图中的时序图,分为两个部分,上面部分是一帧的时序图,下面部分是一行的时序图我们分析下时序图中每个参数的意义(上图中的①->⑩) :
对应于上述的过程1,2, VSYNC信号(代表一帧的开始)需要持续一段时间②(VSPW+1), 电子枪认为收到了VSYNC信号(即白扫射了VSPW+1行,也可以说白扫射了(VSPW+1)个HSYNC周期时间),收到信号后,还要继续持续时间③(VBPD+1), LCD控制器才开始发送有效数据, 从而电子枪发射有效像素, 即(② + ③)为LCD屏幕上边的无效区, 对于①参数, 这是手册上的数据, 即告我们默认LCD控制器发送HSYNC信号为高电平,但实际LCD接受HSYNC硬件上有可能设计成低电平有效, 所以可以对寄存器进行修改, 让LCD控制器发出HSYNC控制信号为低电平
tips: VSPW VBPD参数会根据datasheet来具体设置(下文会提到), 设置这些参数的目的是告诉LCD控制器电子枪的反应时间以便发送帧数据(比如电子枪, 发送HSYNC后, 得知道电子枪的反应时间后才开始传送有效数据)
④为, 即有效数据为(LINEVAL+1)行,我们分辨率为480*272,所以LINEVAL为271 *
⑤VFPD+1参数对应于过程5, 当扫描到最后一行结束时(即一帧结束了),LCD控制器不会再发送有效像素数据, 此时电子枪会收游离一段时间(会继续往下白扫好几行(VFPD+1行)无效数据), 这个时间需要告诉LCD控制器,以便控制器知道等待多长时间在发送VSYNC信号,从而进行下一帧的开始
对于⑥、⑦、⑧、⑩三个参数,对应于上述过程3, 接受到HSYNC信号(表示一行的开始)后,此信号必须持续一段时间⑦(HSPW+1个VCLK周期)后, 电子枪才认为信号有效,接受到HSYNC信号后,电子枪还要反应一段时间⑧(白白扫射HBPD+1个VCLK周期后,也可以说发射HBPD+1个无效像素点)后, LCD控制器才开始传送有效数据给电子枪, 当一行扫描结束后,即LCD控制器不发射有效数据了,此时电子枪要游离一段时间⑩(HFPB+1), 这段时间需要告诉LCD控制器,以便让LCD控制器等待此段时间后在发送HSYNC信号从而进行下一行的扫描, 对于⑨参数来说, 分辨率为480*272,所以HOZVAL = 479, 即一行有480个有效数据, 注意有效数据的开始时机, 即需要经历(⑦、⑧)时间后,LCD控制器才开始发送有效数据 。
参数计算
根据LCDdatasheet确认上述参数的值, 下图为AT043TN24数据手册的时序图, 我们很容易对应上面2440手册中LCD的时序图中的参数
image-20210719223335769
上图中已经标注对应关系,就不细说了,强调一点, VSYNC与HSYNC信号都是低电平有效,但是2440手册中LCD时序是高电平有效,所以在配置寄存器时需要注意,要将这两个VSYNC,HSYNC信号设置成低电平有效(极性反转: 默认为高电平,反转后为低电平)
image-20210719223531086
我们可以看到,上图中左边是具体的参数值,Min(最小值), Typ.(典型值), Max(最大值),我们举个例子,在右图中,我们知道关系 VSPW+1 = tvp, 我们在左图中发现tvp的典型值为10, 单位是H(Hsync), 所以VSPW+1 = 10==> VSPW=9, 其余参数的取值都能通过上述方法确定, 还有个问题,VSPW, VSPD,VFBD的时间都依赖于HSYNC周期时间,那么HSYNC周期时间如何确认呢? 查看了下寄存器的设置中好像也没找到相关设置,最后在2440手册中找到这句话
image-20210719223757113
其实意思就是说 LCD控制器会根据电子枪发射像素点的个数来确认HSYNC时间的,比如我们LCD屏幕分辨率是480*272, 当发出VSYNC信号后,要经过VSPW+1反应时间,即VSPW+1个HSYNC周期,我们假设VSPW+1的值为10,那么就是10个HSYNC周期,也就是电子枪扫描了10 x 480个像素点后,LCD控制器就认为经历了10个HSYNC周期时间 。
1、VCLK(Hz) = HCLK/[(CLKVAL+1)*2]
2、VSYNC =1/[ {(VSPW+1)+(VBPD+1)+(LIINEVAL+1)+(VFPD+1)} x {(HSPW+1)+(HBPD+1)+(HFPD+1)+(HOZVAL+1)} x {2x (CLKVAL+1) / (HCLK )} ]
3、HSYNC = 1/[{(HSPW+1)+(HBPD+1)+(HFPD+1)+(HOZVAL+1)} x {2x (CLKVAL+1) / (HCLK )}]
image-20210718175250797
将VSYNC、HSYNC、VCLK等信号的时间参数设置好之后,并将帧内存的地址告诉LCD控制器,它即可自动地发出DMA传输从帧内存中得到图像数据,最终在上述信号的控制下出现在数据总线VD[23:0]上。用户只需要把要显示的图像数据写入帧内存中。
LCD控制器中REGBANK的17个寄存器可以分为6种,如下表所示:
对于TFT-LCD,一般情况下只需要设置前两种寄存器,即LCDCON和LCDSADDR。
名称 | 说明 |
---|---|
LCDCON1~LCDCON5 | 用于选择LCD类型,设置各类控制信号的时间特性等 |
LCDSADDR1~LCDSADDR5 | 用于设置帧内存的地址 |
TPAL | 临时调色板寄存器,可以快速的输出一帧单色的图像 |
LCDINTPND | 用于LCD的中断,在一般应用中无需中断 |
LCDSRCPND | 用于LCD的中断,在一般应用中无需中断 |
LCDINTMSK | 用于LCD的中断,在一般应用中无需中断 |
REDLUT | 专用于STN-LCD |
GREENLUT | 专用于STN-LCD |
BLUELUT | 专用于STN-LCD |
DITHMODE | 专用于STN-LCD |
TCONSEL | 专用于SEC TFT-LCD |
主要用于选择LCD类型、设置像素时钟、使能LCD信号的输出等,格式如下表所示:
功能 | 位 | 说明 |
---|---|---|
LINECNT | [27:18] | 只读,每输出一个有效行其值减一,从LINEVAL减到0; |
CLKVAL | [17:8] | 用于设置VCLK(像素时钟); |
MMODE | [7] | 设置VM信号的反转效率,专用于STN-LCD; |
PNRMODE | [6:5] | 设置LCD类型,对于TFT-LCD设置0b11; |
BPPMODE | [4:1] | 设置BPP,对于TFT-LCD:0b1100 = 16BPP; |
ENVID | [0] | LCD信号输出使能位,0:禁止,1:使能; |
image-20210718173545208