最近在做一個項目,硬件平臺核心處理器STM32F103ZET6,該芯片功能很強大。
下面就把我移植emWin的過程分享給大家:
第一步,準備移植文件。
要想在自己開發板上裸機跑emWin,需要以下程序:開發板相關硬件驅動,emWin程序。
相關硬件驅動我是在原子大哥戰艦開發板配套的程序基礎上改寫的,至於emWin網上可以下載。
Software文件夾中主要是一些GUI開發會用到的小工具,移植不用管它。
OS中的GUI_X..c文件我們會用到
Lib中是emWin的核心文件,選取配套庫文件即可
Inc中是emWin核心程序的頭文件,需要整個文件的加載
Doc文件不用管,文檔。
Config文件是移植需要自己動手更改的配置文件,我們會用到其中的一些文件。
至於與硬件相關的驅動程序,我改寫了原子程序源碼中的LCD驅動程序,原始的LCD驅動程序可以兼容不同驅動芯片型號,改寫中我把那些兼容性代碼都去掉了,並且更改了文件名稱,在使用自己的LCD驅動程序時建議大家不要直接用lcd.c/.h來命名程序文件,程序中也請不要出現LCD名稱的變量,編譯會出錯。
更改如下:
主要紅框,不要直接寫LCD
第二步,建工程加載文件
紅框中加載了LCD與LED程序,LED程序用於指示程序正常運行。
綠框中是GUI的配置文件,這三個文件都可以在Config文件夾中找到
粉框中是裏面包含了產生1ms的定時器中斷(由於獲取觸摸數據需要定時更
新),被定時調用GUI_TOUCH_Exec 函數
藍框是庫文件,分別在Lib文件夾和OS文件夾中找到。
第三步,改寫配置文件
這一步是移植的關鍵,主要針對GUIConf.c、LCDConf_FlexColor_template.c文件進行改寫,LCD驅動程序的改寫上文已經提到了,這裏不再贅述。
GUIConf.h文件:
主要是一些配置參數,這個根據情況改寫就行,我沒改。
GUIConf.c文件:
就改了一句這個:#define GUI_NUMBYTES (1024*40),別的也沒改。
LCDConf_FlexColor_template.c文件:
這個改動比較多,
首先,加載頭文件:
在這個文件中,會有一些針對LCD硬件的基本操作,比如向寄存器裏寫數啊什麼的,所以有很多人在這個文件中定義了LCD的寄存器,但自己做過LCD驅動的同志都應該已經在驅動程序裏定義了寄存器,所以我直接包含了頭文件用於調用。
這個結構體就是我們定義的寄存器地址了,如果這個地方不修改成LCD0,編譯將出錯
接下來,修改的是寫命令函數與寫數據函數
很簡單哈,
再接下來是LCD_X_Config函數,這個改動很小,只有兩處,一個是方向:豎屏、橫屏。本實例採用橫屏
Config.Orientation = GUI_SWAP_XY | GUI_MIRROR_X;
//modify by lsw 橫屏
還有一處是爲適應ili9341觸摸屏驅動芯片所做的修改
GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66709, GUIDRV_FLEXCOLOR_M16C0B16);
最後的LCD_X_DisplayDriver程序,因爲我想用自己的初始化程序(據說emWin是提供兼容性很好的驅動程序的,但我沒有深入研究)所以在case後邊添加了初始化程序
好了,配置文件就改好了。
最後一步,主程序。
其實主程序沒什麼可說的,只是提醒工程中要加載好所以頭文件,在調用GUI_Init()文件之前請務必一定要開啓CRC時鐘,emWin移植到STM32平臺的驗證信息。
RCC->AHBENR|=1<<6;
GUI_Init();
基本移植emWin點亮LCD之後,再加上觸摸屏的移植操作。
首先先來介紹下需要準備的程序:
1、Touch基本驅動程序,這個我用的原子大哥自帶的,進行了刪減修改。
2、觸摸板與emWin程序的接口程序,這個需要自己編寫,不過很簡單。
3、時鐘程序,這個程序需要提供給GUI時鐘,利用系統時鐘中斷做的,參照原子大哥delay程序改寫。
4、touch校準程序,這個可以在emWin的仿真程序中獲得,該程序位於文件夾Sample\Tutorial下,程序名稱爲TOUCH_Sample.c。
下面就來和大家詳細說說移植過程:
首先,將touch.c、24cxx.c、myiic.c基本驅動程序加載到工程中:
接着我們新建一個C文件並加載到工程中,用來編寫與GUI的接口函數:
這個文件主要是GUI運行時需要調用的,裏面包含四個函數:
這四個函數主要是用來測量出X、Y軸的模擬電壓數據並交由emWin的上層來處理觸摸輸入,我們需要根據觸摸屏驅動器來編寫,所以我根據原子大哥的驅動直接調用了TP_Read_XY2(,)函數,並返回測試數據。前兩個函數可以空着,只要後兩個返回數據就可以了,這四個函數是由GUI_TOUCH_Exec()函數依次調用的。
這四個函數不用外加頭文件聲明函數,是因爲在GUI.h中已經聲明瞭,如圖:
緊接着,我們進行時鐘函數的編寫,emWin運行時,會通過GUI_TOUCH_Exec()函數調用以上四個函數,來達到獲取觸摸數據的目的,而觸摸數據需要定時更新,GUI_TOUCH_Exec()函數需要被定時調用,所以需要我們進行時鐘函數的編寫。
在時鐘的選取上,我用TIM3定時器中斷。
初始化程序詳見源碼,這裏貼出中斷處理程序:
時鐘函數中我設置每1ms中斷一次,每10ms調用一次touch驅動函數。
最後我們需要調用emWin例程的touch校準函數
運行後發現按壓觸摸屏AD值有反應但是光標沒有反應,這是因爲我們在LCDConf_FlexColor_Template.c中少調用了兩個函數導致無法進行校準。
這兩個函數中TOUCH_AD_TOP,TOUCH_AD_BOTTOM,TOUCH_AD_LEFT,TOUCH_AD_RIGHT這四個值在上面定義了,
而這四個值的確認,我是在沒有調用校準函數時(也就是運行GUI demo時光標沒有反應的時候)按壓左上角和右下角時得到x,y的AD值,左上角x爲TOUCH_AD_LEFT,y爲TOUCH_AD_TOP
右下角x爲TOUCH_AD_RIGHT,y爲TOUCH_AD_BOTTOM。確認四個值後加入這兩個函數運行光標就可以動了,好了到此我完成了touch的驅動移植。
附上源碼。