黃克亞
(蘇州大學 機電工程學院,江蘇 蘇州, 215131)
嵌入式系統(tǒng)均需配備顯示設備以指示程序運行狀態(tài)和輸出控制結果。薄膜晶體管液晶顯示器(TFT-LCD)因為功耗低、輻射小、顏色鮮艷、顯示內(nèi)容豐富等優(yōu)點而成為嵌入式系統(tǒng)的主流,但是其控制復雜,需要移植廠家提供的底層驅動程序[1-2]。數(shù)碼管亮度高、穩(wěn)定可靠、價格便宜,在家用電器、工業(yè)控制和傳感檢測等領域有著廣泛的應用,是嵌入式學習的經(jīng)典器件。
為提高數(shù)據(jù)傳輸速度,降低軟硬件設計難度,并行接口是數(shù)碼管、液晶顯示器與微控制器(MCU)連接的首選。但并口需要占用大量I/O口資源,以6 位數(shù)碼管為例,共有6 個位選信號和8 個段選信號,TFT-LCD 顯示模塊則有6 個控制信號和16 位數(shù)據(jù)線。設計系統(tǒng)時,為了編程方便,一般希望位選信號、段選信號、LCD 數(shù)據(jù)線分別占用連續(xù)的16 位端口,而這些I/O 引腳又離散地分布于芯片的四周,上述技術需求給微控制器引腳資源分配和PCB 布線帶來極大的挑戰(zhàn),同時降低了實驗裝置的可靠性,而破解這一難題的方法就是將二者均掛接在FSMC 總線上,同時進行信號線復用。
靈活靜態(tài)存儲控制器(Flexible Static Memory Controller,F(xiàn)SMC)能夠連接同步、異步存儲器和16 位PC 存儲卡,支持SRAM、NAND Flash、NOR Flash 和PSRAM 等 類 型 存 儲 器。FSMC 連接的所有外部存儲器共享地址、數(shù)據(jù)和控制信號,但有各自的片選信號,所以FSMC 一次只能訪問一個外部器件[3-4]。
如圖1 所示,F(xiàn)SMC 將外部存儲器1 GB 空間劃分為固定大小為256 MB 的4 個存儲塊(Bank),Bank1 可連接多達4 個NOR Flash 或PSRAM/SRAM 存 儲 器 件,Bank2 和Bank3 用 于 訪 問NAND Flash 存儲器,每個存儲區(qū)域連接一個設備,Bank4 用于連接PC Card 設備。其中Bank1又被分為4 個區(qū)(Sector),每個區(qū)管理64 MB 空間,每個區(qū)都有獨立的寄存器對所連接的存儲器進行配置。
圖1 FSMC 存儲區(qū)域劃分Fig.1 Division of FSMC storage area
如 表1 所 示,Bank1 的256 MB 空 間 由28 根地址線(HADDR[27:0])尋址。這里HADDR 是內(nèi)部AHB 總線地址,其中HADDR[25:0]來自外部存儲器地址FSMC_A[25:0],對應引腳地址信號;而HADDR[27:26]對4 個區(qū)進行尋址,由系統(tǒng)自動完成,無外部引腳對應信號。
表1 Bank1 存儲區(qū)選擇表Tab.1 Bank1 storage area selection table
在設計或分析系統(tǒng)時需要特別注意HADDR[25:0]的對應關系。
當Bank1 連接的是8 位寬度存儲器時,總線和外設均采用字節(jié)編址,二者一一對應,即:HADDR[25:0]→FSMC_A[25:0]。
當Bank1 連接的是16 位寬度存儲器時,總線字節(jié)編址,存儲器雙字節(jié)尋址,此時總線26 地 址 中 最 低 位HADDR[0]用 來 表 示16 位數(shù) 據(jù) 的 高 位 或 低 位,高25 位HADDR[25:1]對應16 位寬的存儲器單元地址,即:HADDR[25:1]→FSMC_A[24:0],相當于總線地址右移了一位[5-6]。
作者設計的嵌入式系統(tǒng)實驗裝置結構框圖如圖2 所示,其重點展示TFT-LCD 和數(shù)碼管的FSMC 總線連接關系,其他模塊,如CMSIS-DAP調(diào)試器、LED 流水燈、獨立/矩陣按鍵等雖也為實驗裝置重要組成部分,但不是本文討論重點,故未繪制。實驗裝置主控芯片選擇基于ARM Cortex-M4 內(nèi)核,性能出色的STM32F407ZGT6微控制器,該芯片擁有完備的FSMC 接口系統(tǒng),塊1 的4 個子區(qū)可同時連接4 個NOR Flash/PSRAM/SRAM 存儲設備。實驗裝置配備雙顯示終端,數(shù)碼顯示器為6 位14.22 mm(0.56 in)共陽數(shù)碼管,PNP 三極管S8550 驅動;液晶顯示器為70.82 mm(2.8 in)全彩TFT-LCD 顯示模塊,240 像素×320像素,2.8~3.3 V 供電,ILI9341驅動,16 位8080 并行接口。
圖2 實驗裝置FSMC 連接結構框圖Fig.2 FSMC connection structure block diagram of experimental device
在STM32 內(nèi)部,F(xiàn)SMC 起到橋梁作用,其一端通過內(nèi)部高速總線AHB 連接到Cortex 內(nèi)核,另一端則是面向擴展存儲器的外部總線,既能夠進行信號類型的轉換,又能夠進行信號寬度和時序的調(diào)整,提供多種讀寫模式,使之對內(nèi)核而言沒 有 區(qū) 別[7-8]。模 式A 比 較 適 合 連 接 至Bank1 的NOR Flash/PSRAM/SRAM 存儲器,其讀寫時序如圖3 所示[9]。信號線主要包括26 位地址線A[25:0],16 位數(shù)據(jù)線D[15:0],片選信號NE[x],輸出使能NOE,寫入使能NEW。
圖3 FSMC 模式A 讀寫時序Fig.3 Read and write timing of FSMC mode A
TFT-LCD 顯示模塊信號線包括:數(shù)據(jù)線D[15:0],寄存器/存儲器選擇RS,讀使能RD,寫使能WR,片選CS,復位RST。通常使用標準的16 位8080 并口與微控制器連接,其讀寫時序如圖4 所示[10]。
圖4 8080 接口讀寫時序Fig.4 Read and write timing of 8080 interface
對比圖3、圖4 讀寫時序和二者控制信號可以發(fā)現(xiàn),TFT-LCD 模塊,除了已連接至系統(tǒng)復位電路的RST 信號外,其他信號均可由FSMC 接口提供,所以FSMC 連接PSRAM/SRAM 的工作模式適合于連接TFT-LCD 顯示模塊。如圖2所示,項目實施時選擇FSMC 總線的Bank1.Sector4 連接TFT-LCD,F(xiàn)SMC_NE4 接LCD 片選 信 號CS,F(xiàn)SMC_NOE 接LCD 讀 引 腳RD,F(xiàn)SMC_NWE 接LCD 寫 引 腳WR,選 擇FSMC_A6 地址線連接LCD 的寄存器/存儲器選擇信號RS,F(xiàn)SMC_D[15:0]接LCD 的16 位 數(shù) 據(jù) 線D15~D0,LCD 工作于16 位8080 接口模式。
如圖2 所示,數(shù)碼管和TFT-LCD 同時掛接在STM32F4 的FSMC 總線上,二者共享數(shù)據(jù)線,為使二者輸出信號互不影響,需要將向數(shù)碼管送出的數(shù)據(jù)信號進行鎖存,鎖存器選擇2 片74HC573D,鎖存引腳LE 高電平傳輸,低電平封鎖。選擇FSMC 總線的Bank1.Sector3 連接6 位共陽數(shù)碼管,所以FSMC_NE3 作為數(shù)碼管的片選信號,但是NE3 是低電平有效,與鎖存器傳輸信號正好相反,所以FSMC_NE3 需要經(jīng)反相器U2 連接U3 的兩片74HC573D 的鎖存引腳LE。由于只需要一路反相器,系統(tǒng)實施時采用由1 個PMOS 管和1 個NMOS 管構成的單路CMOS 反相器。數(shù)碼管8 個段選線和6 個位選線共14 條信號線由FSMC_D[13:0]控制,需要經(jīng)過鎖存模塊U3 鎖存,F(xiàn)SMC_D[7:0]接一片鎖存器輸入端,鎖存器輸出端接數(shù)碼管段選線dp~a,F(xiàn)SMC_D[13:8]接另一片鎖存器的輸入端,鎖存器的輸出端接數(shù)碼管位選線DS6~DS1。
上述設計實現(xiàn)了數(shù)碼管和TFT-LCD 數(shù)據(jù)線和控制線的時分復用,減少了微控制器GPIO需求,節(jié)約了CPU 資源,降低了PCB 布線難度,提升了系統(tǒng)可靠性。
系統(tǒng)底層軟件設計的任務是完成顯示設備的讀寫,因為顯示設備均掛接在FSMC 總線上,所以要實現(xiàn)顯示設備數(shù)據(jù)訪問,首先就需要FSMC 初始化。
4.1.1 FSMC 讀寫時序
FSMC 有多種時序模型用于NOR Flash/PSRAM/SRAM 的 訪 問,對TFT-LCD 來 說,讀取操作比較慢,寫入操作比較快,使用模式A 的讀寫分離時序控制比較方便,可以使讀寫操作均獲得較高性能表現(xiàn)。數(shù)碼管控制只涉及寫,且沒有速度要求,任何模式均可以滿足要求,為了和LCD 保持一致,也采用模式A 進行控制。
訪問NOR Flash/PSRAM/SRAM 的模式A的讀取時序如圖3(a)所示,寫入時序如圖3(b)所示,在這兩個時序中都只需要設置地址建立時間ADDSET 和數(shù)據(jù)建立時間DATAST 這兩個參數(shù),它們都用HCLK 的時鐘周期個數(shù)表示,其中ADDSET 最小值為0,最大值為15,DATAST 最小值為1,最大值為255。根據(jù)參考文獻[9]說明,實際的地址建立時間是ADDSET 個HCLK 周期,數(shù)據(jù)建立時間是(DATAST+1)個HCLK周期。
4.1.2 FSMC 初始化
FSMC 工作模式靈活多變,控制寄存器眾多,直接操作寄存器很難完成,一般采用基于庫函數(shù)的開發(fā)方式,而庫函數(shù)又分為標準庫和硬件抽象層(Hardware Abstraction Layer,HAL)庫。借助STM32 推出的圖形化配置軟件STM32CubeMX的HAL 庫開發(fā),只需要輸入幾個關鍵參數(shù),即可自動完成FSMC 接口初始化工作。自動化程度高,是未來嵌入式開發(fā)的技術方向。
(1) 數(shù)碼管FSMC 初始化設置
在STM32CubeMX 軟件中,打開圖5 所示的設置界面,首先設置Mode 選項內(nèi)容,配置NOR Flash/PSRAM/SRAM/ROM/LCD 3,即 選 擇Bank1. Sector3 連接數(shù)碼管,片選信號:NE3,存儲器類型:LCD Interface,LCD 的RS 信號:A6,數(shù)據(jù)寬度:16 位。隨后配置Configuration 選項內(nèi)容,其中大部參數(shù)采用默認即可,使能擴展模式,使其支持分開設置讀寫時序。對數(shù)碼管的訪問只有寫不需要讀,所以讀時序參數(shù)可以任意設置;寫時序中無需送出地址信號,所以寫時序地址建立時間設置為0,以使其選中芯片后立即送出數(shù)據(jù)。因片選信號需要經(jīng)過反相器送給鎖存芯片以完成數(shù)據(jù)傳輸,所以數(shù)據(jù)送出后需要保持一定的時間,數(shù)據(jù)建立時間需要設置大一些,作者設置的是160。所有需要配置的信息在圖5 中均使用紅色框線標出。
圖5 數(shù)碼管FSMC 初始化界面Fig.5 FSMC initialization interface of digital tube
(2) LCD 的FSMC 初 始化設置
如 圖6 所 示,TFT-LCD 的FSMC 初 始 化 基本上和圖5 的數(shù)碼管FSMC 初始化設置是一樣的,不同的地方均使用藍色框線標出。LCD 連接到FSMC 的Bank1. Sector4,所以此時需要配置NOR Flash/PSRAM/SRAM/ROM/LCD 4,片選信號也相應地調(diào)整為NE4。FSMC 總線選擇模式A 分開設置讀寫時序控制LCD 顯示屏,由于LCD 讀速度要比寫速度慢得多,所以在設置讀時序時時間參數(shù)盡量設置大一些,作者將ADDSET 和DATAST 分別設置為15 和59。對于STM32F407 微控制器,在168 MHz 主頻時,HCLK 約為6 ns,其對應的地址建立時間為15×6 ns=90 ns,數(shù)據(jù)建立時間為(59+1)×6 ns=360 ns。LCD 寫時序的時間參數(shù)設置適當小一些,作者將ADDSET 和DATAST 分別設置為9和8,兩個參數(shù)對應的時間數(shù)值均約為54 ns。上述參數(shù)設置對70.82 mm(2.8 in)TFT-LCD 的常規(guī)驅動芯片ILI9341 來說可以保證其穩(wěn)定運行,并留有足夠的裕量。
圖6 LCD 的FSMC 初始化界面Fig.6 FSMC initialization interface of LCD
完成上述配置后,STM32CubeMX 會自動將FSMC 總線用到的GPIO 引腳配置為FSMC 復用推挽模式,無須上拉或下拉,并在FSMC 初始化程序中完成調(diào)用,大大減輕了用戶編程工作量。
STM32CubeMX 完成FSMC 初始化后,生成Keil MDK 工程,在工程的主函數(shù)中會自動調(diào)用初始化函數(shù),此時就可以直接訪問數(shù)碼管或LCD。6 位共陽數(shù)碼管采用PNP 三極管S8550 驅動,所以位選碼是低電平有效,段選碼也是低電平相應筆劃點亮。假設我們需要將DS1、DS3、DS5 三個數(shù)碼管上面均顯示的數(shù)字“1”,則應送出的顯示碼如表2 所示,即向FSMC 總線送出一個16 進制數(shù)據(jù)0xEAF9,即可實現(xiàn)顯示控制。
表2 數(shù)碼管控制實例顯示碼對應表Tab.2 Corresponding table of digital tube control example display code
數(shù)據(jù)管是掛接在FSMC 總線的Bank1.Sector3 上的,由表1 可知,這一區(qū)域對應的地址范圍為0x6800 0000-0x6BFF FFFF,只要向這個64 MB 單元中任一地址送數(shù)據(jù),即可將顯示碼發(fā)送至數(shù)據(jù)線,并自動產(chǎn)生片選信號FSMC_NE3,反相后形成鎖存信號,完成數(shù)據(jù)鎖存。為此選擇這一區(qū)域的首地址0x6800 0000,轉換為指針型常量,將其賦值給uint16_t 型指針型變量SEG_ADDR,向該地址寫數(shù)據(jù)即可實現(xiàn)顯示控制,十分簡單。
相比于數(shù)碼管顯示控制,LCD 顯示程序則要復雜得多,分為底層驅動、基礎顯示和高層應用3 部分?;A顯示程序和高層應用程序一般由顯示屏廠家直接提供,且在移植了底層驅動程序之后,一般無需任何更改,就可直接使用,所以本文重點討論的是基于FSMC 的底層驅動程序的實現(xiàn)。
對TFT-LCD 寄存器和存儲器一體化控制簡單、便捷的方法是定義一個LCD 數(shù)據(jù)訪問結構體,包含寄存器和存儲器2 個16 位無符號型成員。并確定該結構體的基地址為0x6C00007E,其 中HADDR[27:26]=11,表 明 選 擇 的 是Bank1.Sector4,即片選信號FSMC_NE4 有效。
結構體第一個成員LCD_REG 地址和LCD 結構體的基地址相同,即:0x6C00007E,第二個成員LCD_RAM 地址為基地址加2,即:0x6C000080。如果只觀察HADDR 低8 位,即LCD->LCD_REG的HADDR[7:0]=0111 1110,LCD->LCD_RAM的HADDR[7:0]=1000 0000,由于FSMC外接16 位存儲器時內(nèi)外地址對應關系為HAD?DR[25:1]→FSMC_A[24:0],相當于右移1 位。由此可知LCD->LCD_REG 的FSMC_A[6:0]=011 1111,F(xiàn)SMC_A6(RS)=0,讀 寫LCD 寄 存器;LCD->LCD_RAM 的FSMC_A[6:0]=100 0000,F(xiàn)SMC_A6(RS)=1,讀寫LCD 存儲器。在FSMC 配置過程中選擇不同的地址線連接LCD 的RS 信號,其基地址的確定亦可舉一反三。
有了上述定義并確定好基地址之后,通過選擇結構體的不同成員,即可實現(xiàn)對不同存儲對象的訪問,編程簡潔、高效、直觀。結合LCD 驅動芯片ILI9341[10]控制時序,將讀寫控制代碼封裝成LCD 基本讀寫函數(shù),即為LCD 底層驅動程序,供基礎顯示程序和高層應用程序調(diào)用。
由于技術發(fā)展歷史原因,一般LCD 控制程序是用標準庫編寫的,所以還需將標準庫程序向HAL 庫程序移植,一般步驟為:在STM32CubeMX中配置并自動生成FSMC 初始化代碼,含LCD和數(shù)碼管兩部分;定義LCD 結構體、確定基地址,編寫LCD 底層驅動程序;將原LCD 初始化程序中的FSMC 初始化和復用引腳配置代碼刪除,其余部分保留;移植基礎顯示和高層應用代碼,經(jīng)過上述步驟即可完成LCD 顯示代碼移植。
為檢驗電路功能和觀察運行效果,依據(jù)系統(tǒng)設計成果,完成樣品生產(chǎn)、組裝和測試工作。
第一步:數(shù)碼管顯示測試。編寫數(shù)碼管動態(tài)顯示時間程序,在6 位數(shù)碼管上顯示時、分、秒數(shù)值,各占兩位數(shù)碼管,且在小時和分鐘的末尾顯示一個小數(shù)點。
第二步:LCD 顯示測試。在完成顯示程序移植之后,調(diào)用顯示函數(shù)分別進行字符、字符串、整型、浮點數(shù)等文字信息顯示測試;調(diào)用圖形處理函數(shù)進行畫點、畫線、畫圓、矩形、三角形、指定區(qū)域填充等圖形顯示測試;制作漢字字庫并存于字庫文件當中,調(diào)用中文顯示函數(shù)進行多種字號漢字顯示測試。
第三步:綜合測試。設計了一個綜合實例,系統(tǒng)主程序是一個電子萬年歷,實時采集現(xiàn)場溫濕度信息,合并實驗裝置設計信息,所有信息均顯示于TFT-LCD 顯示屏上,同時將當前時間高亮顯示于數(shù)碼管,便于遠距離觀看,測試結果如圖7 所示。由于項目綜合性較強,主程序處理任務較多,而數(shù)碼管動態(tài)顯示是阻塞運行的,CPU占有率較高,作者采用定時器中斷的方式依次刷新需要顯示的數(shù)碼管,在主程序中只需要對顯示數(shù)組賦值即可,使兩個顯示設備顯示控制方式基本相同,提升了系統(tǒng)運行效率。
圖7 實驗裝置綜合測試圖Fig.7 Comprehensive test diagram of experimental device
第四步:對比測試。分別使用FSMC 總線、GPIO 并口、SPI 串口連接數(shù)碼管和TFT-LCD 雙顯示設備,運行測試程序,使用STM32 定時器記錄LCD 刷整屏時間,測試條件和測試結果如表3所示。由表3 可知,SPI 串口顯示速度很慢,對于有刷新頻率要求的場合原則上不使用。FSMC接口和GPIO 并口測試時使用相同的TFT-LCD模塊和微控制器,工作于同一主頻,使測試數(shù)據(jù)更具可比性。由表中數(shù)據(jù)計算得出,F(xiàn)SMC 接口相比于微控制器并口控制,減少了38.2% 的GPIO 引腳資源占有率,LCD 刷屏速度提高了17.6 倍。以上數(shù)據(jù)視軟硬件設置情況會有小幅波動,但是大致范圍不會變化。
表3 顯示終端驅動接口對比測試Tab.3 Comparison test of display terminal driver interface
測試結果表明,采用FSMC 總線同時連接數(shù)碼管和TFT-LCD 顯示屏各項顯示功能均很好完成,刷新速度快,畫面清晰流暢,系統(tǒng)穩(wěn)定可靠,項目設計達到了預期目標。
本文設計了一款嵌入式系統(tǒng)多顯示終端實驗裝置,將數(shù)碼顯示器和TFT-LCD 均掛接在STM32 微控制器的高速FSMC 總線上,實現(xiàn)數(shù)據(jù)信號和控制信號時分復用。LCD 的8080 控制時序和數(shù)碼顯示器地址鎖存信號均由硬件自動產(chǎn)生,F(xiàn)SMC 初始化亦可通過STM32CubeMX圖形化配置工具輕松完成,軟件設計工作量顯著減少。相比于微控制器直接并口控制,減少了38.2%的GPIO 引腳資源占有率,LCD 刷屏速度提高了17.6 倍。系統(tǒng)設計方案具有較高的數(shù)據(jù)訪問性能,降低了軟硬設計難度,提高了系統(tǒng)可靠性。