STM32驅動LCD實戰

前段時間寫了《STM32驅動LCD原理》和《STM32的FSMC外設簡介》兩篇文章,本文將對STM32驅動LCD進行實戰應用。LCD是深圳市拓普微科技開發有限公司的LMT028DN,分辨率是320*240,大小2.8寸,顏色65K的彩色屏,採用的是ST7789s液晶控制IC。顏色模式是565。git

01 驅動時序

咱們一般說的MCU-LCD接口,就是8080接口,8080接口的詳細介紹請看《STM32驅動LCD原理》。github

下面是LMT028DN給出的8080模式總線時序app

下面是總線時序中的參數ui

時序參數spa

  • Tast->地址設置時間3d

  • Taht->地址保持時間(寫)code

  • Tchw->芯片選擇高脈衝寬度blog

  • Tcs->芯片選擇設置時間(寫)教程

  • Tcsf->芯片選擇等待時間(寫)接口

  • Twc->寫入週期

  • Twrh->控制脈衝高電平時間

  • Twrl->控制脈衝低電平時間

  • Tdst->數據設置時間

  • Tdht->數據保持時間

根據FSMC的配置和時序圖,咱們須要的3個時序參數是

 

3個重要參數

一、地址創建時間:5ns

二、地址保持時間:13ns

三、數據創建時間:13ns

 

以上數據均是知足時序圖的最小時間,實際應用中,不能設置成最小值,也不能大於最大值(若是有的話),以實際應用爲主,若是設置時間太快,反而不穩定。

由於咱們把LCD使用8080接口驅動SRAM的方式,因此能夠選擇FSMC的模式1和模式A,可是/RD的切換,也就是FSMC的NOE的切換,因此只能選擇模式A,觀察時序圖,讀寫時序一致,因此能夠選擇讀寫一致的配置。

 

02 FSMC外設配置

FSMC外設配置代碼,具體FSMC外設解析請看《STM32的FSMC外設簡介

readWriteTiming.FSMC_AddressSetupTime = 0x02;   //地址創建時間(ADDSET)爲2個HCLK 2*1/120M=16ns
readWriteTiming.FSMC_AddressHoldTime = 0x02;   //地址保持時間(ADDHLD),16ns  
readWriteTiming.FSMC_DataSetupTime = 0x06;     //數據創建時間,50ns
readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;//總線恢復時間
readWriteTiming.FSMC_CLKDivision = 0x00;// 時鐘分頻因子 
readWriteTiming.FSMC_DataLatency = 0x00;//數據產生時間
readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;   //模式A
 
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;//  這裏咱們使用NE1 ,也就對應BTCR[6],[7]。
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;// 不復用數據地址
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM; 
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;//存儲器數據寬度爲8bit   
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable; 
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_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 = &readWriteTiming;//讀寫時序
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &readWriteTiming;//寫時序

讀寫接口代碼:

結構體定義,這裏利用告終構體地址遞增特性

typedef struct
{
  uint8_t LCD_CMD;//用於LCD命令操做
  uint8_t LCD_DATA;//用於LCD數據操做
} LCD_TypeDef;
#define LCD_BASE        ((uint32_t)(0x60000000 | 0x0000FFFF))
#define LCD             ((LCD_TypeDef *) LCD_BAS

讀寫接口

void LMT028_Write_Cmd ( uint8_t usCmd )
{
  LCD->LCD_CMD=usCmd;  
}
void LMT028_Write_Data ( uint8_t usData )
{
  LCD->LCD_DATA = usData;
}

也能夠簡單明瞭的以下寫法

#define      FSMC_Addr_LMT028_CMD         ( ( uint32_t ) 0x60000000 )      
#define      FSMC_Addr_LMT028_DATA        ( ( uint32_t ) 0x60010000 )
 
void LMT028_Write_Cmd ( uint8_t usCmd )
{
 *( (uint32_t  * )FSMC_Addr_LMT028_CMD)=usCmd;  
}
void LMT028_Write_Data ( uint8_t usData )
{
  *( (uint32_t  * )FSMC_Addr_LMT028_DATA) = usData;
}

03 背光驅動

LED背光驅動,根據高電平的佔空比決定的,共有32個亮度等級,使用PWM驅動最爲合適,經過調節佔空比,調節亮度。

 

04 復位驅動

復位腳大於10ms的低電平,而後最大170ms的高電平

05 寄存器配置

寄存器配置仍是要先參考廠家給的示例demo,根據LMT028手冊進行修改,LMT028手冊只有重要的寄存器說明,詳細的寄存器說明須要參考ST7789手冊。

 

代碼開源地址:

https://github.com/strongercjd/STM32F207VCT6

 

點擊查看本文所在的專輯,STM32F207教程

 

LMT028D手冊、ST7789S手冊、LMT028D的demo和ST7789S的demo等資料下載連接

 

下載連接:https://pan.baidu.com/s/1VgAP6GpcOX8bqTvZUPzAcg   提取碼:t4uq

相關文章
相關標籤/搜索