emWin+touch移植到STM32戰艦開發板

最近在做一個項目,硬件平臺核心處理器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的驅動移植。
附上源碼。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章