Bootstrap

FSMC驱动TFT显示屏(和驱动触摸屏)

我所使用的是3.5寸电容触摸显示屏
所谓电容触摸显示屏其实是两个屏幕的叠加:

  • 显示屏,其驱动芯片为ILI9488
  • 触摸屏,其驱动芯片为FT6336

一、显示屏

首先驱动显示屏,买到屏幕之后问卖家拿到驱动程序、原理图和技术文档。
这个屏幕有七种驱动方式:

(一)MIPI-DBI Operating Mode

1、MIPI-DBI Type B
IM2 IM1 IM0 Interface Data Pin in Use
0 0 0 24-bit bus (DB_EN=1) DB [23:0]
0 0 0 18-bit bus (DB_EN=0) DB [17:0]
0 0 1 9-bit bus DB [8:0]
0 1 0 16-bit bus DB [15:0]
0 1 1 8-bit bus DB [7:0]
表一 TFT驱动方式MIPI-DBI Type B
1、MIPI-DBI Type C
IM2 IM1 IM0 Interface Data Pin in Use
1 0 1 3-line SPI SDA,SDO
1 1 1 4-line SPI SDA,SDO
表二 TFT驱动方式MIPI-DBI Type C

(二)、TFT几种接口

MCU接口所用引脚:/RES , /CS , RS(寄存器选择) , /WR , /RD , DB0 ~ DB17 (18bit)
RGB接口所用引脚:DE , VSYNC , HSYNC , PCLK , R0~R5 , G0~G5 , B0~B5 (18bit)
RGB接口和MPU接口区别
SPI接口所用引脚:/RST、/CS、SDO、SDI、SCL、RS

MCU模式:目前最常用的连接模式,一般是80系统(68系统已经不存在了)。数据位传输有8位,9位,16位和18位。
优点是:控制简单方便,无需时钟和同步信号。
缺点是:要耗费GRAM,所以难以做到大屏。

RGB模式:大屏采用较多的模式,数据位传输也有6位,16位和18位之分。连线一般有:VSYNC,HSYNC ,DOTCLK,VLD,ENABLE,剩下就是数据线。
它的优缺点正好和MCU模式相反。

SPI模式:相对上面接口所用线较少,但速度也相对较慢,对于小屏来说用起来方便。

这里的三线和四线SPI的区别:
三线SPI: SDI(接MOSI)、CS、SCL
四线SPI: SDI、CS、SCL、RS(data/command,用于数据还是指令)
三线SPI通过发送9位data的第1位决定该data是数据还是指令,其余的D1到D8相对应是data/command

SPI总线也是一种事实标准,它没有被任何的国际委员会承认。
有的三线SPI指的是类似半双工的SISO,即将MISO和MOSI合并为一根线;有的则是直接将片选省略(直接拉低),即不需要片选(不共享SPI总线),一直都选择这一设备。
SPI 三线与四线区别总结

(三)FSMC介绍

可变静态存储控制器FSMC是STM32系列采用的一种新型存储器扩展技术,这种控制器被设
置在芯片内部集成超过256 KB Flash并且名字后缀为xC、xD以及xE的大容量产品所特有的存储控制机制。它可以方便地控制诸如SRAM/PSRAM/NOR/NAND/ROM/PC卡等存储器,只需要将对应管脚相连,芯片内部就能处理时序逻辑问题,操作起来十分方便。
FSMC地址映射及支持的存储器类型如图所示。FSMC管理1GB的映射地址,划分为4个大小都为4x64MB的存储块Bank,每个大存储块又划分为4个64MB的子Bank即Sector。由于驱动的是屏幕,而驱动NOR/PSRAM的方式和8080接口差不多,故FSMC选择Bank1,其地址映射为0x6000 0000至0x6FFF FFFF。
在这里插入图片描述

图一 FSMC内存划分

下面介绍8080接口和FSMC在时序和所用引脚的相似之处,从下面图二可以看到8080接口有这几种信号线:数据/命令信号(RS)、片选信号(CS)、写数据信号(WR)、数据信号(D[17:0])、读数据信号(RD)。而从图三可以看到FSMC主要有这些信号线:区块片选信号(FSMC_NEx)、读数据信号(FSMC_NOE)、写数据信号(FSMC_NWE)、地址信号(FSMC_A[25:0])、数据信号(FSMC_D[15:0])。

在这里插入图片描述

图二 8080时序图

在这里插入图片描述

图三 FSMC时序图

对比来看这两者很相似但却并不完全相同,由于FSMC没有数据/命令信号,所以利用它的地址线充当这种信号。假如使用地址线的FSMC_A0充当数据命令信号,并且使用第一个Bank的第四个Sector即FSMC_Bank1_NORSRAM4,如表3-3所示可知需要将寄存器基地址设置为0x6C00 0000,RAM基地址就设置为0x6C00 0000+(1<<(0+1))=0x6C00 0002,简单来说寄存器基地址就为命令操作的地址,而RAM基地址就是数据操作的地址。需要注意的是由于我们选择的是16位宽度的SRAM,FSMC在设置这些地址时STM32内部会自动它们右移1位对齐,方便用户操作。

表二 FSMC地址选择
Bank1所选区 片选信号 地址范围 [27:26] [25:0]
第1区 FSMC_NE1 0X60000000~0X63FFFFFF 00 FSMC_A[25:0]
第2区 FSMC_NE2 0X64000000~0X67FFFFFF 01 FSMC_A[25:0]
第3区 FSMC_NE3 0X68000000~0X6BFFFFFF 10 FSMC_A[25:0]
第4区 FSMC_NE4 0X6C000000~0X6FFFFFFF 11 FSMC_A[25:0]

(四)FSMC配置

表三 FSMC引脚配置连接表
FSMC引脚 GPIO配置 与屏幕连接的引脚
FSMC_A0 推挽复用输出模式 LCD_DC
FSMC_D[15:0] 同上 LCD_D[15:0]
FSMC_NOE 同上 LCD_RD
FSMC_NWE 同上 LCD_WR
FSMC_NE4 同上 LCD_CS

之后需要配置FSMC_NORSRAMInitTypeDef和FSMC_NORSRAMTimingInitTypeDef结构体,代码如下:

static void LCD_FSMC_Config ( void )
{
   
	FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
	FSMC_NORSRAMTimingInitTypeDef  fsmc_lcd; 	
	/* 使能FSMC时钟*/
	RCC_AHBPeriphClockCmd ( RCC_AHBPeriph_FSMC, ENABLE );

	fsmc_lcd.FSMC_AddressSetupTime      = 0x02;	 //地址建立时间
	fsmc_lcd.FSMC_AddressHoldTime       = 0x00;	 //地址保持时间
	fsmc_lcd.FSMC_DataSetupTime         = 0x05;	 //数据建立时间
	fsmc_lcd.FSMC_BusTurnAroundDuration = 0x00;
	fsmc_lcd.FSMC_CLKDivision           = 0x00
;