STM32f103的TFTLCD和FSMC的使用
扫描二维码
随时随地手机看文章
多功能采集显示平台将通过STM32的FSMC接口来控制TFTLCD的显示,所以本节分为两个部分,分别介绍TFTLCD和FSMC。
TFT-LCD即薄膜晶体管液晶显示器。其英文全称为:ThinFilmTransistor-LiquidCrystalDisplay。TFT-LCD与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。TFT-LCD也被叫做真彩液晶显示器。FSMC(FlexibleStaticMemoryController,可变静态存储控制器)是STM32系列采用一种新型的存储器扩展技术。在外部存储器扩展方面具有独特的优势,可根据系统的应用需要,方便地进行不同类型大容量静态存储器的扩展。
多功能采集显示平台使用的LCD的驱动芯片是ILI9325,有一个16位的变址寄存器(IR)、一个18位的写数据寄存器(WDR)和一个18位的读数据寄存器(RDR)。变址寄存器(IR)存储来自控制寄存器和内部的GRAM的指令信息。写数据寄存器(WDR)用来暂时存储要被写到控制寄存器和内部的GRAM中的数据。读数据寄存器(RDR)用来暂时存储从GRAM中读取的数据。MPU中要写入内部GRAM的数据,首先写到写数据寄存器(WDR),然后再又内部操作自动的写到内部的GRAM中。要读取的数据要通过读数据寄存器(RDR)从内部GRAM中读取。因此无效数据将被读到数据总线,当ILI9325从内部的GRAM中读取第一个数据的时候,有效数据将在ILI9325进行了第二次读操作之后被读出。同时使用FSMC驱动TFTLCD的显存工作,可以极大地提升LCD的显示效率和刷屏频率。相对于以往使用IO口控制LCD屏幕来说,使用FSMC的优势在于MCU可以将内存的数据通过并行总线直接传送至LCD显存,极大地提高了速度,保证了LCD的显示刷新频率。经过简单测试,使用IO口控制的LCD的刷新频率大概可以达到14帧一秒,使用FSMC的控制的LCD的刷新频率大概可以达到28帧一秒,效率足足提升了100%,这足以使得多功能采集显示平台的显示模块达到显示要求。
TFTLCD和FSMC设置的一般步骤可以总结为如下几个步骤:
1.设置STM32与TFTLCD模块相连接的IO
2.配置相应IO的功能
3.并设置FSMC,并使能FSMCBank1_SRAMBank
4.TFTLCD硬复位
5.初始化相应TFT的序列
6.通过函数将需要的图像或者文字显示在TFTLCD上面
TFTLCD接口如下:
初始化函数代码如下:
/**********************管脚配置**********************************************/
voidLCD_guanjiao(void)
{
u16a=1000;
GPIO_InitTypeDefGPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|
RCC_APB2Periph_GPIOF|RCC_APB2Periph_GPIOG,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|
GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_14|
GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=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_Init(GPIOE,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_Init(GPIOF,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;
GPIO_Init(GPIOG,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_ResetBits(GPIOD,GPIO_Pin_11);//管脚复位
while(a--);
GPIO_SetBits(GPIOD,GPIO_Pin_11);
}
/******************************FSMC配置*********************************/
voidLCD_FSMC()
{
FSMC_NORSRAMInitTypeDefFSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDefp;
p.FSMC_AddressSetupTime=0x02;//地址建立时间
p.FSMC_AddressHoldTime=0x00;//地址保持时间
p.FSMC_DataSetupTime=0x05;//数据建立时间
p.FSMC_BusTurnAroundDuration=0x00;
p.FSMC_CLKDivision=0x00;
p.FSMC_DataLatency=0x00;
p.FSMC_AccessMode=FSMC_AccessMode_B;//一般使用模式B来控制LCD
FSMC_NORSRAMInitStructure.FSMC_Bank=FSMC_Bank1_NORSRAM4;
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux=FSMC_DataAddressMux_Disable;
//FSMC_NORSRAMInitStructure.FSMC_MemoryType=FSMC_MemoryType_SRAM;
FSMC_NORSRAMInitStructure.FSMC_MemoryType=FSMC_MemoryType_NOR;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth=FSMC_MemoryDataWidth_16b;
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode=FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity=FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_WrapMode=FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive=FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation=FSMC_WriteOperation_Enable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignal=FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode=FSMC_ExtendedMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WriteBurst=FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct=&p;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct=&p;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
/*使能FSMCBank1_SRAMBank*/
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4,ENABLE);
}
相关代码已上传:http://download.csdn.net/detail/devintt/8925341
关于优化
多功能采集显示平台需要要求每秒刷新屏幕10次,尽管刷新频率较低,但是如果使用先将全屏幕刷白,再通过计算添加不同的界面控件,这样的方法难以保证刷新屏幕的工作正常进行。有了优化显示,所以这里使用了局部刷新的方法,根据需要修改的显示区域进行刷白处理,其余的显示不变。这样