LCD和FSMC的那点事

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字符是什么意思,画了个图,大家都明白。

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

  • 14
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
初始化 TFTLCDFSMC 的步骤如下: 1. 配置 TFTLCD 的引脚,并初始化相应的 GPIO。 2. 配置 FSMC 的时序参数和访问模式。 3. 配置 TFTLCD 的像素大小和颜色模式。 以下是一些具体实现步骤: 1. 配置 TFTLCD 的引脚 TFTLCD 的引脚需要与 STM32 的引脚相连接。在配置时需要注意,不同的引脚需要设置为不同的模式,如输入模式、推挽输出模式、复用推挽输出模式等。 2. 初始化 GPIO 通过调用相应的库函数,可以初始化 GPIO,并将其设置为相应的模式。例如,对于 STM32F4 系列的 MCU,可以通过以下代码初始化 GPIOD 的引脚 0-15: ``` GPIO_InitTypeDef GPIO_InitStruct; /* Enable GPIOD clock */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); /* Configure PD0 to PD15 in alternate function mode */ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &GPIO_InitStruct); ``` 3. 配置 FSMC 的时序参数和访问模式 在 STM32 上,可以通过 FSMC 控制器来实现与外部存储器的通信。在使用 FSMC 控制器时,需要先配置相应的时序参数和访问模式,使其能够与具体的外部存储器兼容。 以下是一个示例代码,用于配置 FSMC 控制器: ``` FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStruct; FSMC_NORSRAMTimingInitTypeDef FSMC_NORSRAMTimingInitStruct; /* Enable FSMC clock */ RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE); /* Configure FSMC timing parameters */ FSMC_NORSRAMTimingInitStruct.FSMC_AddressSetupTime = 1; FSMC_NORSRAMTimingInitStruct.FSMC_AddressHoldTime = 0; FSMC_NORSRAMTimingInitStruct.FSMC_DataSetupTime = 5; FSMC_NORSRAMTimingInitStruct.FSMC_BusTurnAroundDuration = 0; FSMC_NORSRAMTimingInitStruct.FSMC_CLKDivision = 0; FSMC_NORSRAMTimingInitStruct.FSMC_DataLatency = 0; FSMC_NORSRAMTimingInitStruct.FSMC_AccessMode = FSMC_AccessMode_A; /* Configure FSMC NOR/SRAM Bank1 */ FSMC_NORSRAMInitStruct.FSMC_Bank = FSMC_Bank1_NORSRAM1; FSMC_NORSRAMInitStruct.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; FSMC_NORSRAMInitStruct.FSMC_MemoryType = FSMC_MemoryType_SRAM; FSMC_NORSRAMInitStruct.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; FSMC_NORSRAMInitStruct.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; FSMC_NORSRAMInitStruct.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; FSMC_NORSRAMInitStruct.FSMC_WrapMode = FSMC_WrapMode_Disable; FSMC_NORSRAMInitStruct.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; FSMC_NORSRAMInitStruct.FSMC_WriteOperation = FSMC_WriteOperation_Enable; FSMC_NORSRAMInitStruct.FSMC_WaitSignal = FSMC_WaitSignal_Disable; FSMC_NORSRAMInitStruct.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; FSMC_NORSRAMInitStruct.FSMC_WriteBurst = FSMC_WriteBurst_Disable; FSMC_NORSRAMInitStruct.FSMC_ReadWriteTimingStruct = &FSMC_NORSRAMTimingInitStruct; FSMC_NORSRAMInitStruct.FSMC_WriteTimingStruct = &FSMC_NORSRAMTimingInitStruct; /* Initialize FSMC NOR/SRAM Bank1 */ FSMC_NORSRAMInit(&FSMC_NORSRAMInitStruct); ``` 4. 配置 TFTLCD 的像素大小和颜色模式 TFTLCD 的像素大小和颜色模式需要与实际的 TFTLCD 显示屏相对应。一般来说,TFTLCD 的像素大小为 240x320,颜色模式为 RGB565。 以下是一个示例代码,用于配置 TFTLCD 的像素大小和颜色模式: ``` /* Set TFTLCD pixel size and color mode */ TFTLCD_SetSize(240, 320); TFTLCD_SetColorMode(TFTLCD_COLOR_MODE_RGB565); ``` 综上所述,初始化 TFTLCDFSMC 的过程需要分别配置相应的引脚、GPIO、FSMC 时序参数和访问模式、TFTLCD 像素大小和颜色模式等参数,以实现 STM32 与外部 TFTLCD 显示屏的数据交换。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值