STM32——FSMC模块驱动4.3寸80并口TFTLCD

时间:2024-03-21 12:18:04

一、FSMC模块

1、什么是FSMC

FSMC(Flexible Static Memory Controller):灵活的静态存储控制器,能够与同步或异步存储器和16位PC存储器卡连接,STM32的FSMC接口支持包括SRAM、NAND FLASH、NOR FLASH和PSRAM等存储器。

2、FSMC的作用

FSMC,在外部存储器扩展方面具有独特的优势,可根据系统的应用需要,方便地进行不同类型大容量静态存储器的扩展。FSMC不仅支持多种数据宽度的异步读/写操作,而且支持对NOR/PSRAM/NAND存储器的同步突发访问方式。简单来说CPU可以通过FSMC来对外部扩展的不同种类静态存储设备进行读和写操作。

3、FSMC如何工作

首先FSMC将不同种类的存储设备分配到了不同的地址在区域,如下图所示。当接入的存储设备为NOR/PSRAM时,我们的操作地址范围为0x6000 0000h到0x6FFF FFFFh,当CPU向这些地址读写内容时,FSMC就会按照读写NOR/PSRAM的方式来进行操作,以此类推,CPU不需要了解外接的是哪种类型的设备,只要知道正确的地址范围就可以了。
STM32——FSMC模块驱动4.3寸80并口TFTLCD
FSMC的外部接口
FSMC作为一个存储控制器,数据总线FSMC_D[0:15]和地址总线 FSMC_A[0:25],写信号(WE,即WR)、读信号(OE,即RD)、片选信号(CS),如果SRAM支持字节控制,那么还有UB/LB信号。下图为控制一个外部存储器的接口原理图(16bit宽512K)。STM32——FSMC模块驱动4.3寸80并口TFTLCD

二、如何驱动4.3寸80并口TFTLCD

1、LCD是如何工作的

要让LCD按照规定的方式工作,首先应该给LCD发送一系列的配置指令及对应的参数,告诉LCD我们想让他以什么样的方式工作。
配置完成后,就是要给LCD缓存发送图像的数据了,这里操作LCD的缓存与操作外部存储器十分类似都是读或写指定位置的数据,不同之处在于外界的存储设备有专门的地址总线来确定当前发送或读取的数据在哪个位置,而LCD这是要先靠对应的指令和参数来告诉LCD缓存要操作的位置,然后再向该位置发送数据
下面两张图分别解释了他们的区别
FSMC写一个数据的流程:
STM32——FSMC模块驱动4.3寸80并口TFTLCD
FSMC画一个点的流程:
STM32——FSMC模块驱动4.3寸80并口TFTLCD

2、外部引脚分析

如下图所示,LCD外部接口包括:DB[17:1]16位双向数据线LCD_RS、命令/数据标志 (0:命令,1:数据)、LCD_CS:LCD片选信号
LCD_WR:LCD写信号、LCD_RD:LCD读信号、BL_CTR:背光控制信号T_MISO/T_MOSI/T_PEN/T_CS/T_CLK,触摸屏接口信号

STM32——FSMC模块驱动4.3寸80并口TFTLCD
与FSMC的接口相比,最大的区别在于LCD的接口不存在所谓的地址线,但需要有一根指令/数据选择线。在驱动过程中最大的问题就是如何用FSMC的地址线来给LCD指令/数据选择线(RS线)。

三、如何用FSMC地址来控制LCD的RS线

在正点原子stm32F4的库函数中使用了一个非常巧妙手法,通过写不同的地址的数据完成了对LCD数据和指令的区分,以及对应的数据或指令内容的传递。在驱动程序中设定了这样一个结构体,如图所示
STM32——FSMC模块驱动4.3寸80并口TFTLCD
通过对就结构体内部的LCD_REG(写指令地址)和LCD_RAM(写数据地址)访问不同地址从而改变数据总线的输出,然后巧妙地设定了LCD的基地址指向(0x6C000000 | 0x0000007E),当我们向LCD->LCD_REG地址写数据就可以实现写指令,而向LCD->LCD_RAM地址写数据就可以实现写数据。具体怎么实现慢慢往下看

1、为什么基地址是(0x6C000000 | 0x0000007E)

首先解释0x6c00 0000
STM32的FSMC存储块1(Bank1)用于驱动NOR FLASH/SRAM/PSRAM,被分为4个区,每个区管理64M字节空间,每个区都有独立的寄存器对所连接的存储器进行配置。0x6c00 0000对应的正好是FSMC控制的存储块一的第四个区的起始地址。
STM32——FSMC模块驱动4.3寸80并口TFTLCD
然后为什么是0x0000 007E
7E转化为二进制为0111 1110,LCD_REG是LCD的第一个成员变量,他的地址与及地址相同后八位也是0111 1110,而LCD_RAM为LCD的第二个成员其地址后八位应等于1000 0000(因为LCD_REG为16位故LCD_RAM地址加2),我们惊喜的发现第八位地址线在写指令时为0而在写数据时为1这正好与我们的RS线所需要的控制相同。那讲道理应该选则地址总线中的A7与RS相连,为啥原理图中用的是A6呢。
为什么是A6与RS相连
首先要明确该LCD为16位真彩显示(65536色),也就是说其内部每一个点地址对应的是一个十六位的数据,而CPU发给FSMC地址对应都都是一个八位数据,如下图所示
STM32——FSMC模块驱动4.3寸80并口TFTLCD
由于单片机内部与LCD缓存区字长的不同,LCD缓存区(16位对应一个地址)的地址加1则需要单片机(八位对应一个地址)对因内部地址加2,也就是说FSMC控制16为字长存储器时他的输出地址应等于CPU发送到AHB总线上的地址除以2(右移一位对齐)
这样当CPU操作第八位地址 7E(0111 1110)时,实际FSMC地址总线上的值为0011 1111(CPU地址右移一位),如此正好与RS一致的引脚就变成了A6而非A7。