LCD显示
一、液晶屏相关
液晶屏引出的8080通讯接口及说明
对应的引脚连接到STM32 接收指令和数据
使用设备需要通过8080接口与LCD进行通讯相关时序图如下:
写命令时序
通讯时,STM32先给LCD控制芯片传输某命令(命令代码+参数);DCX在命令传输时是低电平,在数据传输时是高电平;WRX引脚代表写有效,须在低电平时控制芯片才能接收数据。以读地址为例:
下图为读地址的命令
五行数据。第一行数据代表命令代码(D3h),后四行为参数。后四行第一个数据为无效;第二个数据传输完成,从机返回0x00;最后两位数据(9806)就是地址数据。如果返回了9806,则证明STM32与9806的通讯正常。
2Ah和2Bh命令(显示图形)
2Ah:四个参数分别是起始的列和结束的列,具体实现效果如下
2Bh:四个参数是起始的页(Start Page)和结束的页(End Page),实际是设置开始的行和结束的行,解释如下
This command is used to define the area of the frame memory the MPU can access. This command makes no change on the other status of the driver.The values of SP[15:0] and EP[15:0] are referred when RAMWR(意为写入字符) command is applied.Each valuerepresents one Page line in the Frame Memory.
实现完框架传输后,继续通过该数据线(9806数据线)传输像素数据(本文中是RGB565),对规定框架进行填充颜色。
二、FSMC外设模拟8080时序与9806进行通讯(液晶屏控制)
ILI9806G的8080通讯接口时序可以由STM32使用普通IO接口进行模拟,但这效率太低,因此STM32提供使用FSMC接口实现8080时序的方法。
STM32的FSMC外设可以用于控制扩展的外部存储器,而MCU对液晶屏的操作实际上就是把显示数据写入到显存中,与控制存储器非常类似,且8080接口的通讯时序完全可以使用FSMC外设产生,因而非常适合使用FSMC控制液晶屏。通过FSMC扩展时序,起到模拟8080时序的效果,从而控制液晶屏。
FSMC的控制图
FSMC相关引脚
控制LCD时,适合使用FSMC的NOR\PSRAM模式,它与前面使用FSMC控制SRAM的稍有不同,控制SRAM时使用的是模式A,而控制LCD时使用的是与NORFLASH一样的模式B.
模式B的时序图
根据STM32对寻址空间的地址映射,地址0x6000 0000~0x9FFF FFFF是映射到外部存储器的,而其中的0x6000 0000~0x6FFF FFFF则是分配给NOR FLASH、PSRAM这类可直接寻址的器件。
模式B与模式A的相同和区别:
(1)使用异步控制,因此不使用CLK时钟同步引脚;
(2)8080时序没有A[25:0]引脚,但会用其中一根信号线作为地址信号线;
(3)都有D[15:0]引脚作为双向数据总线;
(4)模式B不使用NWAIT以及NADV引脚;
(5)都有NOE、NWE分别进行输出使能和写使能;
(6)都有NE[x],x=1-4,片选信号线。
当FSMC外设被配置成正常工作,并且外部接了NOR FLASH时,若向0x60000000地址写入数据如0xABCD,FSMC会自动在各信号线上产生相应的电平信号,写入数据。FSMC会控制片选信号NE1选择相应的NOR芯片,然后使用地址线A[25:0]输出0x60000000,在NWE写使能信号线上发出低电平的写使能信号而要写入的数据信号0xABCD则从数据线D[15:0]输出,然后数据就被保存到NOR FLASH中了。
原理:
DCX ------ A0
访问地址1 ,A0地址线由FSMC控制为高电平﹐DCX引脚接收到高电平,液晶屏会把D0-D15信号理解为数据
uint16_t *p = (uint16_t *)(0x01);
*p= 0xABCD;//液晶屏把0xABCD理解成数据
访问地址0 ,A0地址线由FSMC控制为低电平﹐DCX引脚接收到低电平,液晶屏会把D0-D15信号理解为命令
uint16_t *p = (uint16_t *)(0x00) ;
*p= 0xABCD;//液晶屏把0xABCD理解成命令
由于FSMC会自动产生地址信号,当使用FSMC向0x6xxx xxx1、0x6xxx
xxx3、0x6xxx xxx5…这些奇数地址写入数据时,地址最低位的值均为1,所以它会控制地址线AO(D/CX)输出高电平,那么这时通过数据线传输的信号会被理解为数值;若向0x6xxx xxx0 、0x6xxx xxx2、0x6xxx xxx4…这些偶数地址写入数据时,地址最低位的值均为0,所以它会控制地址线AO(D/CX)输出低电平,因此这时通过数据线传输的信号会被理解为命令,如下表:
有了这个基础,只要配置好FSMC外设,然后在代码中利用指针变量,向
不同的地址单元写入数据,就能够由FSMC模拟出的8080接口向ILI9341写入控制命令或GRAM的数据了。
注意:在实际控制时,以上地址计算方式还不完整,还需要注意HADDR
内部地址与FSMC地址信号线的转换。
三、配置
与控制SRAM时一样,控制FSMC使用NOR FLASH存储器时主要是配置时序寄存器以及控制寄存器,利用ST标准库的时序结构体以及初始化结构体可以写入参数。
1.时序结构体
typedef struct{
uint32_t FSMC_AddressSetupTime;
/*地址建立时间,0-0xF个HCLK周期*/
uint32_t FSMC_AddressHoldTime;
/*地址保持时间,0-0xF个HCLK周期*/
uint32_t FSMC_DataSetupTime ;
/*地址建立时间,0-0xF个HCLK周期*/
uint32_t FSMC_BusTurnAroundDuration;
/*总线转换周期,0-0xF个HCLK周期,在NOR FLASH*/
uint32_t FSMC_CLKDivision;
/*时钟分频因子,1-0xF,若控制异步存储器,本参数无效*/
uint32_t FSMC_DataLatency;
/*数据延迟时间,若控制异步存储器,本参数无效*/
uint32_t FSMC_AccessMode;
/*设置访问模式*/
} FSMC NORSRAMTimingInitTypeDef;
(1)FSMC_AddressSetupTime
本成员设置地址建立时间,它可以被设置为0-0xF个HCLK周期数,按STM32标准库的默认配置,HCLK的时钟频率为168MHz,即一个HCLK周期为1/168微秒。
(2) FSMC_AddressHoldTime(同步时使用,模仿8080时序时不使用)
本成员设置地址保持时间,它可以被设置为0-0xF个HCLK周期数。
(3)FSMC_DataSetupTime
本成员设置数据建立时间,它可以被设置为0-0xF个HCLK周期数。
(4)uint32_t FSMC_BusTurnAroundDuration;uint32_t FSMC_CLKDivision;uint32_t FSMC_DataLatency;三个均是同步模式才使用的,在异步模式下不使用。
(5)FSMC_AccessMode
本成员设置存储器访问模式,不同的模式下FSMC访问存储器地址时引脚输出的时序不一样,可选FSMC_AccessMode_A/B/C/D模式。一般来说控制异步NORF LASH时使用B模式。配置为SRAM使用A模式。
注:上文配置的FSMC_NORSRAMTimingInitTypeDef时序结构体配置的延时参数将作为FSMC SRAM初始化结构体的一个成员。
2.初始化结构体
typedef struct{
uint32_t FSMC_Bank;
/*设置要控制的Bank区域*/
uint32_t FSMC_DataAddressMux;
/*设置地址总线与数据总线是否复用*/
uint32_t FSMC_MemoryType;
/*设置存储器的类型*/
uint32_t FSMC_MemoryDataWidth;
/*设置存储器的数据宽度*/
uint32_t FSMC_BurstAccessMode;
/*设置是否支持突发访问模式,只支持同步类型的存储器*/
uint32_t FSMC_AsynchronousWait;
/*设置是否使能在同步传输时的等待信号*/
uint32_t FSMC_WaitSignalPolarity;
/*设置等待信号的极性*/
uint32_t FSMC_WrapMode;
/*设置是否支持对齐的突发模式*/
uint32_t FSMC_WaitSignalActive;
/*配置等待信号在等待前有效还是等待期间有效*/
uint32_t FSMC_writeOperation;
/*设置是否写使能*/
uint32_t FSMC_WaitSignal;
/*设置是否使能等待状态插入*/
uint32_t FSMC_ExtendedMode;
/*设置是否使能扩展模式*/
uint32_t FSMC_WriteBurst;
/*设置是否使能写突发操作*/
/*当不使用扩展模式时,本参数用于配置读写时序,否则用于配置读时序*/
FSMC_NORSRAMTimingInitTypeDef* FSMC_ReadWriteTimingStruct;
/*当使用扩展模式时,本参数用于配置写时序*/
FSMC_NORSRAMTimingInitTypeDef* FSMC_WriteTimingStruct;
}FSMC NORSRAMInitTypeDef;
(1)uint32_t FSMC_Bank
Bank成员定义的宏
用于选择FSMC映射的储存区域
(2)FSMC_DataAddressMux
本成员用于设置地址总线与数据总线是否复用(FSMC_DataAddressMux_Enable /Disable),在控制NOR FLASH时,可以地址总线与数据总线可以分时复用,以减少使用STM32信号线的数量。(在此处不复用,因为此处数据线和地址线是分开的地址线连D/CX引脚,数据连8080接口D0-D15)
(3)FSMC_MemoryType
本成员用于设置要控制的存储器类型,它支持控制的存储器类型为SRAM、PSRAM以及NOR FLASH(FSMC_MemoryType_SRAM/PSRAM/NOR)。
(4)FSMC MemoryDataWidth
本成员用于设置要控制的存储器的数据宽度,可选择设置成8或16位(FSMC_MemoryDataWidth_8b /16b)。(这里选16b)
(5)FSMC BurstAccessMode
本成员用于设置是否使用突发访问模式
(FSMC_BurstAccessMode_Enable/Disable),突发访问模式是指发送一个地址后连续访问多个数据,非突发模式下每访问一个数据都需要输入一个地址,仅在控制同步类型的存储器时才能使用突发模式,因此此处Disable。
(6)uint32_t FSMC_AsynchronousWait;uint32_t FSMC_WaitSignalPolarity;uint32_t FSMC_WrapMode;uint32_t FSMC_WaitSignalActive;uint32_t FSMC_WriteBurst;uint32_t FSMC_WaitSignal;几个都是同步模式下使用的,此处都不适用。
(7)FSMC WriteOperation
这个成员用于设置是否写使能(FSMC_WriteOperation_ Enable/Disable),禁止写使能的话FSMC只能从存储器中读取数据,不能写入。
(8)FSMC_ExtendedMode
本成员用于设置是否使用扩展模式(FSMC_ExtendedMode_Enable/Disable),在非扩展模式下,对FSMC_BCR寄存器中的配置,即下面的FSMC_ReadWriteTimingStruct结构体成员;在扩展模式下,对存储器的读写时序可以分开配置,读时序使用FSMC_BCR寄存器,写时序使用FSMC_BWTR寄存器的配置,即下面的FSMC_WriteTimingStruct结构体。(具体根据上文结构体代码使用)
配置步骤:
1.初始化FSMC控制相关的引脚
2.初始化FSMC为异步NOR FLASH驱动模式
3.编写向液晶屏读写数据及写入命令的函数4.向液晶屏发送寄存器配置
5.控制液晶屏显示图形,进行测试