1.SPI
2.FSMC,就是常说的8080(或者称80并口,都是一个意思)
3.LTDC,就是RGB的接口
概念:
FM指帧缓存,即:GRAM
true colo ,就是RGB888
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必须硬复位后才能初始化。
为什么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自动右移一位对其的原理。