μC/GUI是一種專為嵌入式應用設計的通用圖形接口軟件。本文詳細介紹了μC/GUI的結構框架和基于STM32平臺的μC/OS-II上的μC/GUI移植過程,并在此基礎上進行圖形界面設計;闡述了μC/GUI的窗口管理機制,提出了實現μC/GUI中文小型字庫的兩種方法并采用存儲設備解決了圖形顯示的閃爍問題。
嵌入式系統的圖形用戶界面,要求具有占用資源少、性能高、可靠性高、可移植、可配置等特點,μC/GUI就是這樣一種專門為嵌入式應用設計的圖形用戶界面軟件。μC/GUI可應用于多任務環境中,同時使用實時操作系統與μC/GUI,既可以發揮優先級的實時性,又能實現良好的人機界面。本文使用Cortex-M3內核的STM32平臺,介紹了基于STM32平臺的μC/OS-II上的μC/GUI移植過程,并在此基礎上開發了基于μC/GUI的圖形用戶界面。
1 μC/GUI結構框架
1.1 μC/GUI的文件組織
μC/GUI軟件采用模塊化組織架構,其中較為重要的文件目錄是配置文件目錄Config和GUI庫文件目錄。考慮到未來升級方便,建議保持μC/GUI原有的目錄結構,這樣升級到新版本時只要覆蓋原文件目錄即可,而不會改變整個工程的文件路徑。
μC/GUI是一個源代碼開放的圖形系統,它提供了豐富的資源,包括二維繪圖庫,多字體、可擴充的字符集,UnICode,位圖顯示,多級RGB顏色管理及灰度處理調整機制,動畫優化顯示,具有Windows風格的對話框和預定義控件(按鈕、編輯框、列表框、進度條、單選復選框、滑動條等);同時,支持鍵盤、鼠標、觸摸屏等輸入設備和雙LCD的輸出,提供占用極少RAM的窗口管理體系。各個子目錄的路徑及功能支持如表1所列。
1.2 μC/GUI的層次結構
μC/GUI內核提供多種圖形顯示功能,用戶程序通過API函數接口調用μC/GUI函數庫中的各個功能函數,然后各個功能函數通過調用硬件驅動實現圖形界面顯示。
一個典型的包含有μC/GUI的軟件系統可以理解為一個層次結構,詳細的μC/GUI軟件體系的層次結構如圖1所示。
2 基于STM32平臺的μC/GUI移植
2.1 STM32F103系列單片機和移植平臺簡介
硬件開發平臺的核心是ST公司的STM32F103系列單片機,實時操作系統選擇移植性較強的μC/OS-II。STM32F103系列單片機最高主頻為72 MHz;片內多達51 2 KB的Flash并可以直接運行程序,片內還有64 KB的RAM;擁有眾多的定時器、中斷源和外設,內部集成了一個高速外部存儲器接口FSMC總線,可以很方便地控制液晶顯示模塊。目標平臺的液晶模塊采用320×240分辨率,通過FSMC總線接口連接STM32F103單片機,并在系統的內存區開辟一塊內存作為液晶顯示的后臺緩存。
2.2 μC/OS-II上的μC/GUI移植
μC/GUI的移植內容主要分成4部分:μC/GUI配置文件的參數修改,LCD驅動程序的編寫,LCD觸摸屏驅動程序編寫,以及與μC/OS-II操作系統相關接口部分的修改。
2.2.1 μC/GUI配置文件的參數修改
主要是根據系統的實際情況對GUI/Config目錄下3個配置文件的參數進行修改,設計采用的LCD選用320×240的液晶顯示模塊,LCD控制器采用ili9320。
①LCDConf.h文件主要定義LCD控制器和顯示屏尺寸及可選擇的功能。修改如下:
2.2.2 LCD驅動程序的編寫
LCD的驅動程序在GUI/LCDDriver目錄下,在本次移植中編寫的ili9320.c驅動文件主要定義了GUI與LCD的硬件接口函數,包括畫點、線、矩形、多邊形、位圖等二維圖形的函數等等。μC/GUI所有的系統函數都是通過調用這些硬件接口來實現其功能的,而這些接口函數又可以通過調用畫點函數來實現,可以認為幾乎所有的μC/GUI顯示功能都是通過最終調用畫點函數來實現的。所以筆者的LCD驅動程序重點在畫點函數的編寫。代碼如下:
2.2.3 LCD觸摸屏驅動程序的編寫
STM32F103通過SPI總線與觸摸屏芯片相連,通常的方法是采用輪詢的方法獲取觸摸屏的觸點動作,這種方法不僅實時性差而且浪費單片機的執行周期。采用觸摸屏的觸點動作通過外部中斷進行檢測,在中斷服務程序中獲取觸點的位置坐標,并通過調用函數GUI TOUCHStoreSta te(xScreen,yScreen),將觸點坐標保存并通知μC/GUI。由于觸摸屏和LCD的大小不一定完全相等,坐標原點的位置也可能不同,為了實現對應,需要進行A/D轉換,實現數值到邏輯坐標的轉換。
2.2.4 操作系統相關接口部分的修改
μC/OS-II操作系統下使用μC/GUI需要提供一些內核接口函數來實現任務間同步。有了這些內核接口函數,就可以使μC/GUI運行于μC /OS-II系統上,通過任務調度來實現各個任務之間的協調工作,接口函數實現如下:
至此,μC/GUI的移植就基本上完成了,需要編寫測試用例,如果顯示效果不理想,再對移植的GUI進行底層配置優化和改進。
3 μC/GUI的圖形界面設計
μC/GUI是具有類似Windows窗口風格的圖形系統,以其窗口作為內存管理的基本單元,采用消息傳遞機制和回調函數機制。μC/GUI提供給窗口和窗口控件回調機制的背后,是一個事件驅動標志(即消息)。回調函數的過程也是消息傳遞的過程。
3. 1 μC/GUI的窗口管理機制
μC/GUI的窗口管理器用于管理LCD屏幕上圖形顯示的區域(即窗口),使其重疊、嵌套和并列。使用μC/GUI窗口管理時,任何能顯示在顯示終端上的內容都包含在一個窗口中,這個窗口是LCD屏幕上的一個給用戶畫圖或者顯示目標的區域。窗口的創建、顯示以及刪除都離不開消息傳遞和回調函數機制。
在μC/GUI中定義了數十種用于各類基本操作的消息宏,對每個窗口的操作都是通過向其對應的回調函數傳送消息參數來完成的。回調函數是由用戶定義的,當特定事件發生時,指示圖形系統調用特定的函數。當窗口的內容發生改變時,它們用來自動重繪窗口。具體操作是通過一個指向函數的指針從窗口結構體數據項中得到回調函數的首地址,并將消息作為參數調用該函數來完成的,回調函數在接收到消息后進行相應處理。
回調函數的基本作用是實現窗口刷新。一個簡單的自動更新窗口的回調函數如下:
3.2 μC/GUI實現中文小型字庫的兩種解決方法
μC/GUI帶有多種常用的ASCII字體,也支持UNICODE字符顯示,考慮到嵌入式系統內存資源有限,沒有裝入漢字庫,可以根據系統的實際需要建立一個小型漢字庫,以解決漢字的顯示問題。在μC/GUI下筆者提出兩種實現中文小型字庫的解決方法。
(1)在μC/GUI的字庫結構體中建立一種新的字體
μC/GUI的文字顯示是通過查找字模的方式實現的。字庫中的每個文字都有其對應的字模,所有的字模都是由GUI FONT和GUI FONT PORT這兩個結構體來管理的。從漢字庫中選取必需的漢字組成字庫,并將漢字對應的不連續漢字機內碼映射到一個連續區域。此時需要建立一個GUI_FONT_PROP結構來管理所有的漢字。例如,要實現“設置”這2個字,具體的偽代碼如下:
(2)直接建立漢字庫,通過LCD驅動直接顯示漢字
該方法通過將漢字的機內碼和漢字點陣組合成一個漢字字模結構體,然后選取所必需的漢字,按照漢字字模結構體的方式存放在漢字庫數組中,然后通過調用一個“漢字搜索函數”來搜索這個漢字庫數組的機內碼即可確定相應的漢字,并把漢字對應的點陣通過LCD驅動直接
進行顯示。
上述的兩種方法都能在嵌入式的圖形界面中實現中文顯示,方法二為通過LCD驅動直接顯示漢字,適合在窗體中顯示漢字,而不能在控件上直接顯示漢字。雖然可以用疊加的方法(即先畫一個控件,然后再在上面顯示漢字),但是這樣處理很不方便。方法一是在μC/GUI的字庫中建立了一種新的字體,因此在控件上顯示漢字時直接調用μC/GUI函數即可,不會出現上述問題,因此筆者推薦使用方法一實現μC/GUI的中文小型字庫。
3.3 采用存儲設備解決圖形顯示的閃爍問題
采用存儲設備可以有效地防止顯示屏在對有對象重疊的繪圖操作時的閃爍現象。沒有使用存儲設備時,繪圖操作直接寫屏,屏幕在繪圖操作執行時更新,當不同的更新在執行時會產生閃爍。如果這樣的操作使用一個存儲設備的話,那么所有的操作在存儲設備內執行,具有無閃爍的優點。μC/GUI的存儲設備是一個可選的軟件項目,為了優化軟件的性能,提高圖形的顯示效果,需要采用存儲設備技術。μC/GUI中存儲設備的使用一般流程為建立存儲設備、激活、執行繪圖操作將結果拷貝到顯示屏顯示,最后將創建的存儲設備刪除。
4 結論
為了驗證移植丁作成功與否,需要建立一個多任務測試用例,這個用例由3個任務構成:Main Task、GUITask、APP_Task。其中:Main_ Task任務用于設置背景窗口的回調函數和建立另外兩個任務;APP_Task任務用于建立一個窗口并設置其相關的屬性;GUI_Task任務用于視窗管理和多級圖形畫面的切換。將測試用例燒寫進目標板,目標板采用神舟III號STM32開發板,液晶屏為320×240像素的TFT型液晶屏幕。圖2為測試用例在目標板上的運行結果。
評論
查看更多