STM32f103的TFTLCD和FSMC的使用
多功能采集顯示平臺(tái)將通過STM32的FSMC接口來控制TFTLCD的顯示,所以本節(jié)分為兩個(gè)部分,分別介紹TFTLCD和FSMC。
TFT-LCD即薄膜晶體管液晶顯示器。其英文全稱為:ThinFilmTransistor-LiquidCrystalDisplay。TFT-LCD與無源TN-LCD、STN-LCD的簡單矩陣不同,它在液晶顯示屏的每一個(gè)象素上都設(shè)置有一個(gè)薄膜晶體管(TFT),可有效地克服非選通時(shí)的串?dāng)_,使顯示液晶屏的靜態(tài)特性與掃描線數(shù)無關(guān),因此大大提高了圖像質(zhì)量。TFT-LCD也被叫做真彩液晶顯示器。FSMC(FlexibleStaticMemoryController,可變靜態(tài)存儲(chǔ)控制器)是STM32系列采用一種新型的存儲(chǔ)器擴(kuò)展技術(shù)。在外部存儲(chǔ)器擴(kuò)展方面具有獨(dú)特的優(yōu)勢,可根據(jù)系統(tǒng)的應(yīng)用需要,方便地進(jìn)行不同類型大容量靜態(tài)存儲(chǔ)器的擴(kuò)展。
多功能采集顯示平臺(tái)使用的LCD的驅(qū)動(dòng)芯片是ILI9325,有一個(gè)16位的變址寄存器(IR)、一個(gè)18位的寫數(shù)據(jù)寄存器(WDR)和一個(gè)18位的讀數(shù)據(jù)寄存器(RDR)。變址寄存器(IR)存儲(chǔ)來自控制寄存器和內(nèi)部的GRAM的指令信息。寫數(shù)據(jù)寄存器(WDR)用來暫時(shí)存儲(chǔ)要被寫到控制寄存器和內(nèi)部的GRAM中的數(shù)據(jù)。讀數(shù)據(jù)寄存器(RDR)用來暫時(shí)存儲(chǔ)從GRAM中讀取的數(shù)據(jù)。MPU中要寫入內(nèi)部GRAM的數(shù)據(jù),首先寫到寫數(shù)據(jù)寄存器(WDR),然后再又內(nèi)部操作自動(dòng)的寫到內(nèi)部的GRAM中。要讀取的數(shù)據(jù)要通過讀數(shù)據(jù)寄存器(RDR)從內(nèi)部GRAM中讀取。因此無效數(shù)據(jù)將被讀到數(shù)據(jù)總線,當(dāng)ILI9325從內(nèi)部的GRAM中讀取第一個(gè)數(shù)據(jù)的時(shí)候,有效數(shù)據(jù)將在ILI9325進(jìn)行了第二次讀操作之后被讀出。同時(shí)使用FSMC驅(qū)動(dòng)TFTLCD的顯存工作,可以極大地提升LCD的顯示效率和刷屏頻率。相對(duì)于以往使用IO口控制LCD屏幕來說,使用FSMC的優(yōu)勢在于MCU可以將內(nèi)存的數(shù)據(jù)通過并行總線直接傳送至LCD顯存,極大地提高了速度,保證了LCD的顯示刷新頻率。經(jīng)過簡單測試,使用IO口控制的LCD的刷新頻率大概可以達(dá)到14幀一秒,使用FSMC的控制的LCD的刷新頻率大概可以達(dá)到28幀一秒,效率足足提升了100%,這足以使得多功能采集顯示平臺(tái)的顯示模塊達(dá)到顯示要求。
TFTLCD和FSMC設(shè)置的一般步驟可以總結(jié)為如下幾個(gè)步驟:
1.設(shè)置STM32與TFTLCD模塊相連接的IO
2.配置相應(yīng)IO的功能
3.并設(shè)置FSMC,并使能FSMCBank1_SRAMBank
4.TFTLCD硬復(fù)位
5.初始化相應(yīng)TFT的序列
6.通過函數(shù)將需要的圖像或者文字顯示在TFTLCD上面
TFTLCD接口如下:
初始化函數(shù)代碼如下:
/**********************管腳配置**********************************************/
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);//管腳復(fù)位
while(a--);
GPIO_SetBits(GPIOD,GPIO_Pin_11);
}
/******************************FSMC配置*********************************/
voidLCD_FSMC()
{
FSMC_NORSRAMInitTypeDefFSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDefp;
p.FSMC_AddressSetupTime=0x02;//地址建立時(shí)間
p.FSMC_AddressHoldTime=0x00;//地址保持時(shí)間
p.FSMC_DataSetupTime=0x05;//數(shù)據(jù)建立時(shí)間
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);
}
相關(guān)代碼已上傳:http://download.csdn.net/detail/devintt/8925341
關(guān)于優(yōu)化
多功能采集顯示平臺(tái)需要要求每秒刷新屏幕10次,盡管刷新頻率較低,但是如果使用先將全屏幕刷白,再通過計(jì)算添加不同的界面控件,這樣的方法難以保證刷新屏幕的工作正常進(jìn)行。有了優(yōu)化顯示,所以這里使用了局部刷新的方法,根據(jù)需要修改的顯示區(qū)域進(jìn)行刷白處理,其余的顯示不變。這樣