液晶顯示屏LCD是靠背光LED發光,而後通過橫豎透光,每一個點電壓能夠改變光線的方向,總之能改變透光度0-100%,最後就是每一個像素點對應紅綠藍RGB,RGB各自的亮度不一樣,組成的顏色天然也不一樣編程
3.1 FSMC:靈活的靜態存儲控制器; 可以與同步或異步存儲器和16位PC存儲器卡鏈接; STM32的FSMC接口支持包括SRAM、NAND FLASH、NOR FLASH和PSRAM等存儲器; STM32 407和103是不支持SD RAM的,429,439支持SD RAM操做異步
3.2 FSMC原理圖.net
下面這篇文章很好:
【https://blog.csdn.net/abap_brave/article/details/53080703】code
注意:上面篇文章使用模式A與LCD通訊,但咱們此次編程使用模式B
orm
而後再看這個cdn
https://blog.csdn.net/siufai_92/article/details/48214109blog
文章提到爲何使用8080,LCD那些接口才是8080通訊有效的,LCD使用16位寬度的數據傳輸,須要解決地址這個問題。接口
瞭解地址線與命令/數據信號線的關係,看完下面這篇文章,再結合下圖,個人代碼哪裏是怎樣的寫的ip
https://blog.csdn.net/z1512751703/article/details/78937117get
總之,想對一個LCD屏進行操做,首先看他的數據手冊,判斷他的通信時序和FSMC那種模式的時序相識,信號線的對應關係,還有地址線,地址線的範圍請根據FSMC控制的存儲類型,以下圖,即便肯定以後,還要肯定你片選那一塊,FSMC劃分了四個區,以下圖,根據所選的區的起始地址計算地址,地址的計算上面說的很明確了
static void ILI9341_FSMC_Config ( void ) { FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; FSMC_NORSRAMTimingInitTypeDef readWriteTiming; /* 使能FSMC時鐘*/ RCC_AHBPeriphClockCmd ( RCC_AHBPeriph_FSMC, ENABLE ); //地址創建時間(ADDSET)爲1個HCLK 2/72M=28ns readWriteTiming.FSMC_AddressSetupTime = 0x01; //地址創建時間 //數據保持時間(DATAST)+ 1個HCLK = 5/72M=70ns readWriteTiming.FSMC_DataSetupTime = 0x04; //數據創建時間 //選擇控制的模式 //模式B,異步NOR FLASH模式,與ILI9341的8080時序匹配 readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_B; /*如下配置與模式B無關,也須要設置*/ //地址保持時間(ADDHLD)模式A未用到 readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持時間 //設置總線轉換週期,僅用於複用模式的NOR操做 readWriteTiming.FSMC_BusTurnAroundDuration = 0x00; //設置時鐘分頻,僅用於同步類型的存儲器 readWriteTiming.FSMC_CLKDivision = 0x00; //數據保持時間,僅用於同步型的NOR readWriteTiming.FSMC_DataLatency = 0x00; FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAMx; FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; 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 = &readWriteTiming; FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &readWriteTiming; FSMC_NORSRAMInit ( & FSMC_NORSRAMInitStructure ); /* 使能 FSMC_Bank1_NORSRAM4 */ FSMC_NORSRAMCmd ( FSMC_Bank1_NORSRAMx, ENABLE ); }
static void ILI9341_REG_Config ( void ) { /* Power control B (CFh) */ DEBUG_DELAY (); ILI9341_Write_Cmd ( 0xCF ); ILI9341_Write_Data ( 0x00 ); ILI9341_Write_Data ( 0x81 ); ILI9341_Write_Data ( 0x30 ); /* Power on sequence control (EDh) */ DEBUG_DELAY (); ILI9341_Write_Cmd ( 0xED ); ILI9341_Write_Data ( 0x64 ); ILI9341_Write_Data ( 0x03 ); ILI9341_Write_Data ( 0x12 ); ILI9341_Write_Data ( 0x81 ); /* Driver timing control A (E8h) */ DEBUG_DELAY (); ILI9341_Write_Cmd ( 0xE8 ); ILI9341_Write_Data ( 0x85 ); ILI9341_Write_Data ( 0x10 ); ILI9341_Write_Data ( 0x78 ); /* Power control A (CBh) */ DEBUG_DELAY (); ILI9341_Write_Cmd ( 0xCB ); ILI9341_Write_Data ( 0x39 ); ILI9341_Write_Data ( 0x2C ); ILI9341_Write_Data ( 0x00 ); ILI9341_Write_Data ( 0x34 ); ILI9341_Write_Data ( 0x02 ); /* Pump ratio control (F7h) */ DEBUG_DELAY (); ILI9341_Write_Cmd ( 0xF7 ); ILI9341_Write_Data ( 0x20 ); /* Driver timing control B */ DEBUG_DELAY (); ILI9341_Write_Cmd ( 0xEA ); ILI9341_Write_Data ( 0x00 ); ILI9341_Write_Data ( 0x00 ); /* Frame Rate Control (In Normal Mode/Full Colors) (B1h) */ DEBUG_DELAY (); ILI9341_Write_Cmd ( 0xB1 ); ILI9341_Write_Data ( 0x00 ); ILI9341_Write_Data ( 0x1B ); /* Display Function Control (B6h) */ DEBUG_DELAY (); ILI9341_Write_Cmd ( 0xB6 ); ILI9341_Write_Data ( 0x0A ); ILI9341_Write_Data ( 0xA2 ); /* Power Control 1 (C0h) */ DEBUG_DELAY (); ILI9341_Write_Cmd ( 0xC0 ); ILI9341_Write_Data ( 0x35 ); /* Power Control 2 (C1h) */ DEBUG_DELAY (); ILI9341_Write_Cmd ( 0xC1 ); ILI9341_Write_Data ( 0x11 ); /* VCOM Control 1 (C5h) */ ILI9341_Write_Cmd ( 0xC5 ); ILI9341_Write_Data ( 0x45 ); ILI9341_Write_Data ( 0x45 ); /* VCOM Control 2 (C7h) */ ILI9341_Write_Cmd ( 0xC7 ); ILI9341_Write_Data ( 0xA2 ); /* Enable 3G (F2h) */ ILI9341_Write_Cmd ( 0xF2 ); ILI9341_Write_Data ( 0x00 ); /* Gamma Set (26h) */ ILI9341_Write_Cmd ( 0x26 ); ILI9341_Write_Data ( 0x01 ); DEBUG_DELAY (); /* Positive Gamma Correction */ ILI9341_Write_Cmd ( 0xE0 ); //Set Gamma ILI9341_Write_Data ( 0x0F ); ILI9341_Write_Data ( 0x26 ); ILI9341_Write_Data ( 0x24 ); ILI9341_Write_Data ( 0x0B ); ILI9341_Write_Data ( 0x0E ); ILI9341_Write_Data ( 0x09 ); ILI9341_Write_Data ( 0x54 ); ILI9341_Write_Data ( 0xA8 ); ILI9341_Write_Data ( 0x46 ); ILI9341_Write_Data ( 0x0C ); ILI9341_Write_Data ( 0x17 ); ILI9341_Write_Data ( 0x09 ); ILI9341_Write_Data ( 0x0F ); ILI9341_Write_Data ( 0x07 ); ILI9341_Write_Data ( 0x00 ); /* Negative Gamma Correction (E1h) */ ILI9341_Write_Cmd ( 0XE1 ); //Set Gamma ILI9341_Write_Data ( 0x00 ); ILI9341_Write_Data ( 0x19 ); ILI9341_Write_Data ( 0x1B ); ILI9341_Write_Data ( 0x04 ); ILI9341_Write_Data ( 0x10 ); ILI9341_Write_Data ( 0x07 ); ILI9341_Write_Data ( 0x2A ); ILI9341_Write_Data ( 0x47 ); ILI9341_Write_Data ( 0x39 ); ILI9341_Write_Data ( 0x03 ); ILI9341_Write_Data ( 0x06 ); ILI9341_Write_Data ( 0x06 ); ILI9341_Write_Data ( 0x30 ); ILI9341_Write_Data ( 0x38 ); ILI9341_Write_Data ( 0x0F ); /* memory access control set */ DEBUG_DELAY (); ILI9341_Write_Cmd ( 0x36 ); ILI9341_Write_Data ( 0xC8 ); /*豎屏 左上角到 (起點)到右下角 (終點)掃描方式*/ DEBUG_DELAY (); /* column address control set */ ILI9341_Write_Cmd ( CMD_SetCoordinateX ); //這是設置像素寬,恰好從0x0000到0x00EF是240 ILI9341_Write_Data ( 0x00 ); ILI9341_Write_Data ( 0x00 ); ILI9341_Write_Data ( 0x00 ); ILI9341_Write_Data ( 0xEF ); /* page address control set */ DEBUG_DELAY (); ILI9341_Write_Cmd ( CMD_SetCoordinateY ); //這是設置像素高,恰好從0x0000到0x013F是320 ILI9341_Write_Data ( 0x00 ); ILI9341_Write_Data ( 0x00 ); ILI9341_Write_Data ( 0x01 ); ILI9341_Write_Data ( 0x3F ); /* Pixel Format Set (3Ah) */ DEBUG_DELAY (); ILI9341_Write_Cmd ( 0x3a ); ILI9341_Write_Data ( 0x55 ); /* Sleep Out (11h) */ ILI9341_Write_Cmd ( 0x11 ); ILI9341_Delay ( 0xAFFf<<2 ); DEBUG_DELAY (); /* Display ON (29h) */ ILI9341_Write_Cmd ( 0x29 ); }
設置掃描方向,默認是6
操做液晶顯示
總例程代碼以下