【第3版emWin教程】第50章 emWin6.x的AppWizard使用控制元件經典回撥方式
教程不斷更新中:http://www.armbbs.cn/forum.php?mod=viewthread&tid=98429
第50章 emWin6.x的AppWizard使用控制元件經典回撥方式
本期教程為大家講解emWin6.x的GUI開發工具AppWizard使用控制元件經典回撥方式。這樣我們就可以emWin的經典回撥玩法和AppWizard很好的結合到一起。
50.1 初學者重要提示
50.2 AppWizard建立控制元件回撥函式
50.3 AppWizard生成的VS工程使用VS2019執行方法
50.4 AppWizard建立的介面新增到工程
50.5 實驗例程說明(RTOS)
50.6 實驗例程說明(裸機)
50.7 總結
50.1 初學者重要提示
- 本章節主要為大家講解如何像使用emWin經典回撥方式一樣玩AppWizard的訊息處理。
- 使用的AppWizard版本一定要和emWin版本匹配,本章配套例子使用的emWin版本是V6.16。對應的AppWizard版本是V1.20,下載地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=105049 。
- AppWizard工程路徑不支援中文,使用時特別注意。
- AppWizard生成的emWin6.x工程可以方便的融合之前的低版本emWin工程程式碼,在回撥函式裡面可以方便的新增之前基於視窗或者對話方塊建立的介面。
50.2 AppWizard建立介面
下面使用AppWizard建立介面,先讓大家有個整體認識,方便後面章節的展開。注意,使用經典emWin回撥訊息處理,不需要使用AppWizard建立回撥。
50.2.1 下載安裝AppWizard
下載地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=105049 。安裝後效果如下:
50.2.2 建立AppWizard工程
選擇Create new project:
下面要需要設定配置項,主要是Color format顏色格式別配置錯了,要跟開發板emWin工程的顏色格式一致,我們這裡設定為16位色,M565。
建立後效果如下:
50.2.3 新增控制元件
依次點選左上角的控制元件物件:Screen和Box:
設定背景色:
新增兩個按鈕控制元件和一個二維碼:
50.2.4 設定預設的點陣圖格式
點選選單Edit -> Preferences:
由於我們前面設定的M565顏色格式,這裡設定GUICC_M565選項即可:
這個設定很重要,否則很容易造成AppWizard生成的工程程式碼移植到板子上硬體異常。
50.2.5 執行AppWizard
點選下面這個小按鈕可以執行設計的介面:
50.2.6 匯出AppWizard程式碼
點選選單File -> Export & Save即可匯出:
匯出檔案在建立時設定的路徑中。
50.3 AppWizard生成的VS工程使用VS2019執行方法
匯出的VS工程檔案位於如下路徑:
執行後效果如下:
50.4 AppWizard建立的介面新增到工程
AppWizard生成介面程式碼後,將其新增到工程中。這個過程有幾個注意事項,在下面步驟中會為大家說明。
50.4.1 新增一批xxxx_Private.h檔案到工程
開發板的工程檔案裡面沒有這些檔案,需要大家從AppWizard工程路徑:Simulation\GUI_Lib 裡面複製到開發板工程路徑\emWin\Include裡面,下面是部分截圖,詳情看本章節配套的例子即可:
50.4.2 新增AppWizard介面檔案到工程
方便起見,將AppWizard所有檔案複製到開發板工程裡面:
新增到工程的效果如下:
50.4.3 新增工程路徑
僅新增一個路徑選項即可:
50.4.4 修改程式
主要修改兩個地方:
- bsp.c檔案將LCD背光點亮。
void bsp_Init(void) { /* 省略未寫 */ /* 延遲200ms再點亮背光,避免瞬間高亮 */ bsp_DelayMS(200); LCD_SetBackLight(255); }
- APPWConf.c檔案
使能三緩衝,關閉檔案系統。
/********************************************************************* * * Multibuffering */ static U8 _MultibufEnable = 1; /********************************************************************* * * Static code * ********************************************************************** */ /********************************************************************* * * _InitText */ static void _InitText(void) { // // Empty, because application does not contain any text // } /********************************************************************* * * Public code * ********************************************************************** */ /********************************************************************* * * APPW_X_Setup */ void APPW_X_Setup(void) { APPW_SetpfInitText(_InitText); //APPW_X_FS_Init(); APPW_MULTIBUF_Enable(_MultibufEnable); APPW_SetData(_apRootList, _NumScreens, _aVarList, _NumVars); }
50.4.5 新增按鈕回撥函式訊息
修改檔案ID_SCREEN_00_Slots.c,使用emWin的經典回撥方式,我們這裡做了簡單的LED閃爍和串列埠列印:
#include "Application.h" #include "../Generated/Resource.h" #include "../Generated/ID_SCREEN_00.h" #include "bsp.h" /*** Begin of user code area ***/ /*** End of user code area ***/ /********************************************************************* * * Public code * ********************************************************************** */ /********************************************************************* * * cbID_SCREEN_00 */ void cbID_SCREEN_00(WM_MESSAGE * pMsg) { int NCode, Id; switch (pMsg->MsgId) { case WM_NOTIFY_PARENT: Id = WM_GetId(pMsg->hWinSrc); NCode = pMsg->Data.v; switch (Id) { case ID_BUTTON_00: switch(NCode) { case WM_NOTIFICATION_CLICKED: bsp_LedToggle(1); printf("按鈕ID_BUTTON_00按下\r\n"); break; case WM_NOTIFICATION_RELEASED: break; } break; case ID_BUTTON_01: switch(NCode) { case WM_NOTIFICATION_CLICKED: bsp_LedToggle(1); printf("按鈕ID_BUTTON_01按下\r\n"); break; case WM_NOTIFICATION_RELEASED: break; } break; } break; } }
通過前面這幾步就完成了AppWizard的回撥訊息處理。
50.5 實驗例程說明(RTOS)
配套例子:
V7-563_emWin6.x實驗_AppWizard使用emWin經典回撥(RTOS)
實驗目的:
- 學習AppWizard控制元件回撥訊息。
- 點選第1個按鈕可以實現LED1反轉和串列埠列印。
- 點選第2個按鈕也可以實現LED1反轉和串列埠列印。
實驗內容:
1、K1按鍵按下,串列埠或者RTT列印任務執行情況(串列埠波特率115200,資料位8,奇偶校驗位無,停止位1)。
2、(1) 凡是用到printf函式的全部通過函式App_Printf實現。
(2) App_Printf函式做了訊號量的互斥操作,解決資源共享問題。
3、預設上電是通過串列埠列印資訊,如果使用RTT列印資訊:
MDK AC5,MDK AC6或IAR通過使能bsp.h檔案中的巨集定義為1即可
#define Enable_RTTViewer 1
4、各個任務實現的功能如下:
App Task Start 任務 :啟動任務,這裡用作BSP驅動包處理。
App Task MspPro任務 :訊息處理,這裡用作LED閃爍。
App Task UserIF 任務 :按鍵訊息處理。
App Task COM 任務 :暫未使用。
App Task GUI 任務 :GUI任務。
μCOS-III任務除錯資訊(按K1按鍵,串列埠列印):
RTT 列印資訊方式:
程式設計:
任務棧大小分配:
μCOS-III任務棧大小在app_cfg.h檔案中配置:
#define APP_CFG_TASK_START_STK_SIZE 512u
#define APP_CFG_TASK_MsgPro_STK_SIZE 2048u
#define APP_CFG_TASK_COM_STK_SIZE 512u
#define APP_CFG_TASK_USER_IF_STK_SIZE 512u
#define APP_CFG_TASK_GUI_STK_SIZE 2048u
任務棧大小的單位是4位元組,那麼每個任務的棧大小如下:
App Task Start 任務 :2048位元組。
App Task MspPro任務 :8192位元組。
App Task UserIF 任務 :2048位元組。
App Task COM 任務 :2048位元組。
App Task GUI 任務 :8192位元組。
系統棧大小分配:
μCOS-III的系統棧大小在os_cfg_app.h檔案中配置:
#define OS_CFG_ISR_STK_SIZE 512u
系統棧大小的單位是4位元組,那麼這裡就是配置系統棧大小為2KB
emWin動態記憶體配置:
GUIConf.c檔案中的配置如下:
#define EX_SRAM 1/*1 used extern sram, 0 used internal sram */ #if EX_SRAM #define GUI_NUMBYTES (1024*1024*24) #else #define GUI_NUMBYTES (100*1024) #endif
通過巨集定義來配置使用內部SRAM還是外部的SDRAM做為emWin的動態記憶體,當配置:
#define EX_SRAM 1 表示使用外部SDRAM作為emWin動態記憶體,大小24MB。
#define EX_SRAM 0 表示使用內部SRAM作為emWin動態記憶體,大小100KB。
預設情況下,本教程配套的所有emWin例子都是用外部SDRAM作為emWin動態記憶體。
emWin介面顯示效果:
800*480解析度介面效果。
50.6 實驗例程說明(裸機)
配套例子:
V7-562_emWin6.x實驗_AppWizard使用emWin經典回撥(裸機)
實驗目的:
- 學習AppWizard控制元件回撥訊息。
- 點選第1個按鈕可以實現LED1反轉和串列埠列印。
- 點選第2個按鈕也可以實現LED1反轉和串列埠列印。
emWin介面顯示效果:
800*480解析度介面效果。
emWin動態記憶體配置:
GUIConf.c檔案中的配置如下:
#define EX_SRAM 1/*1 used extern sram, 0 used internal sram */ #if EX_SRAM #define GUI_NUMBYTES (1024*1024*24) #else #define GUI_NUMBYTES (100*1024) #endif
通過巨集定義來配置使用內部SRAM還是外部的SDRAM做為emWin的動態記憶體,當配置:
#define EX_SRAM 1 表示使用外部SDRAM作為emWin動態記憶體,大小24MB。
#define EX_SRAM 0 表示使用內部SRAM作為emWin動態記憶體,大小100KB。
預設情況下,本教程配套的所有emWin例子都是用外部SDRAM作為emWin動態記憶體。
50.7 總結
本章節主要是為大家講解了AppWizard控制元件經典emWin回撥訊息處理,後續章節將深入為大家說明。
微信公眾號:armfly_com 安富萊論壇:www.armbbs.cn 安富萊淘寶:https://armfly.taobao.com