当前位置: 首页 > 产品中心 > lcd显示屏-总成

TFTLCD之FSMC详解

发表时间: 2024-01-09 作者: lcd显示屏-总成
产品详情

  1~21号IO口用于LCD控制器,23号IO口用于LCD的背光控制,这样LCD的显示总共需要22个IO口。但是,电源和地线我们绝对不能忽略,模块需要双电源供电:5V和3.3V才能够顺利工作,5V电源用于背光供电,3.3V用于除背光外的其他电源部分供电。

  NT35510支持多种时序读写操作,我们这里使用的是8080并口操作,读/写时序如下:

  FSMC,即灵活的静态存储控制器,能够与同步或异步存储器和16位PC存储器卡连接,STM32的FSMC接口支持包括SRAM、NANDFLASH、NORFLASH和PSRAM等存储器。FSMC的框图如图18.1.2.1所示:

  从上图我们大家可以看出,STM32的FSMC将外部设备分为3类:NOR/PSRAM设备、NAND设备、PC卡设备。他们共用地址数据总线等信号,他们具有不同的CS以区分不同的设备,比如本章我们用到的TFTLCD就是用的FSMC_NE4做片选,其实就是将TFTLCD当成SRAM来控制。

  这里我们介绍下为什么可以把TFTLCD当成SRAM设备用:首先我们了解下外部SRAM

  的连接,外部SRAM的控制一般有:地址线)、数据线)、写信号(WE)、读信号(OE)、片选信号(CS),如果SRAM支持字节控制,那么还有UB/LB信号。而TFTLCD的信号我们在18.1.1节有介绍,包括:RS、D0~D15、WR、RD、CS、RST和BL等,其中真正在操作LCD的时候需要用到的就只有:RS、D0~D15、WR、RD和CS。其操作时序和SRAM的控制完全类似,唯一不同就是TFTLCD有RS信号,但是没有地址信号。

  FSMC听起来很高大上,其实FSMC就是一个MCU与外部存储器(SRAM,FLASH等)读写数据的一个接口,我们可以配置FSMC的寄存器从而实现MCU可以根据特定的时序与外部存储器进行数据的交互(存储/读取)。有人会疑问:TFTLCD又不是存储器不具备存储功能但是却可以与MCU通过读写时序交互信息?

  TFTLCD确实不是SRAM这样的数据存储器,不具备数据存储功能,但是FSMC的扩展功能就在于此,TFTLCD的读写时序和SRAM大致一样,因此我们使用FSMC去充当MCU与TFTLCD的沟通桥梁。不止TFTLCD是这样,其他的具有和FSMC支持的存储器相同/类似时序的设备都通过FSMC与MCU建立起数据沟通的桥梁。

  FSMC是沟通CPU与外部存储器之间的桥梁。FSMC在CPU内存中的映射地址如下所示:

  我们可以好好地品味上图的含义,FSMC一个块有64M的存储空间,存储空间里存储的是数据吗?不是的,存储的是外设地址,当我们在存储块中的访问单元序号+1,对应的外设存储单元的访问地址就自加8(如果外设数据存储的数据宽度为8b的话)。由此,我们可以得到当输出长度为8b时,FSMC与外部SRAM的地址映射关系:

  既然明白了CPU和外部SRAM之间的地址映射关系,那么就拿STM32读写外部SRAM为例说明FSMC的功能:

  FSMC是一个数据管理设备负责变量的读取和发送,既然是管理设备那就应该将被管理的对象纳入自己的势力范围之中,即将被托管的变量定义在自己在内存中的地址映像之中。

  FSMC作为CPU与外部SRAM沟通的桥梁,那就得说他们两个人都认识的话——读写时序,两者沟通关系如下所示:

  3. 对变量进行读写操作时,FSMC会进行在CPU和SRAM外部存储器之间进行如下操作:

  首先,对FSMC管理的变量Var进行读写就会引起FSMC产生读取SRAM中数据的时序,引发对SRAM的读写操作。

  读写控制是FSMC自动控制的,你向指定地址写数据(如*(uint32_t*)0x6C000080=var),FSMC会自动控制相应的引脚(CS、RS、RD、WR等)发送写数据时序,读也是一样的。

  因此,如果是读LCD,则使用的一定是LDR指令(LoadRegister);而写LCD,则使用的是STR指令(StoreRegister)。这是由于不同的指令会对应不同的总线访问时序。

  从上面可以得出结论,只要是访问一个存储单元并且写入数据(将变量的值赋值给存储单元),那么FSMC就会控制CS、RS、RD、WR等对这个存储单元进行写操作;我们访问一个存储单元并进行读操作(把存储单元的数据读出来并赋值给变量),那么FSMC就会控制CS、RS、RD、WR等对这个存储单元执行读操作。

  像这种地址线和数据线分开的数据存储器,一般的向数据存储器写数据的时序如下所示:

  我们前面说过FSMC进行读写操作的原理,但是当我们读FSMC中的地址映射单元时,FSMC会输出如下图所示的读时序:

  这并不是8080时序,而且我们疑问的是TFTLCD中只有地址线],而没有RS信号来决定收发数据还是收发命令。这就很懵了,RS的0/1分别代表着命令/数据,但是我上哪里找0/1呢?此时换位思考一下,惊奇的发现地址线]可以帮到我们:

  假设TFTLCD只有两个寄存器:数据操作寄存器/命令操作寄存器。当TFTLCD收到寄存器地址”addr=1“时,此时命令操作寄存器响应;同理,当TFTLCD收到寄存器地址“addr=0”时,此时数据操作寄存器响应。以上一波操作就可以把FSMC读写SRAM的时序神奇地转化为8080读写时序了。

  我们将A[10]作为RS引脚用于控制TFTLCD是操作命令还是操作数据。如何使得TFTLCD操作数据时A[10]=1,操作命令时A[10]=0是关键:

  我们将这个地址强制转换为LCD_TypeDef结构体地址,那么可以得到LCD->

  LCD_REG的

  0X6C00,0800(结构体地址自增),对应A[10]的状态为1(即RS=1),从而实现对RS的控

  STM32的FSMC支持8/16/32位数据宽度,我们这里用到的LCD是16位宽度的,所以在设置的时候,选择16位宽就OK了。我们再来看看FSMC的外部设备地址映像,STM32的FSMC将外部存储器划分为固定大小为256M字节的四个存储块:

  从上图能够准确的看出,FSMC总共管理1GB空间,拥有4个存储块(Bank),本章,我们用到的是块1,所以在本章我们仅讨论块1的相关配置。

  STM32的FSMC存储块1(Bank1)被分为4个区,每个区管理64M字节空间,每个区都有独立的寄存器对所连接的存储器进行配置。Bank1的256M字节空间由28根地址线])寻址。

  不论外部接8位/16位宽设备,FSMC_A[0]永远接在外部设备地址A[0]。

  这里,TFTLCD使用的是16位数据宽度,所以HADDR[0]并没有用到,只有HADDR[25:1]是有效的,对应关系变为:HADDR[25:1]→FSMC_A[24:0],相当于右移了一位,这里请大家特别留意。另外,HADDR[27:26]的设置,是不需要我们干预的,即当我们设置了片选HADDR[27:26]自动被设置为相应的数值。比如:当你选择使用Bank1的第三个区,即使用FSMC_NE3来连接外部设备的时候,即对应了HADDR[27:26]=10,我们要做的就是配置对应第3区的寄存器组,来适应外部设备即可。

  其实,我们看到一个Bank存储块中又有4个子块,我们称之为扇区(Sector),它的配置不是通过片选而是通过配置寄存器实现,Bank1的寄存器一共有12个(BCKx,BTKx,BWTKx,x=1,2,3,4)。

  从上表可以看出,FSMC最大访问的存储器位数就是512M,例如Bank1的第1区的寻址范围是0X60000000~0X63FFFFFF,对应的外部存储器的地址为0~0X03FFFFFF,即我们可以访问的位的地址从0~512M。

  此时,我们可以用FSMC一个数据存储块最大管理的位数反推FSMC地址映射范围,可得如下结果:

  HADDR的[25:0]位所表示的地址为0~64M,但是当数据长度为16b时,需要访问的地址为0~32M,因此HADDR中只用到了25位。当数据长度为16b时,HADDR的有效位为[25:1]而且外部存储器的地址线开始寻址,因此要求HADDR向低位偏移一位,如下图所示:

  当数据长度为16b时,FSMC中的地址映射仍是一个地址寻址一个字节的数据,但是FSMC地址自增就变了,变成了每次自加2,而非原来的自加1,16b的地址映射关系如下:

  位带操作,乍一听名字,也很高大上。但是位带操作实质上就是一个寻址的手段而已。在我们做一件事情时,总喜欢先顶层规划,然后再细分各个工作流程。C语言中常用的寻址方式就是位带操作,我们再C语言中访问一个结构体变量元素的地址,一般常常确定这个结构体变量的地址,再根据结构体中的元素相对于结构体首地址的偏移量确定其具置,并且访问该地址的信息。

  0x6C000000代表的是FSMC中的Bank1的基地址,而0x000007FE代表的是Bank1的存储块1相对于Bank1的地址偏移量。这样操作就使得LCD_BASE代表FSMC中Bank1的存储块1的地址,然后我们使用强制类型转换,就在LCD_BASE地址上建立了一个结构体变量LCD,其内存分布如下所示:

  存器设置(其中x=1~4,对应4个区)。通过这3个寄存器,可以设置FSMC访问外部存储器的时序参数,拓宽了可选用的外部存储器的速度范围。FSMC的NORFLASH控制器支持同步和异步突发两种访问方式。这里,TFTLCD使用的是异步突发访问模式。

  对于异步突发访问方式,FSMC主要设置3个时间参数:地址建立时间(ADDSET)、数据建立时间(DATAST)和地址保持时间(ADDHLD)。FSMC综合了SRAM/ROM、PSRAM和NORFlash产品的信号特点,定义了4种不同的异步时序模型。选用不同的时序模型时,需要设置不同的时序参数:

  我们这里读写的时序是SRAM,因此我们可以选用模式1/模式A。但是,我们知道TFTLCD的写速度要快于读速度,因此我们分别配置读写速度——模式A。模式A与模式1的最大区别在于:模式1中读写速度一样,模式A中读写速度不同。

  模式A支持独立的读写时序控制,这个对我们驱动TFTLCD来说非常有用,因为TFTLCD在读的时候,一般比较慢,而在写的时候可以比较快,如果读写用一样的时序,那么只能以读的时序为基准,从而导致写的速度变慢,或者在读数据的时候,重新配置FSMC的延时,在读操作完成的时候,再配置回写的时序,这样虽然也不会降低写的速度,但是频繁配置,比较麻烦。而如果有独立的读写时序控制,那么我们只要初始化的时候配置好,之后就不用再配置,既可以满足速度要求,又不需要频繁改配置。

  在模式A中,我们无非关注两个参数:地址建立时间(ADDSET)、数据建立时间(DATAST)。

  首先,我们先要知道什么是建立时间:建立时间(Tsu:setuptime)是指在时钟沿到来之前数据从不稳定到稳定所需的时间,如果建立的时间不满足要求那么数据将不能在这个时钟上升沿被稳定的打入触发器。

  地址建立的含义:在读取数据之前一定要识别到A[25:0]地址线中的稳定地址信号,这样我们才能进行读写操作。

  RDX和WRX均为无效电平的这段时间不是无效时间,适用于A[25:0]建立稳定的地址信号的时间,因为在读写数据之前,必须要通过地址线建立稳定的联系才行。

  首先,我们要清楚何为保持时间:保持时间(Th:holdtime)是指数据稳定后保持的时间,如果保持时间不满足要求那么数据同样也不能被稳定的打入触发器。

  数据所存的含义:NT35510芯片可以识别稳定的数据。为了我们识别到稳定可靠的数据,数据保持时间必须大于RDX低电平持续时间,即RDX的上升沿必须出现在地址保持时间之内。

  注意:最后的2HCLK是用于存储器将读取到的数据存入锁存器(即保存数据)用的。

  要确定ADDSET和DATAST就必须参考“芯片NT35510的读写时序”,如下所示:

  因此,ADDSET最小为250ns/HCLK,DATAST最小为150ns/HCLK,其中,FSMC接在AHB总线上,由HCLK驱动,因此单位周期为HCLK,ADDSET代表着地址线上的地址建立所需的单位周期数量(记得向正无穷取整),DATAST代表着数据线上数据保持的单位周期数量(记得向正无穷取整)。

  但是,为了兼容其它型号的屏幕驱动芯片以及STM32F10x系列的缺陷,正点原子例程中ADDSET和DATAST设置如下:

  由于STM32F103FSMC的性能问题,就算设置ADDSET为0,RD的高电平持续时间也达到了190ns以上,所有,我们这里可以设置ADDSET为较小的值,本章我们设置ADDSET为1,即2个HCLK周期,实际RD高电平大于200ns。

  为了兼容其他屏,我们这里设置DATAST为15,也就是15+1=16个HCLK周期,时间大约是234ns。

  对NT35510来说,这两个时间只需要15ns就够了,比读操作快得多。所以我们这里设置DATAST为3,即4个HCLK周期,时间约为55ns(因为9320等控制器,这个时间要求比较长,要50ns)。然后ADDSET(也存在性能问题)设置为0,即1个HCLK周期,实际WR高电平时间大于100ns。

  扩展模式使能位,也就是是否允许读写不同的时序,很明显,我们本章需要读 写不同的时序,故该位需要设置为 1。

  扩展模式使能位,也就是是否允许读写不同的时序,很明显,我们本章需要读 写不同的时序,故该位需要设置为 1。

  这个容易理解,我们要使用到该存储块控制 TFTLCD,当然要 使能这个存储块了。

  由于我们配置了扩展模式位使能,因此FSMC对SRAM的读写速度不同,FSMC_BTRx代表着存储块x的读时序。如果扩展模式位失能呢个,则读写时序的配置均有该寄存器完成。

  00 表示访问模式 A;01 表示访问模式 B;10 表示访问模式 C; 11 表示访问模式 D,本章我们用到模式 A,故设置为 00。

  由于我们配置了扩展模式位使能,因此FSMC对SRAM的读写速度不同,FSMC_BWTRx代表着存储块x的写时序。

  FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存储器数据宽度为16bit

  液晶显示器(LCD)是一种常用的显示屏,在许多电子科技类产品中常常使用它来以文本或图像格式显示信息。LCD用于在其屏幕上显示字母、数字等字符。 ...

  CPU中使用寄存器来临时存储信息,这一些信息可以是要处理的数据,也可以是指向要获取的数据的地址。在8051单片机中,有一种数据类型是8位,从 ...

  8051的CPU在每个机器周期期间,顺序采样每个中断源,CPU在下一个机器周期按优先级顺序查询中断标志,如查询到某个中断标志为1,将在下一个 ...

  1 定时器 计数器8051系列单片机至少有两个16位内部定时器 计数器(T C,Timer Counter),提供了3个定时器,其中两个基本定时器 计数器分别 ...

  本文采用完全集成混合信号片上系统(MCU)的C8051F330和无线设计了一套移动电话防盗报警系统。该报警系统利用射频收发器可实现 ...

  意法半导体发布结合软硬件的安全方案Secure Manager 开发安全的嵌入式应用从此变得更简单

  Molex 莫仕Board-in立式和卧式板载连接器,2.00和2.50毫米端子间距

  汇顶科技两款芯片助力OPPO Find X7封神,实现移动安全与音频新体验

  电感知识大考:遇到这样一些问题怎么办?|“MPS电感探索季:发现小且不凡的秘密!”第一站

  站点相关:综合资讯51单片机PIC单片机AVR单片机ARM单片机嵌入式系统汽车电子消费电子数据处理视频教程电子百科其他技术STM32MSP430单片机资源下载单片机习题与教程