LCD和FSMC的那点事

来源:互联网 发布:大数据数据收集论文 编辑:程序博客网 时间:2024/05/09 10:01

A.先说一下几种LCD interface,包括但不限于以下三种:

1.SPI

2.FSMC,就是常说的8080(或者称80并口,都是一个意思)

3.LTDC,就是RGB的接口

概念:

FM指帧缓存,即:GRAM

true colo ,就是RGB888

B.由于我使用的LCD接口是16位的80并口(16位代表有16条数据线),现在说一下80并口的标准信号,要驱动一个80并口的LCD包括以下7项信号(其中第8项位触摸屏接口的信号,可先不理会):

1.LCD_CS:LCD片选信号

2.LCD_WR:LCD写信号

3.LCD_RD:LCD读信号

4.DB[17:1]:16位双向数据线

5.LCD_RST:硬复位LCD信号

6.LCD_RS:命令/数据标志(0:命令,1:数据)

7.BL_CTR:背光控制信号

8.T_MISO/T_MOSI/T_PEN/T_CS/T_CLK,触摸屏接口信号

还有一个题外话,就是LCD的驱动初始化代码是由厂家提供的(初始化代码将LCD调到最佳显示效果),LCD必须硬复位后才能初始化。

C.再说一下为何FSMC可以用来驱动LCD,原因是FSMC的读写时序和LCD的读写时序很相似,于是把LCD当成一个外部存储器来用。利用FSMC在相应的地址读或写相关数值时,STM32的FSMC会在硬件上自动完成时序上的控制。所以我们只要设置好读写相关时序的寄存器后,FSMC就可以帮我们完成时序上的控制了。对于FSMC驱动LCD有一个比较难理解的地方就是当你的LCD使用16位宽度的数据传输(也就是有16条数据线,就像我上面说的我使用的是16位的80并口)的时候,HADDR和FSMC_A这个地址块的对应问题(使用8位数据则不用考虑此问题)。先开STM32中文参考手册_V10.pdf第327页,看到下图的红色下划线的文字,这个问题就是体现在这几句话上。


为什么FSMC外接16位宽度存储器(前面说了我们把LCD当成外部存储器来用)的时候和外接8位宽度存储器的时候,HADD和FSMC_A对应的地址不一样呢?下面我来说一下。

第一,我们先要明白FSMC_A是STM32的硬件的外部接口,是我们看得见摸得着的。然后HADDR是需要转换到外部存储器的内部AHB地址线(如上图所述),这个我们是看不见摸不着的,但是,我们可以用代码来控制它(理解这点很重要),我们代码直接操作着HADDR,而会间接操作到FSMC_A。所以当我们的LCD的16位(16位与8位是可选择,一般是是通过LCD的FPC上的电阻进行选择的,这点不详细讲)的80并口和STM32的FSMC接口连接好之后,要操作的就是HADDR,因为HADDR会间接操作到FSMC_A。

    第二,外部存储器不都是按字节访问的(如上图所述),也就是说当你找到某个地址之后,你可以读出一个字节的数据(8位宽度)或者两个字节的数据(16位宽度)或者更多字节的数据(其他宽度),而这,就是依靠你外部存储器的数据宽度是多少。而所谓16位数据宽度就是说一个地址对应两个字节,当然了8位的数据宽度就是一个地址对应一个字节。

    第三,从上图中,我们知道当你是8位数据宽度的时候是26根数据线HADDR[25:0],而16位数据宽度的时候是25根数据线[25:1]。前者可能大家都比较好理解,算下来就是有64M的地址空间(我们把LCD当成SRAM来用,把LCD接在了bank1上,bank1就是外接NOR/PSRAM用的,接到bank1后,再随便接到bank1的四个分区中的一个,每个bank大小512M,每个bank中的每个区64M),每个地址对一个字节空间大小,存储器储存空间大小为64M。后者算下来就是有32M的地址空间,他前面8位数据宽度时不同的是16位数据宽度每个地址对应两个字节的空间大小,这样算的话,它也是有32M*2=64M的存储空间大小(注意这里和前面的多少多少M指的是地址的数目,而不是实际对应的存储器存数空间的大小,就是说要注意区分地址空间大小和存储空间大小,因为前面说了一个地址可能对应一个字节大小的空间,也可能对应两个字节大小的空间)。

      到了这里,大家应该都知道为什么16位数据宽度时HADDR的地址线需要减少一根了,因为16位数据宽度时需要的地址的数量只是8位数据宽度时的一半。

     第四,现在假设我们的LCD的LCD_RS(命令/数据标志线)是接在STM32的外部接口FSMC_A[10]上的。由于STM32规定当使用16位数据宽度的时候HADDR[25:1]FSMC_A[24:0]对应相连,HADDR[0]未接(如上图所述)。也就是说当使用16位数据宽度时有如下HADDR和FSMC_A有如下对应关系:


很明显,当使用16位数据宽度的时候,HADDR[0]这个地址是没用的。而因为我们的LCD的LCD_RS(命令/数据标志线)是接在STM32的外部接口FSMC_A[10]上的,所以实际上我们要操作的事HADDR[11]这根地址线。其实这就是所谓的当使用16位数据宽度的时候,HADDR自动右移一位对其的原理。

D.我的LCD的控制IC是ILI9314,讲一下我使用时遇到的一些问题。

其实我遇到的主要是横竖屏切换时问题,就是当我们从横竖屏间切换时应该要注意哪些地方,或者说白了,就是要设置哪些寄存器。
第一,先说一下,所谓的横竖屏切换指的是LCD的一个扫描方式,如下图展示了其中的三种扫描方式:

扫描方式确定好了,其实也就是确定好横屏或者竖屏了。同时该方向上的虚拟原点坐标(其实LCD的原点只有一个,就是物理的原点坐标)也确定好了,像上图中的B就是当确定好了扫描方式后的对应的虚拟原点(0,0)坐标所在的位置。
当LCD处于不是默认扫描方式时(也就是虚拟坐标和物理坐标不是一样的时候),需要做虚拟坐标到实际坐标的转换公式如下:

下面我举个例子说明一下,他们之间的转换关系:

上图中黑色的都是物理上的坐标,而红色的是改变扫描方式后的视角,红色的(10,20)是相对于横屏状态下虚拟原点坐标(0,0)来说的。当我们在横屏状态时想在(10,20)打红色的点,就必须做坐标转换,不然的话就会打到黑色的点那里去了。其实从虚拟坐标到物理坐标的转换控制IC已经帮我们做好了,我们其实不用理会。上图中的蓝色箭头指向的其实就是转换公司,它和上上图中B5,B6,B7为110时的公式是一样的。其实就是(239-y,x),其中这里的x和y都是在横屏状态下你想打的点。
第二,我总结一下横竖屏切换(扫描方式改变)时需要注意的地方。
1,x坐标的开始和结束地址,y坐标的开始和结束地址要重新设置,因为横竖屏间的切换时x,y相应也会变化,所以需要重新设置(调换即可)。
2,所谓的设置当前坐标,其实就是设置x,y的开始地址。和上面的设置方法一样,这时可以省略不设置x,y的结束地址。
3,最后说一下,所谓的显示字符是怎么回事。以及1206,1608字符是什么意思,画了个图,大家都明白。

如果有哪里我理解错了,请指正我。

0 0
原创粉丝点击