因為上一個題目的界面是自己一個一個點打到屏幕上去的,計算過程相當惡心,所以這兩天趕緊弄了一下μCGUI,希望對后面的人機交互界面的設計有所幫助。
說實話,我對于人機交互界面的設計真心沒什么的靈感,上次趙穎老師就委婉的表達了這個意思,我也深刻的意識到了這個問題,就是設計的界面相當普通,沒有給人一種眼前一亮的感覺。
首先感謝隊友王綏學給我提供的資料,因為自己電腦運行各種大型軟件實在是太卡,所以這個暑假把女朋友電腦留下,不過資料都在另外一臺電腦中,需要的資料就給隊友要,十分的感謝啊!
按照教程一步一步的做下來,前面幾步關于GUI的參數設置沒什么問題,無非是用到的功能將其參數置1,用不到的功能將其參數置0,但是在最后一步中,就是將自己的LCD底層驅動與μCGUI連接起來,這里出現了問題,開始的時候編譯總是出錯,耗費了我一個上午的時間啊,以為是新版本的keil不兼容造成的,然后從4.72版本直接降至3.8版本,可是又出現了同樣的問題,各種變量的undefined。下午到了實驗室,開始認真的閱讀排查代碼,然后終于一句話讓我眼前一亮:#ifndef LCD_H……(各種參數定義) #endif。因為我自己的驅動文件中定義了一個LCD_H,所以造成上面的一部分代碼在編譯的時候就跳過沒有編譯,才造成了各種參數的未定義,刪除了LCD_H還有LCD_W之后,果斷的通過了編譯,然后下載之后在屏幕上看到了顯示的內容。
接下來就是優化代碼,因為μCGUI是一個通用的圖形軟件庫,所以也就再所難免它還有可優化的地方,尤其是刷屏的速度上,如果是整屏刷新的話,可以很明顯的看出來進度,很慢。首先,是把自己驅動的TFT_Point()函數的代碼直接復制到μCGUI的畫點函數中,因為如果是在μCGUI的畫點函數中調用TFT_Point()的話,每一個點都會有一個入棧和出棧的時間浪費,降低了屏幕的刷新速度,同樣的道理,把自己的讀點的驅動函數代碼也直接復制過去,還有就是GUI_Fill之類的函數,因為這些函數是整塊整塊的在刷屏,但是μCGUI是一個點調用一個畫點函數,這樣每個點都要寫相關的命令和坐標,很低效。直接把自己的代碼中的Fill相關的代碼復制過去,寫好起始坐標之后,就開始向屏幕的RAM中直接送數據,至于坐標的加1是屏幕的控制器自動完成的,這樣也節省了時間,完成了這些優化之后可以看到刷屏速度有了不少的提高。我用的是STM32F103RBT6作為主控芯片,它的最高主頻是72M,是通過外部的8M經過鎖相環9倍頻達到的,我把它12倍頻超頻運行之后,可以看出刷屏速度有了相當明顯的提高,所以,芯片的主頻也是制約刷屏速度的重要因素,ARM M系列的芯片重要用于控制,而應用型的ARM A系列的主頻可以達到更高,玩起屏幕應該會更爽,而這個系列的芯片應該才是大家所熟悉的ARM。
另外一個制約因素,FLASH的大小,我的單片機只有128Kb的FLASH,一般來說這已經相當大了,但是今天顯示位圖的時候,先直接轉換的時候,超過FLASH大小,然后把圖片縮小到50%,然后還是沒有編譯通過,接著再縮小50%,編譯通過,顯示正常,雖然FLASH可以外部擴展,但是對于低主頻的控制芯片來說,刷屏速度本來就已經夠慢的了,還要花時間去讀取外部的FLASH,然后再顯示,那種速度就可想而知了,前陣子申請到的STM32F407的芯片,是基于ARM Conterx M4的內核,里面自帶了1M的FLASH,這個就相當牛逼了,玩起來GUI應該很爽,而且主頻可以最高168M,比F103RBT6的兩倍還要高,刷屏速度應該可以得到很大的提升,效果應該會更好。
前兩天在正點原子的店里看到了一個7寸的電容屏,和我的單片機接口可以匹配的上,不過暫時沒有買的打算,第一沒有那么多資金,要300多,第二,我的單片機主頻有點低,玩大屏效果肯定很不爽,帶大屏就要高頻的高級貨才行,等到從老師那里拿到TQ2440的板子之后玩玩ARM,這個的主頻到時候帶屏幕應該不成問題了。
目前只看到了第7章,接著看,重頭戲還在后面。