基于STM32的uCGUI移植和優(yōu)化
首先在開(kāi)始這個(gè)說(shuō)明之前,要簡(jiǎn)要說(shuō)明下具體的環(huán)境:
編譯工具:MDK4.20
開(kāi)發(fā)板:安富萊v2版開(kāi)發(fā)板
調(diào)試器:JLink v8盜版
移植篇
相信大家有移植經(jīng)驗(yàn)的都知道,移植確實(shí)是一件非常墨跡的事情,怎么說(shuō)呢,代碼都是別人的,風(fēng)格也是別人的,文件結(jié)構(gòu),定義之類(lèi)都是別人的,看別人的東西是種進(jìn)步,但是,也是一個(gè)痛苦的過(guò)程,因?yàn)橛袝r(shí)候資料確實(shí)很少,而且有時(shí)候還是E文的,專(zhuān)業(yè)名詞一大堆,我們根本沒(méi)有辦法想象工作量是多么的巨大.
不過(guò)事情都是這樣,你不懂他的時(shí)候他就像是巨山,但是一旦你理解他的時(shí)候,你才會(huì)感覺(jué)到原來(lái)他是那么的簡(jiǎn)單(從我的經(jīng)驗(yàn)上來(lái)看,至少應(yīng)該是這樣的).
好吧,閑話少說(shuō),我們就來(lái)開(kāi)始我們的移植之旅把.
首先,我們需要準(zhǔn)備的東西有uCGUI3.90,這個(gè)版本是大家現(xiàn)在用的比較多的,效率也比較高,別人都是這么評(píng)論的,至于其他版本的,我沒(méi)有接觸很多,所以不能過(guò)多評(píng)論.
uCGUI有三個(gè)文件夾,一個(gè)是tool,這個(gè)文件夾是用來(lái)使用一些uCgui的上位機(jī)程序,基本都是字體和模板查看之類(lèi)的.在sample文件夾下面是已經(jīng)別人幫你寫(xiě)好了很多有用的東西,像跟操作系統(tǒng)有關(guān)的GUI_X或者一些模板(后面我們會(huì)用到的自己定義的Demo),或者是gui配置.后面再一一詳細(xì)敘說(shuō)這個(gè)文件夾的功能.在Start文件夾里面,這是我們最主要的文件夾.里面就包含了uCGUI的源代碼,uCGUI的作者把源代碼放進(jìn)vc里面進(jìn)行編譯了(當(dāng)然,這是用標(biāo)準(zhǔn)C語(yǔ)言寫(xiě)的程序,所以我們可以放在任何C語(yǔ)言平臺(tái)下編譯而不會(huì)擔(dān)心兼容性問(wèn)題,這個(gè)uCGUI在這方面做的算是完美了),所以,我們可以在vc平臺(tái)下寫(xiě)界面,然后再把代碼拷進(jìn)我們的下位機(jī)編譯器進(jìn)行編譯,這樣子效率就會(huì)非常高了.(像51那時(shí)候?qū)懡缑婢褪钳偪竦囊淮我淮蔚臒?真是糾結(jié)..).
然后這里放的就是uCGUI的源代碼了,在GUI文件夾下面.
這則是每個(gè)文件夾的功能(參考uCGUI中文手冊(cè),ucgui.com翻譯).
大概看一下就可以了,這個(gè)跟我們移植的關(guān)系不大,關(guān)鍵點(diǎn)是帶*的可以不包含進(jìn)去(待會(huì)配置會(huì)講到.).然后其他的都要包含進(jìn)去.
接著我們要把我們的文件包含進(jìn)我們已經(jīng)搭建好的工程,這里說(shuō)明下我們的工程要求.
一般來(lái)說(shuō),我們要畫(huà)一個(gè)圖形,最基本的就是從點(diǎn)開(kāi)始,從點(diǎn)到線,從點(diǎn)到面...,所以在已經(jīng)建好的工程里面你要能點(diǎn)亮你的屏幕,能點(diǎn)出最基本的點(diǎn),能填充出最基本矩陣(這是uCGUI最包含的函數(shù)),反正我移植的時(shí)候涉及到的包括三個(gè)函數(shù),LCD_Init();LCD_Draw_Point(x,y,color),LCD_Fillcircuit(x1,x2,y1,y2).這三個(gè)函數(shù)是必須的,后面也會(huì)說(shuō)明如何把這三個(gè)函數(shù)進(jìn)行填充.
當(dāng)我們把文件復(fù)制進(jìn)去的時(shí)候,再加上我們一開(kāi)始已經(jīng)創(chuàng)建好的工程的時(shí)候,文件結(jié)構(gòu)差不多就是這個(gè)樣子了,截圖如下
user包括,main函數(shù)就是我們初始化和函數(shù)調(diào)用,繪圖用的文件,另外那幾個(gè)文件相信大家都明白了把,tft_lcd.c就是你在,沒(méi)有移植uCGUI的情況下,純液晶屏驅(qū)動(dòng),這里建議把液晶屏的API和最底層驅(qū)動(dòng)(API就是畫(huà)圓啊,畫(huà)橢圓啊,清除屏幕之類(lèi)的,底層驅(qū)動(dòng)就是驅(qū)動(dòng)液晶屏的管腳運(yùn)作,fsmc初始化,時(shí)鐘配置之類(lèi)的),不過(guò)我這里也是集成在一起了,比較懶,大家別學(xué).
其他文件夾我都包含進(jìn)去了,在沒(méi)包含進(jìn)去的時(shí)候,編譯是可以通過(guò)的,但是,那么多文件包含進(jìn)去,有些配置還是沒(méi)有設(shè)定好的.所以會(huì)有錯(cuò)誤,蠻編譯一下.沒(méi)事的.
這里我們需要修改的文件只有這幾個(gè):,,,這是ucgui開(kāi)放給我們的用戶(hù)層的文件,在ucgui中,lcdDrive文件夾要自己加進(jìn)去,GUI_X.c也是,另外三個(gè)文件都是包含了,在GUIConf.h中
1#ifndefGUICONF_H2#defineGUICONF_H34#defineGUI_OS(0) //這里指的是對(duì)操作系統(tǒng)的支持,因?yàn)槲覀冞@里只有單純的移植uCGUI,5 //所以,要把這個(gè)關(guān)閉,不然后面會(huì)有很多東西編譯進(jìn)去6 //不然到時(shí)候編譯的時(shí)候會(huì)發(fā)生很多你無(wú)法修改的錯(cuò)誤7#defineGUI_SUPPORT_TOUCH(0) //這里則是對(duì)觸摸屏的支持,觸摸屏我是能做,但是沒(méi)有用,8//所以省去麻煩,把觸摸屏關(guān)掉,相信移植好之后,要支持觸摸屏大家都會(huì)有門(mén)路了9#defineGUI_SUPPORT_UNICODE(1) //UNICODE編碼支持,如果大家只是單純的想用英文顯示,而不移植中文字庫(kù)進(jìn)去,10//這個(gè)是可以關(guān)掉的,因?yàn)閁NICODE是向下支持的,所以開(kāi)不開(kāi)無(wú)所謂11 //反正都是能夠正常顯示的12#defineGUI_DEFAULT_FONT&GUI_Font6*8 //這里是設(shè)定默認(rèn)字體的,我們可以在要寫(xiě)什么字的時(shí)候把該字號(hào)的字體.13//c包含進(jìn)我們的主函數(shù)里面,所以這里不用改14#defineGUI_ALLOC_SIZE5000//這里講的是動(dòng)態(tài)內(nèi)存機(jī)制15 //這里rgb接口模式的可能會(huì)有用到,uCGUI就是在我們的ram開(kāi)辟一塊空間, //然后uCGUI把運(yùn)算好的每個(gè)點(diǎn)都放進(jìn)我們主控ram里面的空間16 //所以,這里就相當(dāng)于把寫(xiě)進(jìn)液晶gram里面的操作變成了寫(xiě)進(jìn)主控ram里面, //那么大家可能就會(huì)問(wèn)了,干嘛這么多次一舉,直接寫(xiě)進(jìn)去不就可以了1718/*原理:一般來(lái)說(shuō),在大的屏幕上面(4.0以上吧,印象中),都是沒(méi)有控制器,(像我的液晶屏就是spfd5420,當(dāng)然,19不同的屏幕的液晶主控都是不一樣的,但是寄存器操作都是差不多的,20所以有些初始化配置還是能互用的.)所以呢,這時(shí)候我們要用到的就只有RGB接口了,21RGB要求我們要不斷的刷新屏幕,刷新率越高,效果就越好,因?yàn)橐话氵@種用來(lái)做動(dòng)態(tài)的,uCGUI就是屬于靜態(tài)類(lèi)型的22像如果我們要用stm32主控做視頻應(yīng)用的時(shí)候,就是動(dòng)態(tài)的,我們需要不斷的刷新屏幕,但是當(dāng)我們主控一邊運(yùn)算,23一邊往液晶接口送數(shù)據(jù)的時(shí)候,會(huì)有明顯刷屏的感覺(jué)(運(yùn)算->畫(huà)點(diǎn)->運(yùn)算->畫(huà)點(diǎn)....,這個(gè)運(yùn)算24->運(yùn)算.......畫(huà)點(diǎn)->畫(huà)點(diǎn)->畫(huà)點(diǎn)...是不一樣的,因?yàn)閷?duì)屏幕一直畫(huà)點(diǎn),填充,而中間不用插入運(yùn)算,25刷一個(gè)屏幕時(shí)間時(shí)間倍速差別是非常巨大的,后面大家也會(huì)見(jiàn)識(shí)到這種差別.),所以,用GUI申請(qǐng)的空間里面26邊運(yùn)算,邊填充,填充完再一次性運(yùn)出去(這里可以通過(guò)DMA控制FSMC總線,不斷的從外置SRAM往GRAM自動(dòng)搬運(yùn)數(shù)據(jù),27這是不用主控去插手的,所以,主控大部分時(shí)間是負(fù)責(zé)運(yùn)算,其他時(shí)間可以空閑出來(lái),28讓DMA自己去忙活),同理,因?yàn)閐ma跟cpu的分工,所以,這里同樣的把畫(huà)點(diǎn),畫(huà)點(diǎn),運(yùn)算,運(yùn)算不完全的分開(kāi)了,29屏幕刷新速度非常之可觀(DMA的速度相比大家還是非常了解的,它就是為速度而生的.),*/3031//#defineGUI_ALLOC_SIZE1024*1024 /*Sizeofdynamicmemory...ForWMandmemorydevices*/3233/*********************************************************************34*35*Configurationofavailablepackages36*/3738#defineGUI_WINSUPPORT1//這個(gè)是窗口支持,一般開(kāi)始開(kāi)著的39#defineGUI_SUPPORT_MEMDEV1//內(nèi)存控制,開(kāi)40#defineGUI_SUPPORT_AA0//抗鋸齒,為了性能著想,還是關(guān)了比較好4142#endif/*Avoidmultipleinclusion*/