版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、stm32tftlcd_STM32-F407探索T。1)資料下載:點擊資料即可下載2)對正點原Linux感興趣的同學可以加群討論:9354467413)關注正點原公眾號,獲取最新資料更新上章我們介紹了 OLED 模塊及其顯,但是該模塊只能顯單/雙,不能顯彩,且尺也較。本章我們將介紹 ALIENTEK 2.8 TFT LCD 模塊,該模塊采 TFTLCD 板,可以顯 16 位的真彩圖。在本章中,我們將使探索者 STM32F4 開發(fā)板上的 LCD接,來點亮 TFTLCD,并實現(xiàn) ASCII 字符和彩的顯等功能,并在串打印 LCD 控制器ID,同時在 LCD 上顯。本章分為如下個部分:18.1 TF
2、TLCD & FSMC 簡介18.2 硬件設計18.3 軟件設計18.4 下載驗證18.1 TFTLCD&FSMC 簡介本章我們將通過STM32F4的FSMC接來控制TFTLCD的顯,所以本節(jié)分為兩個部分,分別介紹 TFTLCD 和 FSMC。18.1.1 TFTLCD 簡介TFT-LCD 即薄膜晶體管液晶顯器。其英全稱為:Thin Film Transistor-Liquid CrystalDisplay。TFT-LCD 與源 TN-LCD、STN-LCD 的簡單矩陣不同,它在液晶顯屏的每個象素上都設置有個薄膜晶體管(TFT),可有效地克服選通時的串擾,使顯液晶屏的靜態(tài)特性與掃描線數(shù)關,因此
3、提了圖像質(zhì)量。TFT-LCD 也被叫做真彩液晶顯器。上章介紹了 OLED 模塊,本章,我們給家介紹 ALIENTEK TFTLCD 模塊,該模塊有如下特點:1,2.4/2.8/3.5/4.3/7 5 種的屏幕可選。2,320240 的分辨率(3.5分辨率為:320*480,4.3和 7分辨率為:800*480)。3,16 位真彩顯。4,帶觸摸屏,可以來作為控制輸。本章,我們以 2.8 (其他 3.5 /4.3 等 LCD 法類似,請參考 2.8 的即可)的ALIENTEKTFTLCD 模塊為例介紹,該模塊持 65K 顯,顯分辨率為 320240,接為 16 位的 80并,帶觸摸屏。該模塊的外觀
4、圖如圖 18.1.1.1 所:圖 18.1.1.1 ALIENTEK 2.8 TFTLCD 外觀圖模塊原理圖如圖 18.1.1.2 所:圖 18.1.1.2 ALIENTEK 2.8 TFTLCD 模塊原理圖TFTLCD 模塊采 2*17 的 2.54 公排針與外部連接,接定義如圖 18.1.1.3 所:圖 18.1.1.3 ALIENTEK 2.8 TFTLCD 模塊接圖從圖 18.1.1.3 可以看出,ALIENTEK TFTLCD 模塊采 16 位的并式與外部連接,之所以不采 8 位的式,是因為彩屏的數(shù)據(jù)量較,尤其在顯圖的時候,如果 8 位數(shù)據(jù)線,就會 16 位式慢倍以上,我們當然希望速
5、度越快越好,所以我們選擇 16 位的接。圖18.1.1.3 還列出了觸摸屏芯的接,關于觸摸屏本章我們不多介紹,后的章節(jié)會有詳細的介紹。該模塊的 80 并有如下些信號線:CS:TFTLCD 選信號。WR:向 TFTLCD 寫數(shù)據(jù)。RD:從 TFTLCD 讀取數(shù)據(jù)。D15:0:16 位雙向數(shù)據(jù)線。RST:硬復位 TFTLCD。RS:命令/數(shù)據(jù)標志(0,讀寫命令;1,讀寫數(shù)據(jù))。80 并在上節(jié)我們已經(jīng)有詳細的介紹了,這我們就不再介紹,需要說明的是,TFTLCD模塊的 RST 信號線是直接接到 STM32F4 的復位腳上,并不由軟件控制,這樣可以省下來個IO 。另外我們還需要個背光控制線來控制 TFT
6、LCD 的背光。所以,我們總共需要的 IO 數(shù)為 21 個。這還需要注意,我們標注的 DB1DB8,DB10DB17,是相對于 LCD 控制 IC標注的,實際上家可以把他們就等同于 D0D15,這樣理解起來就較簡單點。ALIENTEK 提供 2.8/3.5/4.3/7 等不同尺的 TFTLCD 模塊,其驅動芯有很多種類型,如有:ILI9341/ILI9325/RM68042/RM68021/ILI9320/ILI9328/LGDP4531/LGDP4535/SPFD5408/SSD1289/1505/B505/C505/NT35310/NT35510/SSD1963 等(具體的型號,家可以通過
7、下載本章實驗代碼,通過串或者 LCD 顯查看),這我們僅以 ILI9341 控制器為例進介紹,其他的控制基本都類似,我們就不詳細闡述了。ILI9341 液晶控制器帶顯存,其顯存總為 172800(240*320*18/8),即 18 位模式(26萬)下的顯存量。在 16 位模式下,ILI9341 采 RGB565 格式存儲顏數(shù)據(jù),此時 ILI9341的 18 位數(shù)據(jù)線與 MCU 的 16 位數(shù)據(jù)線以及 LCD GRAM 的對應關系如圖 18.1.1.4 所:圖 18.1.1.4 16 位數(shù)據(jù)與顯存對應關系圖從圖中可以看出,ILI9341 在 16 位模式下,數(shù)據(jù)線有的是:D17D13 和 D1
8、1D1,D0和 D12 沒有到,實際上在我們 LCD 模塊,ILI9341 的 D0 和 D12 壓根就沒有引出來,這樣,ILI9341 的 D17D13 和 D11D1 對應 MCU 的 D15D0。這樣 MCU 的 16 位數(shù)據(jù),最低 5 位代表藍,中間 6 位為綠,最 5 位為紅。數(shù)值越,表該顏越深。另外,特別注意 ILI9341 所有的指令都是 8 位的( 8 位效),且參數(shù)除了讀寫 GRAM 的時候是 16 位,其他操作參數(shù),都是 8 位的,這個和 ILI9320 等驅動器不樣,必須加以注意。接下來,我們介紹下 ILI9341 的個重要命令,因為 ILI9341 的命令很多,我們這就
9、不全部介紹了,有興趣的家可以找到 ILI9341 的 datasheet 看看。對這些命令有詳細的介紹。我們將介紹:0XD3,0X36,0X2A,0X2B,0X2C,0X2E 等 6 條指令。先來看指令:0XD3,這個是讀 ID4 指令,于讀取 LCD 控制器的 ID,該指令如表 18.1.1.1所:表 18.1.1.1 0XD3 指令描述從上表可以看出,0XD3 指令后跟了 4 個參數(shù),最后 2 個參數(shù),讀出來是 0X93 和 0X41,剛好是我們控制器 ILI9341 的數(shù)字部分,從,通過該指令,即可判別所的 LCD 驅動器是什么型號,這樣,我們的代碼,就可以根據(jù)控制器的型號去執(zhí)對應驅動
10、IC 的初始化代碼,從兼容不同驅動 IC 的屏,使得個代碼持多款 LCD。接下來看指令:0X36,這是存儲訪問控制指令,可以控制 ILI9341 存儲器的讀寫向,簡單的說,就是在連續(xù)寫 GRAM 的時候,可以控制 GRAM 指針的增長向,從控制顯式(讀 GRAM 也是樣)。該指令如表 18.1.1.2 所:表 18.1.1.2 0X36 指令描述從上表可以看出,0X36 指令后,緊跟個參數(shù),這我們主要關注:MY、MX、MV 這三個位,通過這三個位的設置,我們可以控制整個 ILI9341 的全部掃描向,如表 18.1.1.3 所:表 18.1.1.3MY、MX、MV 設置與 LCD 掃描向關系表
11、這樣,我們在利 ILI9341 顯內(nèi)容的時候,就有很靈活性了,如顯 BMP 圖,BMP 解碼數(shù)據(jù),就是從圖的左下開始,慢慢顯到右上,如果設置 LCD 掃描向為從左到右,從下到上,那么我們只需要設置次坐標,然后就不停的往 LCD 填充顏數(shù)據(jù)即可,這樣可以提顯速度。接下來看指令:0X2A,這是列地址設置指令,在從左到右,從上到下的掃描式(默認)下,該指令于設置橫坐標(x 坐標),該指令如表 18.1.1.4 所:表 18.1.1.4 0X2A 指令描述在默認掃描式時,該指令于設置 x 坐標,該指令帶有 4 個參數(shù),實際上是 2 個坐標值:SC 和 EC,即列地址的起始值和結束值,SC 必須于等于
12、EC,且 0SC/EC239。般在設置 x 坐標的時候,我們只需要帶 2 個參數(shù)即可,也就是設置 SC 即可,因為如果 EC 沒有變化,我們只需要設置次即可(在初始化 ILI9341 的時候設置),從提速度。與 0X2A 指令類似,指令:0X2B,是頁地址設置指令,在從左到右,從上到下的掃描式(默認)下,該指令于設置縱坐標(y 坐標)。該指令如表 18.1.1.5 所:表 18.1.1.5 0X2B 指令描述在默認掃描式時,該指令于設置 y 坐標,該指令帶有 4 個參數(shù),實際上是 2 個坐標值: SP 和 EP,即頁地址的起始值和結束值,SP必須于等于 EP,且 0SP/EP319。般在設置
13、y 坐標的時候,我們只需要帶 2 個參數(shù)即可,也就是設置 SP 即可,因為如果 EP沒有變化,我 們只需要設置次即可(在初始化 ILI9341 的時候設置),從提速度。 接下來看指令:0X2C,該指令是寫 GRAM 指令,在發(fā)送該指令之后,我們便可以往 LCD 的 GRAM 寫顏數(shù)據(jù)了,該指令持連續(xù)寫,指令描述如表 18.1.1.6 所:表 18.1.1.6 0X2C 指令描述從上表可知,在收到指令 0X2C 之后,數(shù)據(jù)有效位寬變?yōu)?16 位,我們可以連續(xù)寫 LCDGRAM 值, GRAM 的地址將根據(jù) MY/MX/MV 設置的掃描向進增。例如:假設設置的是從左到右,從上到下的掃描式,那么設置
14、好起始坐標(通過 SC,SP 設置)后,每寫個顏值,GRAM 地址將會動增 1(SC+),如果碰到 EC,則回到 SC,同時 SP+,直到坐標:EC,EP 結束,其間需再次設置的坐標,從提寫速度。最后,來看看指令:0X2E,該指令是讀 GRAM 指令,于讀取 ILI9341 的顯存(GRAM),該指令在 ILI9341 的數(shù)據(jù)冊上的描述是有誤的,真實的輸出情況如表 18.1.1.7 所:表 18.1.1.7 0X2E 指令描述該指令于讀取 GRAM,如表 18.1.1.7 所,ILI9341 在收到該指令后,第次輸出的是dummy 數(shù)據(jù),也就是效的數(shù)據(jù),第次開始,讀取到的才是有效的 GRAM
15、數(shù)據(jù)(從坐標:SC,SP 開始),輸出規(guī)律為:每個顏分量占 8 個位,次輸出 2 個顏分量。如:第次輸出是 R1G1,隨后的規(guī)律為:B1R2G2B2R3G3B3R4G4B4R5G5.以此類推。如果我們只需要讀取個點的顏值,那么只需要接收到參數(shù) 3 即可,如果要連續(xù)讀?。ɡ?GRAM地址增,法同上),那么就按照上述規(guī)律去接收顏數(shù)據(jù)。以上,就是操作 ILI9341 常的個指令,通過這個指令,我們便可以很好的控制 ILI9341顯我們所要顯的內(nèi)容了。般 TFTLCD 模塊的使流程如圖 18.1.1.5:圖 18.1.1.5 TFTLCD 使流程任何 LCD,使流程都可以簡單的以上流程圖表。其中硬復位
16、和初始化序列,只需要執(zhí)次即可。畫點流程就是:設置坐標寫 GRAM 指令寫顏數(shù)據(jù),然后在 LCD 上,我們就可以看到對應的點顯我們寫的顏了。讀點流程為:設置坐標讀 GRAM 指令讀取顏數(shù)據(jù),這樣就可以獲取到對應點的顏數(shù)據(jù)了。以上只是最簡單的操作,也是最常的操作,有了這些操作,般就可以正常使 TFTLCD了。接下來我們將該模塊來來顯字符和數(shù)字,通過以上介紹,我們可以得出 TFTLCD 顯需要的相關設置步驟如下:1)設置 STM32F4 與 TFTLCD 模塊相連接的 IO。這步,先將我們與 TFTLCD 模塊相連的 IO 進初始化,以便驅動 LCD。這我們到的是 FSMC,F(xiàn)SMC 將在 18.1
17、.2 節(jié)向家詳細介紹。2)初始化 TFTLCD 模塊。即圖 18.1.1.5 的初始化序列,這我們沒有硬復位 LCD,因為探索者 STM32F4 開發(fā)板的LCD 接,將 TFTLCD 的 RST 同 STM32F4 的 RESET 連接在起了,只要按下開發(fā)板的 RESET鍵,就會對 LCD 進硬復位。初始化序列,就是向 LCD 控制器寫系列的設置值(如伽馬校準),這些初始化序列般 LCD 供應商會提供給客戶,我們直接使這些序列即可,不需要深研究。在初始化之后,LCD 才可以正常使。3)通過函數(shù)將字符和數(shù)字顯到 TFTLCD 模塊上。這步則通過圖 18.1.1.5 左側的流程,即:設置坐標寫 G
18、RAM 指令寫 GRAM 來實現(xiàn),但是這個步驟,只是個點的處理,我們要顯字符/數(shù)字,就必須要多次使這個步驟,從達到顯字符/數(shù)字的的,所以需要設計個函數(shù)來實現(xiàn)數(shù)字/字符的顯,之后調(diào)該函數(shù),就可以實現(xiàn)數(shù)字/字符的顯了。18.1.2 FSMC 簡介STM32F407 或 STM32F417 系列芯都帶有 FSMC 接,ALIENTEK 探索者 STM32F4 開發(fā)板的主芯為 STM32F407ZGT6,是帶有 FSMC 接的。FSMC,即靈活的靜態(tài)存儲控制器,能夠與同步或異步存儲器和 16 位 PC 存儲器卡連接,STM32F4 的 FSMC 接持包括 SRAM、NAND FLASH、NOR FLA
19、SH 和 PSRAM 等存儲器。FSMC 的框圖如圖 18.1.2.1 所:圖 18.1.2.1 FSMC 框圖從上圖我們可以看出,STM32F4 的 FSMC 將外部設備分為 2 類:NOR/PSRAM 設備、NAND/PC 卡設備。他們共地址數(shù)據(jù)總線等信號,他們具有不同的 CS 以區(qū)分不同的設備,如本章我們到的 TFTLCD 就是的 FSMC_NE4 做選,其實就是將 TFTLCD 當成 SRAM 來控制。這我們介紹下為什么可以把 TFTLCD 當成 SRAM 設備:先我們了解下外部 SRAM的連接,外部 SRAM 的控制般有:地址線(如 A0A18)、數(shù)據(jù)線(如 D0D15)、寫信號(W
20、E)、讀信號(OE)、選信號(CS),如果 SRAM 持字節(jié)控制,那么還有 UB/LB 信號。 TFTLCD的信號我們在 18.1.1 節(jié)有介紹,包括:RS、D0D15、WR、RD、CS、RST 和 BL 等,其中真正在操作 LCD 的時候需要到的就只有:RS、D0D15、WR、RD 和 CS。其操作時序和 SRAM的控制完全類似,唯不同就是 TFTLCD 有 RS 信號,但是沒有地址信號。TFTLCD 通過 RS 信號來決定傳送的數(shù)據(jù)是數(shù)據(jù)還是命令,本質(zhì)上可以理解為個地址信號,如我們把 RS 接在 A0 上,那么當 FSMC 控制器寫地址 0 的時候,會使得 A0 變?yōu)?0,對 TFTLCD
21、 來說,就是寫命令。 FSMC 寫地址 1 的時候,A0 將會變?yōu)?1,對 TFTLCD 來說,就是寫數(shù)據(jù)了。這樣,就把數(shù)據(jù)和命令區(qū)分開了,他們其實就是對應 SRAM 操作的兩個連續(xù)地址。當然 RS 也可以接在其他地址線上,探索者 STM32F4 開發(fā)板是把 RS 連接在 A6 上的。STM32F4 的 FSMC 持 8/16/32 位數(shù)據(jù)寬度,我們這到的 LCD 是 16 位寬度的,所以在設置的時候,選擇 16 位寬就 OK 了。我們再來看看 FSMC 的外部設備地址映像,STM32F4的 FSMC 將外部存儲器劃分為固定為 256M 字節(jié)的四個存儲塊,如圖 18.1.2.2 所:圖 18.
22、1.2.2 FSMC 存儲塊地址映像從上圖可以看出,F(xiàn)SMC 總共管理 1GB 空間,擁有 4 個存儲塊(Bank),本章,我們到的是塊 1,所以在本章我們僅討論塊 1 的相關配置,其他塊的配置,請參考STM32F4xx 中參考冊第 32 章(1191 頁)的相關介紹。STM32F4 的 FSMC 存儲塊 1(Bank1)被分為 4 個區(qū),每個區(qū)管理 64M 字節(jié)空間,每個區(qū)都有獨的寄存器對所連接的存儲器進配置。Bank1 的 256M 字節(jié)空間由 28 根地址線(HADDR27:0)尋址。這 HADDR 是內(nèi) 部 AHB 地址總 線,其 中 HADDR25:0來外部存儲器地址FSMC_A25
23、:0, HADDR26:27對 4 個區(qū)進尋址。如表 18.1.2.1 所:表 18.1.2.1 Bank1 存儲區(qū)選擇表表 18.1.2.1 中,我們要特別注意 HADDR25:0的對應關系:當 Bank1 接的是 16 位寬度存儲器的時候:HADDR25:1 FSMC_A24:0。當 Bank1 接的是 8 位寬度存儲器的時候:HADDR25:0 FSMC_A25:0。不論外部接 8 位/16 位寬設備,F(xiàn)SMC_A0永遠接在外部設備地址 A0。 這,TFTLCD使的是 16 位數(shù)據(jù)寬度,所以 HADDR0并沒有到,只有 HADDR25:1是有效的,對應關系變?yōu)椋篐ADDR25:1 FSM
24、C_A24:0,相當于右移了位,這請家特別留意。另外,HADDR27:26的設置,是不需要我們預的,如:當你選擇使 Bank1 的第三個區(qū),即使 FSMC_NE3 來連接外部設備的時候,即對應了 HADDR27:26=10,我們要做的就是配置對應第 3區(qū)的寄存器組,來適應外部設備即可。STM32F4 的 FSMC 各Bank配置寄存器如表 18.1.2.2所:表 18.1.2.2 FSMC 各 Bank 配置寄存器表對于 NOR FLASH 控制器,主要是通過 FSMC_BCRx、FSMC_BTRx 和 FSMC_BWTRx 寄存器設置(其中 x=14,對應 4 個區(qū))。通過這 3 個寄存器,
25、可以設置 FSMC 訪問外部存儲器的時序參數(shù),拓寬了可選的外部存儲器的速度范圍。FSMC 的 NOR FLASH 控制器持同步和異步突發(fā)兩種訪問式。選同步突發(fā)訪問式時,F(xiàn)SMC 將 HCLK(系統(tǒng)時鐘)分頻后,發(fā)送給外部存儲器作為同步時鐘信號 FSMC_CLK。此時需要的設置的時間參數(shù)有 2 個:1,HCLK 與 FSMC_CLK 的分頻系數(shù)(CLKDIV),可以為 216 分頻;2,同步突發(fā)訪問中獲得第 1 個數(shù)據(jù)所需要的等待延遲(DATLAT)。對于異步突發(fā)訪問式,F(xiàn)SMC 主要設置 3 個時間參數(shù):地址建時間(ADDSET)、數(shù)據(jù)建時間(DATAST)和地址保持時間(ADDHLD)。FS
26、MC 綜合了 SRAMROM、PSRAM 和 NORFlash 產(chǎn)品的信號特點,定義了 4 種不同的異步時序模型。選不同的時序模型時,需要設置不同的時序參數(shù),如表 18.1.2.3 所列:表 18.1.2.3 NOR FLASH 控制器持的時序模型在實際擴展時,根據(jù)選存儲器的特征確定時序模型,從確定各時間參數(shù)與存儲器讀寫周期參數(shù)指標之間的計算關系;利該計算關系和存儲芯數(shù)據(jù)冊中給定的參數(shù)指標,可計算出 FSMC 所需要的各時間參數(shù),從對時間參數(shù)寄存器進合理的配置。本章,我們使異步模式 A(ModeA)式來控制 TFTLCD,模式 A 的讀操作時序如圖18.1.2.3 所:圖 18.1.2.3 模
27、式 A 讀操作時序圖模式 A 持獨的讀寫時序控制,這個對我們驅動 TFTLCD 來說常有,因為 TFTLCD在讀的時候,般較慢,在寫的時候可以較快,如果讀寫樣的時序,那么只能以讀的時序為基準,從導致寫的速度變慢,或者在讀數(shù)據(jù)的時候,重新配置 FSMC 的延時,在讀操作完成的時候,再配置回寫的時序,這樣雖然也不會降低寫的速度,但是頻繁配置,較煩。如果有獨的讀寫時序控制,那么我們只要初始化的時候配置好,之后就不再配置,既可以滿速度要求,不需要頻繁改配置。模式 A 的寫操作時序如圖 18.1.2.4 所:圖 18.1.2.4 模式 A 寫操作時序圖 18.1.2.3 和圖 18.1.2.4 中的 A
28、DDSET 與 DATAST,是通過不同的寄存器設置的,接下來我們講解下 Bank1 的個控制寄存器先,我們介紹 SRAM/NOR 閃存選控制寄存器:FSMC_BCRx(x=14),該寄存器各位描述如圖 18.1.2.5 所:圖 18.1.2.5 FSMC_BCRx 寄存器各位描述該寄存器我們在本章到的設置有:EXTMOD、WREN、MWID、MTYP 和 MBKEN 這個設置,我們將逐個介紹。EXTMOD:擴展模式使能位,也就是是否允許讀寫不同的時序,很明顯,我們本章需要讀寫不同的時序,故該位需要設置為 1。WREN:寫使能位。我們需要向 TFTLCD 寫數(shù)據(jù),故該位必須設置為 1。MWID
29、1:0:存儲器數(shù)據(jù)總線寬度。00,表 8 位數(shù)據(jù)模式;01 表 16 位數(shù)據(jù)模式;10和 11 保留。我們的 TFTLCD 是 16 位數(shù)據(jù)線,所以設置 WMID1:0=01。MTYP1:0:存儲器類型。00 表 SRAM、ROM;01 表 PSRAM;10 表 NOR FLASH;11保留。前提到,我們把 TFTLCD 當成 SRAM ,所以需要設置 MTYP1:0=00。MBKEN:存儲塊使能位。這個容易理解,我們需要到該存儲塊控制 TFTLCD,當然要使能這個存儲塊了。接下來,我們看看 SRAM/NOR 閃存選時序寄存器:FSMC_BTRx(x=14),該寄存器各位描述如圖 18.1.2
30、.6 所:圖 18.1.2.6 FSMC_BTRx 寄存器各位描述這個寄存器包含了每個存儲器塊的控制信息,可以于 SRAM、ROM 和 NOR 閃存存儲器。如果 FSMC_BCRx 寄存器中設置了 EXTMOD 位,則有兩個時序寄存器分別對應讀(本寄存器)和寫操作(FSMC_BWTRx 寄存器)。因為我們要求讀寫分開時序控制,所以 EXTMOD 是使能了的,也就是本寄存器是讀操作時序寄存器,控制讀操作的相關時序。本章我們要到的設置有:ACCMOD、DATAST 和 ADDSET 這三個設置。ACCMOD1:0:訪問模式。00 表訪問模式 A;01 表訪問模式 B;10 表訪問模式 C;11 表
31、訪問模式 D,本章我們到模式 A,故設置為 00。DATAST7:0:數(shù)據(jù)保持時間。0 為保留設置,其他設置則代表保持時間為:DATAST 個HCLK 時鐘周期,最為 255 個 HCLK 周期。對 ILI9341 來說,其實就是 RD 低電平持續(xù)時間,般為 355ns。個 HCLK 時鐘周期為 6ns 左右(1/168Mhz),為了兼容其他屏,我們這設置 DATAST 為 60,也就是 60 個 HCLK 周期,時間約是 360ns。ADDSET3:0:地址建時間。其建時間為:ADDSET 個 HCLK 周期,最為 15 個 HCLK周期。對 ILI9341 來說,這相當于 RD 電平持續(xù)時
32、間,為 90ns,我們設置 ADDSET 為 15,即 15*6=90ns。最后,我們再來看看 SRAM/NOR 閃寫時序寄存器:FSMC_BWTRx(x=14),該寄存器各位描述如圖 18.1.2.7 所:圖 18.1.2.7 FSMC_BWTRx 寄存器各位描述該寄存器在本章作寫操作時序控制寄存器,需要到的設置同樣是:ACCMOD、DATAST和 ADDSET 這三個設置。這三個設置的法同 FSMC_BTRx 模樣,只是這對應的是寫操作的時序,ACCMOD 設置同 FSMC_BTRx 模樣,同樣是選擇模式 A,另外 DATAST 和ADDSET 則對應低電平和電平持續(xù)時間,對 ILI934
33、1 來說,這兩個時間只需要 15ns 就夠了,讀操作快得多。所以我們這設置 DATAST 為 2,即 3 個 HCLK 周期,時間約為 18ns。然后ADDSET 設置為 3,即 3 個 HCLK 周期,時間為 18ns。此,我們對 STM32F4 的 FSMC 介紹就差不多了,通過以上兩個節(jié)的了解,我們可以開始寫 LCD 的驅動代碼了。不過,這還要給家做下科普,在 MDK 的寄存器定義,并沒有定義 FSMC_BCRx、FSMC_BTRx、FSMC_BWTRx 等這個單獨的寄存器,是將他們進了些組合。FSMC_BCRx 和 FSMC_BTRx,組合成 BTCR8寄存器組,他們的對應關系如下:B
34、TCR0對應 FSMC_BCR1,BTCR1對應 FSMC_BTR1BTCR2對應 FSMC_BCR2,BTCR3對應 FSMC_BTR2BTCR4對應 FSMC_BCR3,BTCR5對應 FSMC_BTR3BTCR6對應 FSMC_BCR4,BTCR7對應 FSMC_BTR4FSMC_BWTRx 則組合成 BWTR7,他們的對應關系如下:BWTR0對應 FSMC_BWTR1,BWTR2對應 FSMC_BWTR2,BWTR4對應 FSMC_BWTR3,BWTR6對應 FSMC_BWTR4BWTR1、BWTR3和 BWTR5保留,沒有到。通過上的講解,通過對 FSMC 相關的寄存器的描述,家對
35、FSMC 的原理有了個初步的認識,如果還不熟悉的朋友,請定要搜索絡資料理解 FSMC 的原理。只有理解了原理,使庫函數(shù)才可以得應。那么在庫函數(shù)中是怎么實現(xiàn) FSMC 的配置的呢?FSMC_BCRx,F(xiàn)SMC_BTRx 寄存器在庫函數(shù)是通過什么函數(shù)來配置的呢?下我們來講解下 FSMC 相關的庫函數(shù):FSMC 初始化函數(shù)根據(jù)前的講解,初始化 FSMC 主要是初始化三個寄存器 FSMC_BCRx,F(xiàn)SMC_BTRx,F(xiàn)SMC_BWTRx,在 HAL 庫中提供了 FSMC 初始化函數(shù)為HAL_SRAM_Init ();下我們看看函數(shù)定義:HAL_StatusTypeDef HAL_SRAM_Init(
36、SRAM_HandleTypeDef *hsram,FMC_NORSRAM_TimingTypeDef *Timing, FMC_NORSRAM_TimingTypeDef *ExtTiming)這 個 函 數(shù) 有 三 個 參 數(shù) , SRAM_HandleTypeDef 類 型 指 針 變 量 、FMC_NORSRAM_TimingTypeDef 類型指針變量、FMC_NORSRAM_TimingTypeDef 類型指針變量。FMC_NORSRAM_TimingTypeDef 指針類型的成員變量。前我們講到,F(xiàn)SMC 有讀時序和寫時序之分,所以這就是來設置讀時序和寫時序的參數(shù)了, 也就是說,
37、這兩個參數(shù)是來配置寄存器 FSMC_BTRx 和 FSMC_BWTRx,后我們會講解到。下我們主要來看看模式A 下的相關配置參數(shù):參數(shù) NSBank 來設置使到的存儲塊標號和區(qū)號,前講過,我們是使的存儲塊 1 區(qū)號 4,所以選擇值為 FSMC_NORSRAM_BANK4。參數(shù) MemoryType 來設置存儲器類型,我們這是 SRAM,所以選擇值為FSMC_MEMORY_TYPE_SRAM。參數(shù) MemoryDataWidth 來設置數(shù)據(jù)寬度,可選 8 位還是 16 位,這我們是 16 位數(shù)據(jù)寬度,所以選擇值為 FSMC_NORSRAM_MEM_BUS_WIDTH_16。參數(shù) WriteOpe
38、ration 來設置寫使能,毫疑問,我們前講解過我們要向 TFT 寫數(shù)據(jù),所以要寫使能,這我們選擇 FSMC_WRITE_OPERATION_ENABLE。參數(shù) ExtendedMode 是設置擴展模式使能位,也就是是否允許讀寫不同的時序,這我們采取的讀寫不同時序,所以設置值為 FSMC_EXTENDED_MODE_ENABLE。上的這些參數(shù)是與模式 A 相關的,下我們也來稍微了解下其他個參數(shù)的意義吧:參數(shù) DataAddressMux 來設置地址/數(shù)據(jù)復使能,若設置為使能,那么地址的低 16 位和數(shù)據(jù)將共數(shù)據(jù)總線,僅對 NOR 和 PSRAM 有效,所以我們設置為默認值不復,值FSMC_DA
39、TA_ADDRESS_MUX_DISABLE。其他參數(shù)在成組模式同步模式才需要設置,家可以參考中參考冊了解相關參數(shù)的意思。接下來我們看看設置讀寫時序參數(shù)的兩個變量 FSMC_ReadWriteTim 和 FSMC_WriteTim,他們都是 FSMC_NORSRAM_TimingTypeDef 結構體指針類型,這兩個參數(shù)在初始化的時候分別來初始化選控制寄存器 FSMC_BTRx 和寫操作時序控制寄存器 FSMC_BWTRx。下我們看看 FSMC_NORSRAMTimingInitTypeDef 類型的定義:typedef structuint32_t AddressSetupTime;uint
40、32_t AddressHoldTime;uint32_t DataSetupTime;uint32_t BusTurnAroundDuration;uint32_t CLKDivision;uint32_t DataLatency;uint32_t AccessMode;FSMC_NORSRAM_TimingTypeDef;這個結構體有 7 個參數(shù)來設置 FSMC 讀寫時序。其實這些參數(shù)的意思我們前在講解 FSMC的時序的時候有提到,主要是設計地址建保持時間,數(shù)據(jù)建時間等等配置,對于我們的實驗中,讀寫時序不樣,讀寫速度要求不樣,所以對于參數(shù) FSMC_DataSetupTime 設置了不同的
41、值,家可以對照理解下。記住,這些參數(shù)的意義在前講解 FSMC_BTRx 和FSMC_BWTRx 寄存器的時候都有提到,家可以翻過去看看。18.2 硬件設計本實驗到的硬件資源有:1) 指燈 DS02) TFTLCD 模塊TFTLCD 模塊的電路見圖 18.1.1.2,這我們介紹 TFTLCD 模塊與正點原探索者STM32F4 開發(fā)板的連接,探索者 STM32F4 開發(fā)板底板的 LCD 接和 TFTLCD 模塊直接可以對插,連接關系如圖 18.2.1 所:圖 18.2.1 TFTLCD 與開發(fā)板連接意圖圖 18.2.1 中圈出來的部分就是連接 TFTLCD 模塊的接,液晶模塊直接插上去即可。在硬件
42、上,TFTLCD 模塊與探索者 STM32F4 開發(fā)板的 IO 對應關系如下:LCD_BL(背光控制)對應 PB0;LCD_CS 對應 PG12 即 FSMC_NE4;LCD _RS 對應 PF12 即 FSMC_A6;LCD _WR 對應 PD5 即 FSMC_NWE;LCD _RD 對應 PD4 即 FSMC_NOE;LCD _D15:0則直接連接在 FSMC_D15FSMC_D0;這些線的連接,探索者 STM32F4 開發(fā)板的內(nèi)部已經(jīng)連接好了,我們只需要將 TFTLCD 模塊插上去就好了。實物連接如圖 18.2.2 所:圖 18.2.2 TFTLCD 與開發(fā)板連接實物圖18.3 軟件設計
43、打開我們光盤的 TFT LCD 顯實驗程可以看到我們添加了兩個件 lcd.c 和頭件 lcd.h。同時,F(xiàn)SMC 相關的庫函數(shù)分布在 stm32f4xx_hal_fsmc.c 件和頭件 stm32f4xx_hal_fsmc.h 中。所以我們在程中要引 stm32f4xx_hal_fsmc.c 源件。在 lcd.c 代碼較多,我們這就不貼出來了,只針對個重要的函數(shù)進講解。完整版的代碼見光盤4,程序源碼標準例程-HAL 庫版本實驗 13 TFTLCD 顯實驗的 lcd.c 件。本實驗,我們到 FSMC 驅動 LCD,通過前的介紹,我們知道 TFTLCD 的 RS 接在 FSMC的 A6 上,CS
44、接在 FSMC_NE4 上,并且是 16 位數(shù)據(jù)總線。即我們使的是 FSMC 存儲器 1的第 4 區(qū),我們定義如下 LCD 操作結構體(在 lcd.h 定義):/LCD 操作結構體typedef structvu16 LCD_REG;vu16 LCD_RAM; LCD_TypeDef;/使 NOR/SRAM 的 Bank1.sector4,地址位 HADDR27,26=11 A6 作為數(shù)據(jù)命令區(qū)分線/注意 16 位數(shù)據(jù)總線時,STM32 內(nèi)部地址會右移位對齊!#define LCD_BASE (u32)(0 x6C000000 | 0 x0000007E)#define LCD (LCD_Ty
45、peDef *) LCD_BASE)其中 LCD_BASE,必須根據(jù)我們外部電路的連接來確定,我們使 Bank1.sector4 就是從地址 0X6C000000 開始, 0X0000007E,則是 A6 的偏移量,這很多朋友不理解這個偏移量的概念,簡單說明下:以 A6 為例,7E 轉換成進制就是:1111110, 16 位數(shù)據(jù)時,地址右移位對齊,那么實際對應到地址引腳的時候,就是:A6:A0=0111111,此時 A6 是 0,但是如果 16 位地址再加 1(注意:對應到 8 位地址是加 2,即 7E+0X02),那么:A6:A0=1000000,此時 A6 就是 1 了,即實現(xiàn)了對 RS
46、的 0 和 1 的控制。我們將這個地址強制轉換為 LCD_TypeDef 結構體地址,那么可以得到 LCD-LCD_REG 的地址就是 0X6C00,007E,對應 A6 的狀態(tài)為 0(即 RS=0), LCD- LCD_RAM 的地址就是0X6C00,0080(結構體地址增),對應 A6 的狀態(tài)為 1(即 RS=1)。所以,有了這個定義,當我們要往 LCD 寫命令/數(shù)據(jù)的時候,可以這樣寫:LCD-LCD_REG=CMD;/寫命令LCD-LCD_RAM=DATA;/寫數(shù)據(jù)讀的時候反過來操作就可以了,如下所:CMD= LCD-LCD_REG;/讀 LCD 寄存器DATA = LCD-LCD_RA
47、M;/讀 LCD 數(shù)據(jù)這其中,CS、WR、RD 和 IO 向都是由 FSMC 控制,不需要我們動設置了。接下來,我們先介紹下 lcd.h 的另個重要結構體:/LCD 重要參數(shù)集typedef structu16 width; /LCD 寬度u16 height; /LCD 度u16 id; /LCD IDu8 dir; /橫屏還是豎屏控制:0,豎屏;1,橫屏。u16 wramcmd;/開始寫 gram 指令u16 setxcmd; /設置 x 坐標指令u16 setycmd; /設置 y 坐標指令_lcd_dev;/LCD 參數(shù)extern _lcd_dev lcddev; /管理 LCD 重
48、要參數(shù)該結構體于保存些 LCD 重要參數(shù)信息,如 LCD 的長寬、LCD ID(驅動 IC 型號)、LCD 橫豎屏狀態(tài)等,這個結構體雖然占了個字節(jié)的內(nèi)存,但是卻可以讓我們的驅動函數(shù)持不同尺的 LCD,同時可以實現(xiàn) LCD 橫豎屏切換等重要功能,所以還是利于弊的。有了以上了解,下我們開始介紹 lcd.c 的些重要函數(shù)。先看 7 個簡單,但是很重要的函數(shù):/寫寄存器函數(shù)/regval:寄存器值void LCD_WR_REG(vu16 regval) regval=regval; /使-O2 優(yōu)化的時候,必須插的延時LCD-LCD_REG=regval;/寫要寫的寄存器序號/寫 LCD 數(shù)據(jù)/dat
49、a:要寫的值void LCD_WR_DATA(vu16 data) data=data; /使-O2 優(yōu)化的時候,必須插的延時LCD-LCD_RAM=data;/讀 LCD 數(shù)據(jù)/返回值:讀到的值u16 LCD_RD_DATA(void) vu16 ram; /防被優(yōu)化ram=LCD-LCD_RAM;return ram;/寫寄存器/LCD_Reg:寄存器地址/LCD_RegValue:要寫的數(shù)據(jù)void LCD_WriteReg(vu16 LCD_Reg, vu16 LCD_RegValue) LCD-LCD_REG = LCD_Reg; /寫要寫的寄存器序號LCD-LCD_RAM = LC
50、D_RegValue; /寫數(shù)據(jù)/讀寄存器/LCD_Reg:寄存器地址/返回值:讀到的數(shù)據(jù)u16 LCD_ReadReg(vu16 LCD_Reg) LCD_WR_REG(LCD_Reg); /寫要讀的寄存器序號delay_us(5);return LCD_RD_DATA(); /返回讀到的值/開始寫 GRAMvoid LCD_WriteRAM_Prepare(void) LCD-LCD_REG=lcddev.wramcmd;/LCD 寫 GRAM/RGB_Code:顏值void LCD_WriteRAM(u16 RGB_Code) LCD-LCD_RAM = RGB_Code;/寫六位 GR
51、AM因為 FSMC 動控制了 WR/RD/CS 等這些信號,所以這 7 個函數(shù)實現(xiàn)起來都常簡單,我們就不多說,注意,上有個函數(shù),我們添加了些對 MDK O2 優(yōu)化的持,去掉的話,在-O2 優(yōu)化的時候會出問題。這些函數(shù)實現(xiàn)功能見函數(shù)前的備注,通過這個簡單函數(shù)的組合,我們就可以對 LCD 進各種操作了。第七個要介紹的函數(shù)是坐標設置函數(shù),該函數(shù)代碼如下:/設置光標位置/Xpos:橫坐標/Ypos:縱坐標void LCD_SetCursor(u16 Xpos, u16 Ypos)if(lcddev.id=0X9341|lcddev.id=0X5310)LCD_WR_REG(lcddev.setxcmd
52、);LCD_WR_DATA(Xpos8);LCD_WR_DATA(Xpos&0XFF);LCD_WR_REG(lcddev.setycmd);LCD_WR_DATA(Ypos8);LCD_WR_DATA(Ypos&0XFF);else if(lcddev.id=0X6804)if(lcddev.dir=1)Xpos=lcddev.width-1-Xpos;/橫屏時處理LCD_WR_REG(lcddev.setxcmd);LCD_WR_DATA(Xpos8);LCD_WR_DATA(Xpos&0XFF);LCD_WR_REG(lcddev.setycmd);LCD_WR_DATA(Ypos8);
53、LCD_WR_DATA(Ypos&0XFF);else if(lcddev.id=0X5510)LCD_WR_REG(lcddev.setxcmd);LCD_WR_DATA(Xpos8);LCD_WR_REG(lcddev.setxcmd+1);LCD_WR_DATA(Xpos&0XFF);LCD_WR_REG(lcddev.setycmd);LCD_WR_DATA(Ypos8);LCD_WR_REG(lcddev.setycmd+1);LCD_WR_DATA(Ypos&0XFF);elseif(lcddev.dir=1)Xpos=lcddev.width-1-Xpos;/橫屏其實就是調(diào)轉 x
54、,y 坐標LCD_WriteReg(lcddev.setxcmd, Xpos);LCD_WriteReg(lcddev.setycmd, Ypos);該函數(shù)實現(xiàn)將 LCD 的當前操作點設置到指定坐標(x,y)。因為 9341/5310/6804/5510 等的設置同其他屏有些不太樣,所以進了區(qū)別對待。接下來我們介紹第個函數(shù):畫點函數(shù)。該函數(shù)實現(xiàn)代碼如下:/畫點/x,y:坐標/POINT_COLOR:此點的顏void LCD_DrawPoint(u16 x,u16 y)LCD_SetCursor(x,y); /設置光標位置LCD_WriteRAM_Prepare(); /開始寫 GRAMLCD-
55、LCD_RAM=POINT_COLOR;該函數(shù)實現(xiàn)較簡單,就是先設置坐標,然后往坐標寫顏。其中 POINT_COLOR 是我們定義的個全局變量,于存放畫筆顏,順帶介紹下另外個全局變量:BACK_COLOR,該變量代表 LCD 的背景。LCD_DrawPoint 函數(shù)雖然簡單,但是關重要,其他乎所有上層函數(shù),都是通過調(diào)這個函數(shù)實現(xiàn)的。有了畫點,當然還需要有讀點的函數(shù),第九個介紹的函數(shù)就是讀點函數(shù),于讀取 LCD的 GRAM,這說明下,為什么 OLED 模塊沒做讀 GRAM 的函數(shù),這做了。因為 OLED模塊是單的,所需要全部 GRAM 也就 1K 個字節(jié), TFTLCD 模塊為彩的,點數(shù)也 OL
56、ED模塊多很多,以 16 位計算,款 320240 的液晶,需要 3202402 個字節(jié)來存儲顏值,也就是也需要 150K 字節(jié),這對任何款單機來說,都不是個數(shù)了。且我們在圖形疊加的時候,可以先讀回原來的值,然后寫新的值,在完成疊加后,我們恢復原來的值。這樣在做些簡單菜單的時候,是很有的。這我們讀取 TFTLCD 模塊數(shù)據(jù)的函數(shù)為LCD_ReadPoint,該函數(shù)直接返回讀到的 GRAM 值。該函數(shù)使之前要先設置讀取的 GRAM地址,通過 LCD_SetCursor 函數(shù)來實現(xiàn)。LCD_ReadPoint 的代碼如下:/讀取個某點的顏值/x,y:坐標/返回值:此點的顏u16 LCD_ReadP
57、oint(u16 x,u16 y)vu16 r=0,g=0,b=0;if(x=lcddev.width|y=lcddev.height)return 0;/超過了范圍,直接返回LCD_SetCursor(x,y);if(lcddev.id=0X9341|lcddev.id=0X6804|lcddev.id=0X5310)LCD_WR_REG(0X2E);/9341/6804/3510 發(fā)送讀 GRAM 指令else if(lcddev.id=0X5510)LCD_WR_REG(0X2E00);/5510 發(fā)送讀 GRAM 指令else LCD_WR_REG(R34); /其他 IC 發(fā)送讀 G
58、RAM 指令if(lcddev.id=0X9320)opt_delay(2); /FOR 9320,延時 2usLCD_RD_DATA(); /dummy Readopt_delay(2);r=LCD_RD_DATA(); /實際坐標顏if(lcddev.id=0X9341|lcddev.id=0X5310|lcddev.id=0X5510) /9341/NT35310/NT35510 要分 2 次讀出opt_delay(2);b=LCD_RD_DATA();g=r&0XFF;/9341/5310/5510 等,第次讀取的是 RG 的值,R 在前,G 在后,各占 8 位g11)10)11);
59、/ILI9341/NT35310/NT35510 需要公式轉換下else return LCD_BGR2RGB(r); /其他 IC在 LCD_ReadPoint 函數(shù)中,因為我們的代碼不持種 LCD 驅動器,所以,我們根據(jù)不同的 LCD 驅動器((lcddev.id)型號,執(zhí)不同的操作,以實現(xiàn)對各個驅動器兼容,提函數(shù)的通性。第個要介紹的是字符顯函數(shù) LCD_ShowChar,該函數(shù)同前 OLED 模塊的字符顯函數(shù)差不多,但是這的字符顯函數(shù)多了 1 個功能,就是可以以疊加式顯,或者以疊加式顯。疊加式顯多于在顯的圖上再顯字符。疊加式般于普通的顯。該函數(shù)實現(xiàn)代碼如下:/在指定位置顯個字符/x,y:
60、起始坐標/num:要顯的字符:-/size:字體 12/16/24/mode:疊加式(1)還是疊加式(0)void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)u8 temp,t1,t; u16 y0=y;u8 csize=(size/8+(size%8)?1:0)*(size/2);/得到字體個字符對應點陣集所占的字節(jié)數(shù)/設置窗num=num-;/得到偏移后的值for(t=0;tcsize;t+)if(size=12)temp=asc2_1206numt; /調(diào) 1206 字體else if(size=16)temp=asc2_1608nu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年醫(yī)用冷鏈物流運輸服務合同
- 2026年醫(yī)院非醫(yī)學教育合同
- 2025年文旅創(chuàng)意產(chǎn)業(yè)園建設項目可行性研究報告
- 2025年綜合物流配送中心項目可行性研究報告
- 2025年高端農(nóng)業(yè)科技園區(qū)建設項目可行性研究報告
- 中貿(mào)易合同范本
- 紋眉客戶合同協(xié)議
- 交房補充協(xié)議書
- 2025年互聯(lián)網(wǎng)診療服務項目可行性研究報告
- 通信技術專家面試題解析
- 執(zhí)法用手機管理辦法
- 雙重管理安全員管理辦法
- 2019-2025年中國鮮切水果行業(yè)市場調(diào)查研究及投資前景預測報告
- 染色體核型分析報告解讀要點
- 2025年中國泵行業(yè)市場白皮書
- (高清版)DB1303∕T 357-2023 鮮食核桃果實主要病蟲害防治技術規(guī)程
- 無人機集群技術-智能組網(wǎng)與協(xié)同 課件全套 第1-8章 緒論- 無人機集群任務分配
- 天然牙-種植體聯(lián)合支持下頜覆蓋義齒的三維有限元分析
- 智圓行方的世界-中國傳統(tǒng)文化概論知到課后答案智慧樹章節(jié)測試答案2025年春暨南大學
- 《大中型無刷勵磁發(fā)電機組主勵磁機保護技術導則》
- 師德師風自查自糾工作自查報告
評論
0/150
提交評論