小谈液晶LED显示及FSMC

来源:互联网 发布:明朝朝鲜知乎 编辑:程序博客网 时间:2024/05/22 08:26

小谈液晶LED显示及FSMC  time:2014-3-25

 

只要是数字信号处理电路,就必须有时钟信号。它以明显过或是非明显的方式存在着,或是以婉约或非婉约的方式体现着。

在液晶面板中,像素时钟是一个非常重要的时钟,像素时钟是我平率与液晶面板的工作模式有关。当液晶频率越高时,它的像素频率也基本越高。在一行内,像素时钟的个数与液晶平面内一行所拥有的像素点相等。例如:800*480的液晶面板,一行有800个像素,则一行中(对应有效视屏区间)像素时钟也是1024个。

无论对TTL面板还是对于LVDS面板,像素时钟信号都有以下两个方面:

1.指挥RGB总线按顺序传输。

2.确保数据传输的正确性,无论是驱动板电路,还是驱动板电路

 

(图1)

(本图来源于数据手册)

 

以JD70MD-AT070TN92为例:

DCLK是像素时钟信号,

VS是帧同步信号

HS是行同步信号

DE是使能信号(仅使能时采样数据)

 

(图2)

典型时序图如图2:

分析图2,在使用液晶与tft控制器时,需要配置以下时序参数:

1.像素时钟配置上升沿或是下降时触发采样RGB总线

2.配置基本时钟信号,分频倍频

扫描一帧所需的时间:((VSPW+1)+(VBPD+1)+( LINEVAL+1)+(VFPD+1))个行时间。

扫描一行所所需的时间:((HSPW+1)+(HSPD+1)+(HFPD+1)+ (HOZVAL+1))个VCLK时间。 

而一个VCLK时间由LCD寄存器VIDCON0内的CLKVAL决定: PCLK/(CLKVAL+1)  

因此扫描一帧所需的时间:T=[(VSPW+1)+(VBPD+1)+(LINEVAL+1)+(VFPD+1)]*[(HSPW+1)+(HSPD+1)+(HFPD+1)+ (HOZVAL+1)]* PCLK/ (CLKVAL+1)

 

 

STM32的FSMC选择

MCU与TFT控制芯片相关的连线如下:

C S:用于片选

RS:用选择数据或是指令

D0~D15:数据信号

A0~A25:26根地址线

RD/WD:读写信号

*WAIT#:控制器反馈信号(告知MCU,tft是否繁忙)

 

为了使开发人员方便开发,ST在芯片设计上做足了功夫,但芯片手册又写得十分模糊,无形之中给开发人员增加了不少难度。我找了不少资料作了不少功课自认为能把FSMC部分说的清楚。

FSMC——FLEXIBLE SRAM MOMERY CONTROLLER,即灵活的静态储存器控制器,首先解释这个名词。什么叫静态存储器,内存分为两种:

1、DRAM 动态存储器

2、SRAM 静态存储器

SRAM,是一种昂贵的存储器,其速度极快紧跟CPU的存储速度,快于DRAM,快于磁盘。

一般我们PC机用的内存就是DRAM,其价格相对于SRAM廉价很多,存储速度也慢很多。这里用SRAM用于缓存视屏存储数据,其一秒可能刷新数百次,必须足够快的速度以满足需求。

 

FSMC共256M,这里我们只需要熟悉BANK1,也就是0x6000 0000~0x6fff ffff,bank1中也分NE1~4,其基分别 为、:0x6000 0000  \0x6400 0000

0x6800 0000

0x6C00 0000

这里NE的选择,可以在FSMC的配置代码中选择。

  如

  /* Enable FSMC Bank1_SRAM Bank */

  //FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE);  

  FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); 

 

 

 

FSMC的好处就是你一旦设置好之后,WR(写)、RD(读)、DB0-DB15这些控制线和数据线,

都是FSMC自动控制的。打个比方,当你在程序中写到:

*(volatile unsigned short int *)(0x60000000)=val;

那么FSMC就会自动执行一个写的操作,其对应的主控芯片的WE、RD这些脚,就会呈现出写的时序出来(即WE=0,RD=1),数据val的值也

会通过DB0-15自动呈现出来(即FSMC-D0:FSMC-D15=val  )。地址0x60000000会被呈现在数据线上

注:信号分两种

1、数据信号

2、指令信号

当RS置低电平时候为传输数据,的那个RS为高电平时传输指令

连接好相应的接线之后,要是我们想传输指令,假设A16接RS信号,那么我们要将地址改成0x60020000.如下:

*(volatile unsigned short int *)(0x60020000)=val;

那么我们要解决就是为什么A16对应0x60020000

A16对应第17 条地址线,那么2*2^16,也就是2*(2^4)^4 = 0x20000,

假如使用NE4接到为LCD的片选CS上,那么就对应基地址 0x6C000000,

如果RS接到地址线的 A0上,那么当 RS0时对应的地址就是 LCD_REG = 0x6C000000,(其实你用0x6CFFFFF0是一样的,因为只用到一根地址线).

RS1时对应的地址就是 LCD_RAM =0x6C000001,(0x6CFFFFF1一样对应 LCD_RAM,因为它一样对应 RS=1).

如果 RS接到 其他地址线上,情况是类似的。

比如接到 An上,那么

LCD_REG= 0x6C000000,

LCD_RAM= 0x6C000000 | (1<<n)

 

注意这个地址不是唯一的,只要这个地址能寻址到 BANK1  NE4上而且使 RS=0,那么就是 LCD_REG,使 RS=1,就是LCD_RAM.

0 0
原创粉丝点击