1. 程式人生 > >[微控制器經驗] 【mk_欣馳】emWin移植筆記——STemWin5.22在STM32F103上的移植步驟(帶觸控,無作業系統)

[微控制器經驗] 【mk_欣馳】emWin移植筆記——STemWin5.22在STM32F103上的移植步驟(帶觸控,無作業系統)

一、硬體要求小系統 (無視窗管理器)       •RAM:100位元組      • 堆疊:600位元組      •ROM:10-25 kb(取決於所使用的功能)  大系統 (包含視窗管理器和小工具)       •RAM:2-6 kb(取決於所需的視窗數)      • 堆疊:1200-1800位元組 (取決於所使用的功能)      •ROM:30-60 kb(取決於所使用的功能)  請注意,如果應用程式使用了很多字型,則對ROM的要求會提高。上述所有值都是粗略估算值,不  保證能正常使用。 重要說明:  (0)由於這個移植教程是去年過年的時候做的,用的是5.16,這就不再做個5.20的移植了,方法是一樣的。  (1)emWin手冊裡面有這樣一句話:“驅動介面的改變始於emWin V5。不再支援針對emWin V4 或更早版本開發的老顯示驅動”。   (2)儘管emWin提供了大部分屏的驅動,但是不能包含所有,這篇移植文件就因此而生。不管是emWin已經支援的,還是沒有提供支援的,均可採用這種方法。 二、移植前的準備工作 1、韌體庫的獲取 首先, emWin 庫來源有兩個: (a).在MDK(KEIL)軟體目錄下獲取 路徑:MDK5.XX D:\Program Files (x86)\Keil_5\

ARM\Pack\Keil\MDK-Middleware\5.1.4\emWin          MDK4.XX C:\Keil4.73\ARM\Segger\emWin (b).在ST官網下載 下載地址:http://www.st.com/web/en/catalog/tools/PF259225#     這裡我們用第二個,因為 MDK 目錄下的 emWin 最新版本對於大家不是好獲得(MDK5.0 才 是5.22 , MDK4.7 下 是 5.16 的 ) , 而 ST 公 司 的 那 個 好 下 載 。目前最新的是 5.22的版本,開啟頁面,登陸後點擊下的 Download, 即可下載。http://bbs.elecfans.com/forum.php?mod=attachment&aid=MzQ4NTY4fGYzMjA0YTcwMmUzOWM4YTRhYzgyYjNiZDhhMjM1ZThmfDE0NzgzMTEwNzk%3D&request=yes&_f=.rar解 壓 縮 下 載 的 壓 縮 包 , 打 開 文 件 夾 , 我 們 看 到:
  Libraries: 裡面就有我們需要的 STemWin 庫 Project:這個是 ST 的工程檔案,以官方的 eval 板子建的工程 Utilities: 這個是檔案系統和 eval 板子的硬體驅動程式 開啟Libraries,就會看到我們需要的STemWinLibrary522資料夾。  內容如下圖:  2、註冊RL_ARM  其過程和使用*注*冊*機*註冊MDK過程一樣,如下圖:    三、開始移植 1、液晶驅動程式     這裡借用正點原子的液晶屏驅動程式,複製原子的lcd.c和lcd.h檔案到工程裡(或直接使用原子例程裡的 “實驗11 TFT液晶顯示實驗”)。     同時,記得在主函式裡呼叫LCDx_Init();進行液晶屏初始化。 
  注意:     工程裡的 lcd.c 和 lcd.h 改為 ili93xx.c 和 ili93xx.h 後重新加入到工程裡, LCD_Init()也改為 LCDx_Init()。     因為這裡和emWin韌體庫裡的有同名了,防止衝突所以在這裡要修改。 下面的程式由 ili93xx.h 中剪下到 ili93xx.c 中,至於為什麼做以上工作,移植過 ucGUI 的再知 道不過了,這裡就不多說了,不知道的可以百度哦。 typedef struct { u16 LCD_REG; u16 LCD_RAM; } LCD_TypeDef; #define LCD_BASE ((u32)(0x6C000000 | 0x000007FE)) #define LCD ((LCD_TypeDef *) LCD_BASE)2、加入STemWin5.22韌體庫檔案 加入後的工程截圖如下:  (a). GUIConf.c和LCDConf_FlexColor_Template.c兩個檔案路徑如下:  (b).GUI_X.C檔案路徑如下:(靈活選擇。因為這裡是無作業系統的,所以使用GUI_X.c檔案)  (c).lib檔案路徑如下:(靈活選擇。因為這裡使用Keil開發工具,stm32f103為CM3核心)  3、修改程式,製作emWin與液晶屏驅動程式介面函式 (a).修改GUIConf.c 檔案 中的 GUI_NUMBYTES 為 1024*50, 50 可以小點,不要太大,太大編譯器會編譯會錯誤的。 (b).修改 LCDConf_FlexColor_Template.c 這個檔案 先將我們的 ili93xx.h 標頭檔案包含進來,接下來加入以下兩行程式,至於後面的地址為什麼會這樣,這是 LCD 顯示裡的哦。 #define LCD_REG_ADDRESS *(__IO uint16_t *)(0x6C000000) #define LCD_DATA_ADDRESS *(__IO uint16_t *)(0x6C000800) 再就是下面的幾個程式,新增紅色部分程式 static void LcdWriteReg(U16 Data) { // ... TBD by user LCD_REG_ADDRESS=Data; } static void LcdWriteData(U16 Data) { // ... TBD by user LCD_DATA_ADDRESS=Data; } static void LcdWriteDataMultiple(U16 * pData, int NumItems) { while (NumItems--) { // ... TBD by user LCD_DATA_ADDRESS=*pData++; } } static void LcdReadDataMultiple(U16 * pData, int NumItems) { *pData = LCD_DATA_ADDRESS; while (NumItems--) { // ... TBD by user *pData++=LCD_DATA_ADDRESS; } } 此時重要的函式來嘍 void LCD_X_Config(void)Config.Orientation = GUI_SWAP_XY | GUI_MIRROR_Y; 這句是顯示方向的,預設的是這個,弄好後,下進去板子,看是否正常顯示,不正常顯示可以試試修改這裡哦。 GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66709, GUIDRV_FLEXCOLOR_M16C0B16); GUIDRV_FLEXCOLOR_F66709 這個東西很重要,移植的時候我就栽在這裡啦,這是對控制芯 片的支援,具體請看最新手冊 5.22 的( P991),也有中文的 5.12,不過 5.22 支援的很多。 最後就是 main 函式嘍 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE); GUI_Init(); GUI_DispString("Hello STemWin!"); 記住這句一定要加上 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE); 四、加入 demo,讓 emWin 炫起來 1、加入demo檔案      在main.c里加入標頭檔案 guidemo.h 然後在主函式里加入 GUIDEMO_Main(); 好,編譯程式,下進去,就可以看到經典的開始畫面了,但是沒有動,右下角沒有像別人的視訊裡的滾動!這是因為我們還沒有啟動 emWin 的心跳哦! 2、啟動emWin心跳     在HARDWARE 里加入 gui_time.c 和 gui_time.h 檔案, 具體原始碼見下圖:  其實就是迴圈呼叫OS_TimeMS++;讓 emWin 跳動起來。 別忘了,主函式要呼叫定時器的初始化哦! 我們再編譯, 程式跑起, 哈哈, 是不是動了。但是我們只看到只有一個示例在迴圈顯示。 OS_TimeMS在emWin的這裡進行了呼叫:  3、開啟多個demo示例開關             開啟 GUIDEMO.h 檔案, 配置如下圖,將後面括號裡的“0”改為“1”即為開啟此示例,記住後面每個專案的開關要關掉很多的,不然會有錯誤的。 我開了 8 個。      編譯後下載進去,就可以看到有8個畫面在迴圈顯示。 五、加入觸控式螢幕 1、觸控驅動程式     這裡借用正點原子的液晶屏驅動程式,複製原子的touch.c和touch.h檔案到工程裡(或直接使用原子例程裡的 “觸控式螢幕實驗”)。 同時,記得在主函式裡呼叫TP_Init();進行觸控式螢幕初始化。  2、修改程式,製作emWin與觸控式螢幕的介面函式     由於我們用的 5.22 版本沒有關於 touch的 C 檔案,我便從 5.16 那兒拷過來了GUI_X_Touch_Analog.c,把這個檔案加入到 StemWin5.22組裡, 因為直接就用的原子的觸摸了, 我們就直接呼叫 TP_Read_XY2(&x,&y);這個函式, 把他放進GUI_TOUCH_X_MeasureX(void)和 GUI_TOUCH_X_MeasureY(void)這兩個函式裡, 其實最後由這個函式 GUI_TOUCH_Exec()迴圈呼叫, 來一直讀 AD 的值。  注意:     如果完成第3步後,發現觸控式螢幕方向不對,可以試著修改上面加入的TP_Read_XY2(&x,&y);裡的&x和&y的位置。 同時,要 把GUI_TOUCH_Exec();這個函式也要放進前一步建的 gui_time.c 檔案裡, 具體見下圖:  3、通過示例確定校準值     這裡的校準值就是取得 A/D 轉換器的最小值和最大值。 emWin 需要用這些值來把測量結果轉換為以畫素表示的觸控位。這 4 個值為:      emWin 的示例資料夾中有一個小程式,可用來獲取觸控面板的這些值。 該程式位於文 件夾 Sample\Tutorial 下,程式名稱為 TOUCH_Sample.c。 在硬體上執行該示例顯示效果如下圖:  接下來我們在 LCDConf_FlexColor_Template.c 檔案中加入上面提到的四個值 #define TOUCH_AD_TOP 221 #define TOUCH_AD_BOTTOM 3900 #define TOUCH_AD_LEFT 160 #define TOUCH_AD_RIGHT 3883 後面的數字只是臨時寫的, 然後我們再新建 gui_touch.c 檔案, 這就是 TOUCH_Sample.c 檔案的程式, 我們拷貝過來到 gui_touch.c 中, 如下圖所示:  然後,main.c里程序如下圖:  然後下載程式, 介面如下圖:  這是確定左上角的值,記住 一定要觸控,藍色的 X 就是 TOUCH_AD_LEFT 的值, Y 就是 TOUCH_AD_TOP 的值。 同理,拖動游標到右下角,藍色 X 的值為 TOUCH_AD_RIGHT, Y值 為 TOUCH_AD_BOTTOM 。這 樣,前 面 提 到 的 四 個 值 就 已 經 確 定 了,同 時 改 掉LCDConf_FlexColor_Template.c 裡的那四個值。 4、在初始化程式LCD_X_Config 函式裡呼叫 GUI_TOUCH_Calibrate 函式 如下圖,加入下面兩句程式:                  GUI_TOUCH_Calibrate(GUI_COORD_X, 0, 240, TOUCH_AD_TOP, TOUCH_AD_BOTTOM);                  GUI_TOUCH_Calibrate(GUI_COORD_Y, 0, 320, TOUCH_AD_LEFT, TOUCH_AD_RIGHT);          至此,emWin加觸控式螢幕的移植完成!