前段時間寫了《STM32驅動LCD原理》和《STM32的FSMC外設簡介》兩篇文章,本文將對STM32驅動LCD進行實戰應用。LCD是深圳市拓普微科技開發有限公司的LMT028DN,解析度是320*240,大小2.8寸,顏色65K的彩色屏,採用的是ST7789s液晶控制IC。顏色模式是565。
01 驅動時序
我們通常說的MCU-LCD介面,就是8080介面,8080介面的詳細介紹請看《STM32驅動LCD原理》。
下面是LMT028DN給出的8080模式匯流排時序
下面是匯流排時序中的引數
時序引數
-
Tast->地址設定時間
-
Taht->地址保持時間(寫)
-
Tchw->晶片選擇高脈衝寬度
-
Tcs->晶片選擇設定時間(寫)
-
Tcsf->晶片選擇等待時間(寫)
-
Twc->寫入週期
-
Twrh->控制脈衝高電平時間
-
Twrl->控制脈衝低電平時間
-
Tdst->資料設定時間
-
Tdht->資料保持時間
根據FSMC的配置和時序圖,我們需要的3個時序引數是
3個重要引數
1、地址建立時間:5ns
2、地址保持時間:13ns
3、資料建立時間: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