【STM32F429】第12章 GUIX Studio生成程式碼移植到硬體平臺

Simon223發表於2020-12-25

最新教程下載:http://www.armbbs.cn/forum.php?mod=viewthread&tid=98429

第12章       GUIX Studio生成程式碼移植到硬體平臺

本章節為大家講解GUIX Studio生成的程式碼移植到硬體平臺的方法

目錄

第12章       GUIX Studio生成程式碼移植到硬體平臺

12.1 初學者重要提示

12.2 GUIX Studio生成程式碼檔案

12.3 GUIX Studio生成檔案移植到MDK AC5

12.3.1        第1步:新增生成的檔案到工程裡

12.3.2        第2步:修改gx_studio_display_configure形參

12.3.3        第3步:修改gx_studio_named_widget_create形參

12.3.4        第4步:修改檔案App_SysFunction.c

12.3.5        第5步:編譯執行

12.4 GUIX Studio生成檔案移植到MDK AC6

12.4.1        第1步:新增生成的檔案到工程裡

12.4.2        第2步:修改gx_studio_display_configure形參

12.4.3        第3步:修改gx_studio_named_widget_create形參

12.4.4        第4步:修改檔案App_SysFunction.c

12.4.5        第5步:編譯執行

12.5 GUIX Studio生成檔案移植到IAR

12.5.1        第1步:新增生成的檔案到工程裡

12.5.2        第2步:修改gx_studio_display_configure形參

12.5.3        第3步:修改gx_studio_named_widget_create形參

12.5.4        第4步:修改檔案App_SysFunction.c

12.5.5        第5步:編譯執行

12.6 GUIX Studio生成檔案移植到Embedded Studio

12.6.1        第1步:新增生成的檔案到工程裡

12.6.2        第2步:修改gx_studio_display_configure形參

12.6.3        第3步:修改gx_studio_named_widget_create形參

12.6.4        第4步:修改檔案App_SysFunction.c

12.6.5        第5步:編譯執行

12.7 實驗例程

12.8 總結


 

12.1 初學者重要提示

  1.   移植GUIX Studio生成的程式碼到硬體平臺有好幾處需要注意的地方,大家移植的時候一定要注意,本章教程也進行了詳細說明。

12.2 GUIX Studio生成程式碼檔案

第11章講解了GUIX Studio的使用方法,並製作了一個GUIX Studio的簡單Demo。我們這裡直接使用這個Demo:

 

點選GUIX Studio左上角的Project –>Generate All Output Files:

彈出如下介面:

1、用於選擇匯出那些內容,預設是全部匯出,建議全部匯出,防止不必要的麻煩。

2、如果勾上覆選框,會多出來一個編輯框,可以設定生成的資原始檔名:

3、如果勾上binary mode,表示生成的資原始檔使用二進位制模式。

  •   選擇S-Record

表示資原始檔字尾採用srec,此設定模式下還可以設定偏移地址

  •   選擇Binary

表示資原始檔字尾採用bin。

4、如果勾上覆選框,表示生成資源標頭檔案,取消表示不生成。

 

瞭解了這些配置選項後,再設定就比較容易理解了,當前我們這裡全部生成原始檔,帶資原始檔頭,具體配置如下:

設定完畢後,點選右下角的Generate按鈕就可以生成檔案了,點選後彈出如下對話方塊,表示生成成功:

生成的檔案就在大家建立GUIX Studio工程時指定的檔案裡面,生成的檔案如下:

  •   guiapp_resources.c
  •   guiapp_resources.h

這兩個檔案主要用於字型檔,相簿等資源。

  •   gui_specifications.c
  •   gui_specifications.h

這兩個檔案是基於GUIX API新封裝的一些函式,方便使用者呼叫。

12.3 GUIX Studio生成檔案移植到MDK AC5

這裡分步為大家詳細說明:

12.3.1        第1步:新增生成的檔案到工程裡

工程模板使用前面章節制作的例子V6-2005_GUIX Template(RG565)。開啟路徑:\User\guix,將此檔案裡面的如下四個檔案刪掉:

然後將我們新制作的這四個檔案新增進去,開啟工程後,效果如下:

由於新作的GUIX Studio工程名是guiapp,與此例子之前使用的GUI Studio模板名一樣,所以直接替換即可,如果大家建立的工程名不一致,需要大家手動刪掉之前的,並新增新生成的檔案。

12.3.2        第2步:修改gx_studio_display_configure形參

此函式的實現在guiapp_specifications.c檔案裡面,GUIX Studio自動生成的,無需使用者管,使用者要做就是填對引數即可:

UINT gx_studio_display_configure(USHORT display, UINT (*driver)(GX_DISPLAY *),
    GX_UBYTE language, USHORT theme, GX_WINDOW_ROOT **return_root)
{
    GX_CONST GX_THEME *theme_ptr;
    GX_RECTANGLE size;

    GX_STUDIO_DISPLAY_INFO *display_info = &guiapp_display_table[display];


/* 建立顯示區 */
    gx_display_create(display_info->display,
                      display_info->name,
                      driver,
                      (GX_VALUE) display_info->x_resolution,
                      (GX_VALUE) display_info->y_resolution);

/* 安裝主題 */
    if(display_info->theme_table)
    {
        theme_ptr = display_info->theme_table[theme];
        if(theme_ptr)
        {
            gx_display_color_table_set(display_info->display, theme_ptr->theme_color_table,
 theme_ptr->theme_color_table_size);
            
/* 安裝顏色板 */
            if (display_info->display->gx_display_driver_palette_set &&
                theme_ptr->theme_palette != NULL)
            {
                display_info->display->gx_display_driver_palette_set(display_info->display,
 theme_ptr->theme_palette, theme_ptr->theme_palette_size);
            }

            gx_display_font_table_set(display_info->display, theme_ptr->theme_font_table,
 theme_ptr->theme_font_table_size);
            gx_display_pixelmap_table_set(display_info->display, theme_ptr->theme_pixelmap_table,
 theme_ptr->theme_pixelmap_table_size);
            gx_system_scroll_appearance_set(theme_ptr->theme_vertical_scroll_style,
 (GX_SCROLLBAR_APPEARANCE *) &theme_ptr->theme_vertical_scrollbar_appearance);
            gx_system_scroll_appearance_set(theme_ptr->theme_horizontal_scroll_style,
 (GX_SCROLLBAR_APPEARANCE *) &theme_ptr->theme_horizontal_scrollbar_appearance);
            gx_display_language_table_set_ext(display_info->display, display_info->language_table, 
(GX_UBYTE) display_info->language_table_size, display_info->string_table_size);
            gx_display_active_language_set(display_info->display, language);
        }
    }


/* 建立畫布 */
    gx_canvas_create(display_info->canvas,
                     display_info->canvas_name,
                     display_info->display,
                     GX_CANVAS_MANAGED | GX_CANVAS_VISIBLE,
                     display_info->x_resolution,
                     display_info->y_resolution,
                     display_info->canvas_memory,
                     display_info->canvas_memory_size);

/* 建立畫布對應的根視窗 */
    gx_utility_rectangle_define(&size,
                                0, 0,
                                (GX_VALUE) (display_info->x_resolution - 1),
                                (GX_VALUE) (display_info->y_resolution - 1));

    gx_window_root_create(display_info->root_window,
                          display_info->name,
                          display_info->canvas, GX_STYLE_NONE, 0, &size);
    if (return_root)
    {
        *return_root = display_info->root_window;
    }
    return GX_SUCCESS;
}
  •   第1個引數是螢幕索引,如果是GUIX Studio配置的第1個螢幕,此處填0,如果是配置的第2個螢幕,此處填1,以此類推。對應的索引巨集定義已經在GUIX Studio生成的guiapp_resources.h檔案裡面定義,大家可以直接呼叫。
/* Display and theme definitions */
#define DISPLAY_1 0
#define DISPLAY_1_COLOR_FORMAT GX_COLOR_FORMAT_565RGB
#define DISPLAY_1_X_RESOLUTION 800
#define DISPLAY_1_Y_RESOLUTION 480
#define DISPLAY_1_THEME_1 0
#define DISPLAY_1_THEME_TABLE_SIZE 1
  •   第2個引數是螢幕底層驅動介面函式,此介面函式的函式名可以隨意定義,比如我們這裡的RGB565顏色格式採用的函式stm32f4_graphics_driver_setup_565rgb。
  •   第3個引數語言ID,這個引數是在GUIX Studio生成的guiapp_resources.h檔案裡面定義,如果大家定義了多國語言,此檔案裡面會有多個ID巨集定義供大家使用。我們前面GUIX Studio工程僅使用了英文,所以這裡只能填LANGUAGE_ENGLISH。
/* Language definitions */
#define LANGUAGE_ENGLISH 0
#define DISPLAY_1_LANGUAGE_TABLE_SIZE 1
  •   第4個引數是介面主題索引,這個引數也是在GUIX Studio生成的guiapp_resources.h檔案裡面定義,一個介面可以有多個主題,使用那個主題,填對應的巨集定義即可:
#define DISPLAY_1_X_RESOLUTION 800
#define DISPLAY_1_Y_RESOLUTION 480
#define DISPLAY_1_THEME_1 0
#define DISPLAY_1_THEME_TABLE_SIZE 1
  •   第5個引數是根視窗控制程式碼。

 

有了這些認識後,再配置就比較簡單了,我們這裡要修改為如下:

gx_studio_display_configure(DISPLAY_1, stm32f4_graphics_driver_setup_565rgb,
        LANGUAGE_ENGLISH, DISPLAY_1_THEME_1, &root);

12.3.3        第3步:修改gx_studio_named_widget_create形參

此函式的實現也在guiapp_specifications.c檔案裡面,GUIX Studio自動生成的,無需使用者管,使用者要做就是填對引數即可,特別是第1個引數:

UINT gx_studio_named_widget_create(char *name, GX_WIDGET *parent, GX_WIDGET **new_widget)
{
    UINT status = GX_FAILURE;
    GX_CONST GX_STUDIO_WIDGET_ENTRY *entry = guiapp_widget_table;
    GX_WIDGET *widget = GX_NULL;

    while(entry->widget_information)
    {
        if (!strcmp(name, entry->widget_information->widget_name))
        {
            widget = gx_studio_widget_create((GX_BYTE *) entry->widget, entry->widget_information, parent);
            if (widget)
            {
                status = GX_SUCCESS;
            }
            break;
        }
        entry++;
    }

    if (new_widget)
    {
        *new_widget = widget;
    }
    return status;
}
  •   第1個引數比較重要,不是隨便寫的,因為此函式裡面的strcmp會做比較匹配,檢視此視窗名是否存在。大家要填的這個引數在檔案guiapp_specifications.c的xxxx__widget_table裡面定義,對應我們前面GUIX Studio生成的程式碼就是guiapp_widget_table,我們這裡僅有一個window_define:
GX_CONST GX_STUDIO_WIDGET_ENTRY guiapp_widget_table[] =
{
    { &window_define, (GX_WIDGET *) &window },
    {GX_NULL, GX_NULL}
};
GX_CONST GX_STUDIO_WIDGET window_define =
{
    "window",
    GX_TYPE_WINDOW,                          /* widget type                    */
    GUIX_ID_WINDOW0,                         /* widget id                      */
    #if defined(GX_WIDGET_USER_DATA)
    0,                                       /* user data                      */
    #endif
    GX_STYLE_BORDER_THIN|GX_STYLE_ENABLED,   /* style flags                    */
    GX_STATUS_ACCEPTS_FOCUS,                 /* status flags                   */
    sizeof(WINDOW_CONTROL_BLOCK),            /* control block size             */
    GX_COLOR_ID_WINDOW_FILL,                 /* normal color id                */
    GX_COLOR_ID_WINDOW_FILL,                 /* selected color id              */
    GX_COLOR_ID_DISABLED_FILL,               /* disabled color id              */
    gx_studio_window_create,                 /* create function                */
    GX_NULL,                                 /* drawing function override      */
    GX_NULL,                                 /* event function override        */
    {0, 0, 799, 479},                        /* widget size                    */
    GX_NULL,                                 /* next widget                    */
    &window_prompt_define,                   /* child widget                   */
    0,                                       /* control block                  */
    (void *) &window_properties              /* extended properties            */
};

我們這裡第1個引數要寫window。

  •   第2個引數是根視窗控制程式碼。
  •   第3個引數是新建立視窗控制程式碼。

 

有了這些認識後,再配置就比較簡單了,我們這裡要修改為如下:

  gx_studio_named_widget_create("window", (GX_WIDGET *)root, (GX_WIDGET **)&pScreen);

12.3.4        第4步:修改檔案App_SysFunction.c

針對我們配套的例子模板,不需要修改這個檔案,大家自己做的移植需要根據情況選擇是否修改。針對這個檔案要注意下面幾點:

  •   動態記憶體的分配

主要配置了GUIX動態記憶體的地址和大小以及畫布的地址,大家根據自己的情況做修改即可:

/*
*********************************************************************************************************
*                                            動態記憶體分配
*********************************************************************************************************
*/
#define       GUI_NUMBYTES     1024*1024*8                         /* 設定動態記憶體大小 */
#define       Canvas_Memory    0xC0400000                          /* 設定Canvas地址   */
TX_BYTE_POOL  memory_pool;
uint8_t       *MemoryBlock = (uint8_t *)(0xC0000000 + 1024*1024*8); /* 動態記憶體地址    */

動態記憶體設定的地址:0xC0000000 + 1024*1024*8, 大小8MB。

canvas畫布地址:0xC0400000, 大小4MB,實際沒有使用這麼大,以我們本次GUIX Studio生成的程式碼為例,實際大小在guiapp_specifications.c檔案裡面定義:

GX_STUDIO_DISPLAY_INFO guiapp_display_table[1] =
{
    {
    "display_1",
    "display_1_canvas",
    display_1_theme_table,
    display_1_language_table,
    DISPLAY_1_THEME_TABLE_SIZE,
    DISPLAY_1_LANGUAGE_TABLE_SIZE,
    DISPLAY_1_STRING_TABLE_SIZE,
    800,                                     /* x resolution                   */
    480,                                     /* y resolution                   */
    &display_1_control_block,
    &display_1_canvas_control_block,
    &display_1_root_window,
    GX_NULL,                                 /* canvas memory area             */
    768000                                   /* canvas memory size in bytes    */
    }
};

實際需要768000位元組。我們這裡留出冗餘是為了以後多畫布使用。大家可以根據實際需要做修改。

  •   結構體guiapp_display_table

為了方便設定畫布,將guiapp_specifications.c檔案裡面結構體guiapp_display_table放到了此檔案裡面引用,大家根據自己的定義做修改。

/*
*********************************************************************************************************
*                                            變數
*********************************************************************************************************
*/
extern GX_STUDIO_DISPLAY_INFO guiapp_display_table[1];
  •   自適應不同解析度螢幕

我們的螢幕有4.3寸,5寸和7寸,解析度主要有兩類480*272和800*480。為了讓800*480解析度下實現的介面在480*272下也可以使用,這裡做了一個簡單的自適應,即800*480下設計的內容都在480*272解析度範圍內,那麼在兩個解析度下都是可以正常顯示的。

/*
*********************************************************************************************************
*    函 數 名: gx_initconfig
*    功能說明: GUIX
*    形    參: 無       
*    返 回 值: 無
*********************************************************************************************************
*/
void gx_initconfig(void) 
{
    /* 省略未寫 */
    
    /* 自適應不同解析度螢幕 */
    switch (g_LcdType)
    {
        
        case LCD_43_480X272:        /* 4.3寸 480 * 272 */    
        case LCD_50_480X272:        /* 5.0寸 480 * 272 */
            guiapp_display_table[0].x_resolution = 480;
            guiapp_display_table[0].y_resolution = 272;
            break;
        
        case LCD_50_800X480:        /* 5.0寸 800 * 480 */
        case LCD_70_800X480:        /* 7.0寸 800 * 480 */    
            guiapp_display_table[0].x_resolution = 800;
            guiapp_display_table[0].y_resolution = 480;
            break;
        
        default:    
            break;
    }
}
  •   畫布地址空間

畫布地址設定放在了函式gx_initconfig末尾。

/*
*********************************************************************************************************
*    函 數 名: gx_initconfig
*    功能說明: GUIX
*    形    參: 無       
*    返 回 值: 無
*********************************************************************************************************
*/
void gx_initconfig(void) 
{
    /* 省略未寫 */
    
    guiapp_display_table[0].canvas_memory = (GX_COLOR *)Canvas_Memory;
}

12.3.5        第5步:編譯執行

通過前面四步就完成了GUIX Studio生成程式碼移植到MDK AC5,然後大家編譯執行即可。這裡特別注意一點,如果大家測試遇到更新了GUIX Studio生成的程式碼,但是實際板子執行效果沒有變化,此時就需要大家開啟GUIX Studio生成的每個C檔案單獨編譯,然後全編譯即可。

12.4 GUIX Studio生成檔案移植到MDK AC6

移植到MDK AC5和AC6基本是一樣的。

12.4.1        第1步:新增生成的檔案到工程裡

工程模板使用前面章節制作的例子V6-2005_GUIX Template(RG565)。開啟路徑:\User\guix,將此檔案裡面的如下四個檔案刪掉:

然後將我們新制作的這四個檔案新增進去,開啟工程後,效果如下:

由於新作的GUIX Studio工程名是guiapp,與此例子之前使用的GUI Studio模板名一樣,所以直接替換即可,如果大家建立的工程名不一致,需要大家手動刪掉之前的,並新增新生成的檔案。

12.4.2        第2步:修改gx_studio_display_configure形參

此函式的實現在guiapp_specifications.c檔案裡面,GUIX Studio自動生成的,無需使用者管,使用者要做就是填對引數即可:

UINT gx_studio_display_configure(USHORT display, UINT (*driver)(GX_DISPLAY *),
    GX_UBYTE language, USHORT theme, GX_WINDOW_ROOT **return_root)
{
    GX_CONST GX_THEME *theme_ptr;
    GX_RECTANGLE size;

    GX_STUDIO_DISPLAY_INFO *display_info = &guiapp_display_table[display];


/* 建立顯示區 */
    gx_display_create(display_info->display,
                      display_info->name,
                      driver,
                      (GX_VALUE) display_info->x_resolution,
                      (GX_VALUE) display_info->y_resolution);

/* 安裝主題 */
    if(display_info->theme_table)
    {
        theme_ptr = display_info->theme_table[theme];
        if(theme_ptr)
        {
            gx_display_color_table_set(display_info->display, theme_ptr->theme_color_table,
 theme_ptr->theme_color_table_size);
            
/* 安裝顏色板 */
            if (display_info->display->gx_display_driver_palette_set &&
                theme_ptr->theme_palette != NULL)
            {
                display_info->display->gx_display_driver_palette_set(display_info->display,
 theme_ptr->theme_palette, theme_ptr->theme_palette_size);
            }

            gx_display_font_table_set(display_info->display, theme_ptr->theme_font_table,
 theme_ptr->theme_font_table_size);
            gx_display_pixelmap_table_set(display_info->display, theme_ptr->theme_pixelmap_table,
 theme_ptr->theme_pixelmap_table_size);
            gx_system_scroll_appearance_set(theme_ptr->theme_vertical_scroll_style,
 (GX_SCROLLBAR_APPEARANCE *) &theme_ptr->theme_vertical_scrollbar_appearance);
            gx_system_scroll_appearance_set(theme_ptr->theme_horizontal_scroll_style,
 (GX_SCROLLBAR_APPEARANCE *) &theme_ptr->theme_horizontal_scrollbar_appearance);
            gx_display_language_table_set_ext(display_info->display, display_info->language_table, 
(GX_UBYTE) display_info->language_table_size, display_info->string_table_size);
            gx_display_active_language_set(display_info->display, language);
        }
    }


/* 建立畫布 */
    gx_canvas_create(display_info->canvas,
                     display_info->canvas_name,
                     display_info->display,
                     GX_CANVAS_MANAGED | GX_CANVAS_VISIBLE,
                     display_info->x_resolution,
                     display_info->y_resolution,
                     display_info->canvas_memory,
                     display_info->canvas_memory_size);

/* 建立畫布對應的根視窗 */
    gx_utility_rectangle_define(&size,
                                0, 0,
                                (GX_VALUE) (display_info->x_resolution - 1),
                                (GX_VALUE) (display_info->y_resolution - 1));

    gx_window_root_create(display_info->root_window,
                          display_info->name,
                          display_info->canvas, GX_STYLE_NONE, 0, &size);
    if (return_root)
    {
        *return_root = display_info->root_window;
    }
    return GX_SUCCESS;
}
  •  第1個引數是螢幕索引,如果是GUIX Studio配置的第1個螢幕,此處填0,如果是配置的第2個螢幕,此處填1,以此類推。對應的索引巨集定義已經在GUIX Studio生成的guiapp_resources.h檔案裡面定義,大家可以直接呼叫。
/* Display and theme definitions */
#define DISPLAY_1 0
#define DISPLAY_1_COLOR_FORMAT GX_COLOR_FORMAT_565RGB
#define DISPLAY_1_X_RESOLUTION 800
#define DISPLAY_1_Y_RESOLUTION 480
#define DISPLAY_1_THEME_1 0
#define DISPLAY_1_THEME_TABLE_SIZE 1
  •   第2個引數是螢幕底層驅動介面函式,此介面函式的函式名可以隨意定義,比如我們這裡的RGB565顏色格式採用的函式stm32h7_graphics_driver_setup_565rgb。
  •   第3個引數語言ID,這個引數是在GUIX Studio生成的guiapp_resources.h檔案裡面定義,如果大家定義了多國語言,此檔案裡面會有多個ID巨集定義供大家使用。我們前面GUIX Studio工程僅使用了英文,所以這裡只能填LANGUAGE_ENGLISH。
/* Language definitions */
#define LANGUAGE_ENGLISH 0
#define DISPLAY_1_LANGUAGE_TABLE_SIZE 1
  •  第4個引數是介面主題索引,這個引數也是在GUIX Studio生成的guiapp_resources.h檔案裡面定義,一個介面可以有多個主題,使用那個主題,填對應的巨集定義即可:
#define DISPLAY_1_X_RESOLUTION 800
#define DISPLAY_1_Y_RESOLUTION 480
#define DISPLAY_1_THEME_1 0
#define DISPLAY_1_THEME_TABLE_SIZE 1
  •  第5個引數是根視窗控制程式碼。

 

有了這些認識後,再配置就比較簡單了,我們這裡要修改為如下:

gx_studio_display_configure(DISPLAY_1, stm32h7_graphics_driver_setup_565rgb,
        LANGUAGE_ENGLISH, DISPLAY_1_THEME_1, &root);

12.4.3        第3步:修改gx_studio_named_widget_create形參

此函式的實現也在guiapp_specifications.c檔案裡面,GUIX Studio自動生成的,無需使用者管,使用者要做就是填對引數即可,特別是第1個引數:

UINT gx_studio_named_widget_create(char *name, GX_WIDGET *parent, GX_WIDGET **new_widget)
{
    UINT status = GX_FAILURE;
    GX_CONST GX_STUDIO_WIDGET_ENTRY *entry = guiapp_widget_table;
    GX_WIDGET *widget = GX_NULL;

    while(entry->widget_information)
    {
        if (!strcmp(name, entry->widget_information->widget_name))
        {
            widget = gx_studio_widget_create((GX_BYTE *) entry->widget, entry->widget_information, parent);
            if (widget)
            {
                status = GX_SUCCESS;
            }
            break;
        }
        entry++;
    }

    if (new_widget)
    {
        *new_widget = widget;
    }
    return status;
}
  •   第1個引數比較重要,不是隨便寫的,因為此函式裡面的strcmp會做比較匹配,檢視此視窗名是否存在。大家要填的這個引數在檔案guiapp_specifications.c的xxxx__widget_table裡面定義,對應我們前面GUIX Studio生成的程式碼就是guiapp_widget_table,我們這裡僅有一個window_define:
GX_CONST GX_STUDIO_WIDGET_ENTRY guiapp_widget_table[] =
{
    { &window_define, (GX_WIDGET *) &window },
    {GX_NULL, GX_NULL}
};
GX_CONST GX_STUDIO_WIDGET window_define =
{
    "window",
    GX_TYPE_WINDOW,                          /* widget type                    */
    GUIX_ID_WINDOW0,                         /* widget id                      */
    #if defined(GX_WIDGET_USER_DATA)
    0,                                       /* user data                      */
    #endif
    GX_STYLE_BORDER_THIN|GX_STYLE_ENABLED,   /* style flags                    */
    GX_STATUS_ACCEPTS_FOCUS,                 /* status flags                   */
    sizeof(WINDOW_CONTROL_BLOCK),            /* control block size             */
    GX_COLOR_ID_WINDOW_FILL,                 /* normal color id                */
    GX_COLOR_ID_WINDOW_FILL,                 /* selected color id              */
    GX_COLOR_ID_DISABLED_FILL,               /* disabled color id              */
    gx_studio_window_create,                 /* create function                */
    GX_NULL,                                 /* drawing function override      */
    GX_NULL,                                 /* event function override        */
    {0, 0, 799, 479},                        /* widget size                    */
    GX_NULL,                                 /* next widget                    */
    &window_prompt_define,                   /* child widget                   */
    0,                                       /* control block                  */
    (void *) &window_properties              /* extended properties            */
};

我們這裡第1個引數要寫window。

  •  第2個引數是根視窗控制程式碼。
  •  第3個引數是新建立視窗控制程式碼。

 

有了這些認識後,再配置就比較簡單了,我們這裡要修改為如下:

  gx_studio_named_widget_create("window", (GX_WIDGET *)root, (GX_WIDGET **)&pScreen);

12.4.4        第4步:修改檔案App_SysFunction.c

針對我們配套的例子模板,不需要修改這個檔案,大家自己做的移植需要根據情況選擇是否修改。針對這個檔案要注意下面幾點:

  •   動態記憶體的分配

主要配置了GUIX動態記憶體的地址和大小以及畫布的地址,大家根據自己的情況做修改即可:

/*
*********************************************************************************************************
*                                            動態記憶體分配
*********************************************************************************************************
*/
#define       GUI_NUMBYTES     1024*1024*8                         /* 設定動態記憶體大小 */
#define       Canvas_Memory    0xC0400000                          /* 設定Canvas地址   */
TX_BYTE_POOL  memory_pool;
uint8_t       *MemoryBlock = (uint8_t *)(0xC0000000 + 1024*1024*8); /* 動態記憶體地址    */

動態記憶體設定的地址:0xC0000000 + 1024*1024*8, 大小8MB。

canvas畫布地址:0xC0400000, 大小4MB,實際沒有使用這麼大,以我們本次GUIX Studio生成的程式碼為例,實際大小在guiapp_specifications.c檔案裡面定義:

GX_STUDIO_DISPLAY_INFO guiapp_display_table[1] =
{
    {
    "display_1",
    "display_1_canvas",
    display_1_theme_table,
    display_1_language_table,
    DISPLAY_1_THEME_TABLE_SIZE,
    DISPLAY_1_LANGUAGE_TABLE_SIZE,
    DISPLAY_1_STRING_TABLE_SIZE,
    800,                                     /* x resolution                   */
    480,                                     /* y resolution                   */
    &display_1_control_block,
    &display_1_canvas_control_block,
    &display_1_root_window,
    GX_NULL,                                 /* canvas memory area             */
    768000                                   /* canvas memory size in bytes    */
    }
};

實際需要768000位元組。我們這裡留出冗餘是為了以後多畫布使用。大家可以根據實際需要做修改。

  •   結構體guiapp_display_table

為了方便設定畫布,將guiapp_specifications.c檔案裡面結構體guiapp_display_table放到了此檔案裡面引用,大家根據自己的定義做修改。

/*
*********************************************************************************************************
*                                            變數
*********************************************************************************************************
*/
extern GX_STUDIO_DISPLAY_INFO guiapp_display_table[1];
  •   自適應不同解析度螢幕

我們的螢幕有4.3寸,5寸和7寸,解析度主要有兩類480*272和800*480。為了讓800*480解析度下實現的介面在480*272下也可以使用,這裡做了一個簡單的自適應,即800*480下設計的內容都在480*272解析度範圍內,那麼在兩個解析度下都是可以正常顯示的。

/*
*********************************************************************************************************
*    函 數 名: gx_initconfig
*    功能說明: GUIX
*    形    參: 無       
*    返 回 值: 無
*********************************************************************************************************
*/
void gx_initconfig(void) 
{
    /* 省略未寫 */
    
    /* 自適應不同解析度螢幕 */
    switch (g_LcdType)
    {
        
        case LCD_43_480X272:        /* 4.3寸 480 * 272 */    
        case LCD_50_480X272:        /* 5.0寸 480 * 272 */
            guiapp_display_table[0].x_resolution = 480;
            guiapp_display_table[0].y_resolution = 272;
            break;
        
        case LCD_50_800X480:        /* 5.0寸 800 * 480 */
        case LCD_70_800X480:        /* 7.0寸 800 * 480 */    
            guiapp_display_table[0].x_resolution = 800;
            guiapp_display_table[0].y_resolution = 480;
            break;
        
        default:    
            break;
    }
}
  •  畫布地址空間

畫布地址設定放在了函式gx_initconfig末尾。

/*
*********************************************************************************************************
*    函 數 名: gx_initconfig
*    功能說明: GUIX
*    形    參: 無       
*    返 回 值: 無
*********************************************************************************************************
*/
void gx_initconfig(void) 
{
    /* 省略未寫 */
    
    guiapp_display_table[0].canvas_memory = (GX_COLOR *)Canvas_Memory;
}

12.4.5        第5步:編譯執行

通過前面四步就完成了GUIX Studio生成程式碼移植到MDK AC6,然後大家編譯執行即可。這裡特別注意一點,如果大家測試遇到更新了GUIX Studio生成的程式碼,但是實際板子執行效果沒有變化,此時就需要大家開啟GUIX Studio生成的每個C檔案單獨編譯,然後全編譯即可。

12.5 GUIX Studio生成檔案移植到IAR

移植到IAR與移植的MDK基本是一樣的。

12.5.1        第1步:新增生成的檔案到工程裡

工程模板使用前面章節制作的例子V6-2005_GUIX Template(RG565)。開啟路徑:\User\guix,將此檔案裡面的如下四個檔案刪掉:

然後將我們新制作的這四個檔案新增進去,開啟工程後,效果如下:

由於新作的GUIX Studio工程名是guiapp,與此例子之前使用的GUI Studio模板名一樣,所以直接替換即可,如果大家建立的工程名不一致,需要大家手動刪掉之前的,並新增新生成的檔案。

12.5.2        第2步:修改gx_studio_display_configure形參

此函式的實現在guiapp_specifications.c檔案裡面,GUIX Studio自動生成的,無需使用者管,使用者要做就是填對引數即可:

UINT gx_studio_display_configure(USHORT display, UINT (*driver)(GX_DISPLAY *),
    GX_UBYTE language, USHORT theme, GX_WINDOW_ROOT **return_root)
{
    GX_CONST GX_THEME *theme_ptr;
    GX_RECTANGLE size;

    GX_STUDIO_DISPLAY_INFO *display_info = &guiapp_display_table[display];


/* 建立顯示區 */
    gx_display_create(display_info->display,
                      display_info->name,
                      driver,
                      (GX_VALUE) display_info->x_resolution,
                      (GX_VALUE) display_info->y_resolution);

/* 安裝主題 */
    if(display_info->theme_table)
    {
        theme_ptr = display_info->theme_table[theme];
        if(theme_ptr)
        {
            gx_display_color_table_set(display_info->display, theme_ptr->theme_color_table,
 theme_ptr->theme_color_table_size);
            
/* 安裝顏色板 */
            if (display_info->display->gx_display_driver_palette_set &&
                theme_ptr->theme_palette != NULL)
            {
                display_info->display->gx_display_driver_palette_set(display_info->display,
 theme_ptr->theme_palette, theme_ptr->theme_palette_size);
            }

            gx_display_font_table_set(display_info->display, theme_ptr->theme_font_table,
 theme_ptr->theme_font_table_size);
            gx_display_pixelmap_table_set(display_info->display, theme_ptr->theme_pixelmap_table,
 theme_ptr->theme_pixelmap_table_size);
            gx_system_scroll_appearance_set(theme_ptr->theme_vertical_scroll_style,
 (GX_SCROLLBAR_APPEARANCE *) &theme_ptr->theme_vertical_scrollbar_appearance);
            gx_system_scroll_appearance_set(theme_ptr->theme_horizontal_scroll_style,
 (GX_SCROLLBAR_APPEARANCE *) &theme_ptr->theme_horizontal_scrollbar_appearance);
            gx_display_language_table_set_ext(display_info->display, display_info->language_table, 
(GX_UBYTE) display_info->language_table_size, display_info->string_table_size);
            gx_display_active_language_set(display_info->display, language);
        }
    }


/* 建立畫布 */
    gx_canvas_create(display_info->canvas,
                     display_info->canvas_name,
                     display_info->display,
                     GX_CANVAS_MANAGED | GX_CANVAS_VISIBLE,
                     display_info->x_resolution,
                     display_info->y_resolution,
                     display_info->canvas_memory,
                     display_info->canvas_memory_size);

/* 建立畫布對應的根視窗 */
    gx_utility_rectangle_define(&size,
                                0, 0,
                                (GX_VALUE) (display_info->x_resolution - 1),
                                (GX_VALUE) (display_info->y_resolution - 1));

    gx_window_root_create(display_info->root_window,
                          display_info->name,
                          display_info->canvas, GX_STYLE_NONE, 0, &size);
    if (return_root)
    {
        *return_root = display_info->root_window;
    }
    return GX_SUCCESS;
}
  •   第1個引數是螢幕索引,如果是GUIX Studio配置的第1個螢幕,此處填0,如果是配置的第2個螢幕,此處填1,以此類推。對應的索引巨集定義已經在GUIX Studio生成的guiapp_resources.h檔案裡面定義,大家可以直接呼叫。
/* Display and theme definitions */
#define DISPLAY_1 0
#define DISPLAY_1_COLOR_FORMAT GX_COLOR_FORMAT_565RGB
#define DISPLAY_1_X_RESOLUTION 800
#define DISPLAY_1_Y_RESOLUTION 480
#define DISPLAY_1_THEME_1 0
#define DISPLAY_1_THEME_TABLE_SIZE 1
  •   第2個引數是螢幕底層驅動介面函式,此介面函式的函式名可以隨意定義,比如我們這裡的RGB565顏色格式採用的函式stm32h7_graphics_driver_setup_565rgb。
  •   第3個引數語言ID,這個引數是在GUIX Studio生成的guiapp_resources.h檔案裡面定義,如果大家定義了多國語言,此檔案裡面會有多個ID巨集定義供大家使用。我們前面GUIX Studio工程僅使用了英文,所以這裡只能填LANGUAGE_ENGLISH。
/* Language definitions */
#define LANGUAGE_ENGLISH 0
#define DISPLAY_1_LANGUAGE_TABLE_SIZE 1
  •   第4個引數是介面主題索引,這個引數也是在GUIX Studio生成的guiapp_resources.h檔案裡面定義,一個介面可以有多個主題,使用那個主題,填對應的巨集定義即可:
#define DISPLAY_1_X_RESOLUTION 800
#define DISPLAY_1_Y_RESOLUTION 480
#define DISPLAY_1_THEME_1 0
#define DISPLAY_1_THEME_TABLE_SIZE 1
  •   第5個引數是根視窗控制程式碼。

 

有了這些認識後,再配置就比較簡單了,我們這裡要修改為如下:

gx_studio_display_configure(DISPLAY_1, stm32h7_graphics_driver_setup_565rgb,
        LANGUAGE_ENGLISH, DISPLAY_1_THEME_1, &root);

12.5.3        第3步:修改gx_studio_named_widget_create形參

此函式的實現也在guiapp_specifications.c檔案裡面,GUIX Studio自動生成的,無需使用者管,使用者要做就是填對引數即可,特別是第1個引數:

UINT gx_studio_named_widget_create(char *name, GX_WIDGET *parent, GX_WIDGET **new_widget)
{
    UINT status = GX_FAILURE;
    GX_CONST GX_STUDIO_WIDGET_ENTRY *entry = guiapp_widget_table;
    GX_WIDGET *widget = GX_NULL;

    while(entry->widget_information)
    {
        if (!strcmp(name, entry->widget_information->widget_name))
        {
            widget = gx_studio_widget_create((GX_BYTE *) entry->widget, entry->widget_information, parent);
            if (widget)
            {
                status = GX_SUCCESS;
            }
            break;
        }
        entry++;
    }

    if (new_widget)
    {
        *new_widget = widget;
    }
    return status;
}
  •   第1個引數比較重要,不是隨便寫的,因為此函式裡面的strcmp會做比較匹配,檢視此視窗名是否存在。大家要填的這個引數在檔案guiapp_specifications.c的xxxx__widget_table裡面定義,對應我們前面GUIX Studio生成的程式碼就是guiapp_widget_table,我們這裡僅有一個window_define:
GX_CONST GX_STUDIO_WIDGET_ENTRY guiapp_widget_table[] =
{
    { &window_define, (GX_WIDGET *) &window },
    {GX_NULL, GX_NULL}
};
GX_CONST GX_STUDIO_WIDGET window_define =
{
    "window",
    GX_TYPE_WINDOW,                          /* widget type                    */
    GUIX_ID_WINDOW0,                         /* widget id                      */
    #if defined(GX_WIDGET_USER_DATA)
    0,                                       /* user data                      */
    #endif
    GX_STYLE_BORDER_THIN|GX_STYLE_ENABLED,   /* style flags                    */
    GX_STATUS_ACCEPTS_FOCUS,                 /* status flags                   */
    sizeof(WINDOW_CONTROL_BLOCK),            /* control block size             */
    GX_COLOR_ID_WINDOW_FILL,                 /* normal color id                */
    GX_COLOR_ID_WINDOW_FILL,                 /* selected color id              */
    GX_COLOR_ID_DISABLED_FILL,               /* disabled color id              */
    gx_studio_window_create,                 /* create function                */
    GX_NULL,                                 /* drawing function override      */
    GX_NULL,                                 /* event function override        */
    {0, 0, 799, 479},                        /* widget size                    */
    GX_NULL,                                 /* next widget                    */
    &window_prompt_define,                   /* child widget                   */
    0,                                       /* control block                  */
    (void *) &window_properties              /* extended properties            */
};

我們這裡第1個引數要寫window。

  •   第2個引數是根視窗控制程式碼。
  •   第3個引數是新建立視窗控制程式碼。

 

有了這些認識後,再配置就比較簡單了,我們這裡要修改為如下:

  gx_studio_named_widget_create("window", (GX_WIDGET *)root, (GX_WIDGET **)&pScreen);

12.5.4        第4步:修改檔案App_SysFunction.c

針對我們配套的例子模板,不需要修改這個檔案,大家自己做的移植需要根據情況選擇是否修改。針對這個檔案要注意下面幾點:

  •  動態記憶體的分配

主要配置了GUIX動態記憶體的地址和大小以及畫布的地址,大家根據自己的情況做修改即可:

/*
*********************************************************************************************************
*                                            動態記憶體分配
*********************************************************************************************************
*/
#define       GUI_NUMBYTES     1024*1024*8                         /* 設定動態記憶體大小 */
#define       Canvas_Memory    0xC0400000                          /* 設定Canvas地址   */
TX_BYTE_POOL  memory_pool;
uint8_t       *MemoryBlock = (uint8_t *)(0xC0000000 + 1024*1024*8); /* 動態記憶體地址    */

動態記憶體設定的地址:0xC0000000 + 1024*1024*8, 大小8MB。

canvas畫布地址:0xC0400000, 大小4MB,實際沒有使用這麼大,以我們本次GUIX Studio生成的程式碼為例,實際大小在guiapp_specifications.c檔案裡面定義:

GX_STUDIO_DISPLAY_INFO guiapp_display_table[1] =
{
    {
    "display_1",
    "display_1_canvas",
    display_1_theme_table,
    display_1_language_table,
    DISPLAY_1_THEME_TABLE_SIZE,
    DISPLAY_1_LANGUAGE_TABLE_SIZE,
    DISPLAY_1_STRING_TABLE_SIZE,
    800,                                     /* x resolution                   */
    480,                                     /* y resolution                   */
    &display_1_control_block,
    &display_1_canvas_control_block,
    &display_1_root_window,
    GX_NULL,                                 /* canvas memory area             */
    768000                                   /* canvas memory size in bytes    */
    }
};

實際需要768000位元組。我們這裡留出冗餘是為了以後多畫布使用。大家可以根據實際需要做修改。

  •   結構體guiapp_display_table

為了方便設定畫布,將guiapp_specifications.c檔案裡面結構體guiapp_display_table放到了此檔案裡面引用,大家根據自己的定義做修改。

/*
*********************************************************************************************************
*                                            變數
*********************************************************************************************************
*/
extern GX_STUDIO_DISPLAY_INFO guiapp_display_table[1];
  •   自適應不同解析度螢幕

我們的螢幕有4.3寸,5寸和7寸,解析度主要有兩類480*272和800*480。為了讓800*480解析度下實現的介面在480*272下也可以使用,這裡做了一個簡單的自適應,即800*480下設計的內容都在480*272解析度範圍內,那麼在兩個解析度下都是可以正常顯示的。

/*
*********************************************************************************************************
*    函 數 名: gx_initconfig
*    功能說明: GUIX
*    形    參: 無       
*    返 回 值: 無
*********************************************************************************************************
*/
void gx_initconfig(void) 
{
    /* 省略未寫 */
    
    /* 自適應不同解析度螢幕 */
    switch (g_LcdType)
    {
        
        case LCD_43_480X272:        /* 4.3寸 480 * 272 */    
        case LCD_50_480X272:        /* 5.0寸 480 * 272 */
            guiapp_display_table[0].x_resolution = 480;
            guiapp_display_table[0].y_resolution = 272;
            break;
        
        case LCD_50_800X480:        /* 5.0寸 800 * 480 */
        case LCD_70_800X480:        /* 7.0寸 800 * 480 */    
            guiapp_display_table[0].x_resolution = 800;
            guiapp_display_table[0].y_resolution = 480;
            break;
        
        default:    
            break;
    }
}
  •   畫布地址空間

畫布地址設定放在了函式gx_initconfig末尾。

/*
*********************************************************************************************************
*    函 數 名: gx_initconfig
*    功能說明: GUIX
*    形    參: 無       
*    返 回 值: 無
*********************************************************************************************************
*/
void gx_initconfig(void) 
{
    /* 省略未寫 */
    
    guiapp_display_table[0].canvas_memory = (GX_COLOR *)Canvas_Memory;
}

12.5.5        第5步:編譯執行

通過前面四步就完成了GUIX Studio生成程式碼移植到IAR,然後大家編譯執行即可。這裡特別注意一點,如果大家測試遇到更新了GUIX Studio生成的程式碼,但是實際板子執行效果沒有變化,此時就需要大家開啟GUIX Studio生成的每個C檔案單獨編譯,然後全編譯即可。

12.6 GUIX Studio生成檔案移植到Embedded Studio

移植到Embedded Studio和移植到MDK與IAR基本是一樣的。

12.6.1        第1步:新增生成的檔案到工程裡

工程模板使用前面章節制作的例子V6-2005_GUIX Template(RG565)。開啟路徑:\User\guix,將此檔案裡面的如下四個檔案刪掉:

然後將我們新制作的這四個檔案新增進去,開啟工程後,效果如下:

由於新作的GUIX Studio工程名是guiapp,與此例子之前使用的GUI Studio模板名一樣,所以直接替換即可,如果大家建立的工程名不一致,需要大家手動刪掉之前的,並新增新生成的檔案。

12.6.2        第2步:修改gx_studio_display_configure形參

此函式的實現在guiapp_specifications.c檔案裡面,GUIX Studio自動生成的,無需使用者管,使用者要做就是填對引數即可:

UINT gx_studio_display_configure(USHORT display, UINT (*driver)(GX_DISPLAY *),
    GX_UBYTE language, USHORT theme, GX_WINDOW_ROOT **return_root)
{
    GX_CONST GX_THEME *theme_ptr;
    GX_RECTANGLE size;

    GX_STUDIO_DISPLAY_INFO *display_info = &guiapp_display_table[display];


/* 建立顯示區 */
    gx_display_create(display_info->display,
                      display_info->name,
                      driver,
                      (GX_VALUE) display_info->x_resolution,
                      (GX_VALUE) display_info->y_resolution);

/* 安裝主題 */
    if(display_info->theme_table)
    {
        theme_ptr = display_info->theme_table[theme];
        if(theme_ptr)
        {
            gx_display_color_table_set(display_info->display, theme_ptr->theme_color_table,
 theme_ptr->theme_color_table_size);
            
/* 安裝顏色板 */
            if (display_info->display->gx_display_driver_palette_set &&
                theme_ptr->theme_palette != NULL)
            {
                display_info->display->gx_display_driver_palette_set(display_info->display,
 theme_ptr->theme_palette, theme_ptr->theme_palette_size);
            }

            gx_display_font_table_set(display_info->display, theme_ptr->theme_font_table,
 theme_ptr->theme_font_table_size);
            gx_display_pixelmap_table_set(display_info->display, theme_ptr->theme_pixelmap_table,
 theme_ptr->theme_pixelmap_table_size);
            gx_system_scroll_appearance_set(theme_ptr->theme_vertical_scroll_style,
 (GX_SCROLLBAR_APPEARANCE *) &theme_ptr->theme_vertical_scrollbar_appearance);
            gx_system_scroll_appearance_set(theme_ptr->theme_horizontal_scroll_style,
 (GX_SCROLLBAR_APPEARANCE *) &theme_ptr->theme_horizontal_scrollbar_appearance);
            gx_display_language_table_set_ext(display_info->display, display_info->language_table, 
(GX_UBYTE) display_info->language_table_size, display_info->string_table_size);
            gx_display_active_language_set(display_info->display, language);
        }
    }


/* 建立畫布 */
    gx_canvas_create(display_info->canvas,
                     display_info->canvas_name,
                     display_info->display,
                     GX_CANVAS_MANAGED | GX_CANVAS_VISIBLE,
                     display_info->x_resolution,
                     display_info->y_resolution,
                     display_info->canvas_memory,
                     display_info->canvas_memory_size);

/* 建立畫布對應的根視窗 */
    gx_utility_rectangle_define(&size,
                                0, 0,
                                (GX_VALUE) (display_info->x_resolution - 1),
                                (GX_VALUE) (display_info->y_resolution - 1));

    gx_window_root_create(display_info->root_window,
                          display_info->name,
                          display_info->canvas, GX_STYLE_NONE, 0, &size);
    if (return_root)
    {
        *return_root = display_info->root_window;
    }
    return GX_SUCCESS;
}
  •   第1個引數是螢幕索引,如果是GUIX Studio配置的第1個螢幕,此處填0,如果是配置的第2個螢幕,此處填1,以此類推。對應的索引巨集定義已經在GUIX Studio生成的guiapp_resources.h檔案裡面定義,大家可以直接呼叫。
/* Display and theme definitions */
#define DISPLAY_1 0
#define DISPLAY_1_COLOR_FORMAT GX_COLOR_FORMAT_565RGB
#define DISPLAY_1_X_RESOLUTION 800
#define DISPLAY_1_Y_RESOLUTION 480
#define DISPLAY_1_THEME_1 0
#define DISPLAY_1_THEME_TABLE_SIZE 1
  •   第2個引數是螢幕底層驅動介面函式,此介面函式的函式名可以隨意定義,比如我們這裡的RGB565顏色格式採用的函式stm32h7_graphics_driver_setup_565rgb。
  •   第3個引數語言ID,這個引數是在GUIX Studio生成的guiapp_resources.h檔案裡面定義,如果大家定義了多國語言,此檔案裡面會有多個ID巨集定義供大家使用。我們前面GUIX Studio工程僅使用了英文,所以這裡只能填LANGUAGE_ENGLISH。
/* Language definitions */
#define LANGUAGE_ENGLISH 0
#define DISPLAY_1_LANGUAGE_TABLE_SIZE 1
  •   第4個引數是介面主題索引,這個引數也是在GUIX Studio生成的guiapp_resources.h檔案裡面定義,一個介面可以有多個主題,使用那個主題,填對應的巨集定義即可:
#define DISPLAY_1_X_RESOLUTION 800
#define DISPLAY_1_Y_RESOLUTION 480
#define DISPLAY_1_THEME_1 0
#define DISPLAY_1_THEME_TABLE_SIZE 1
  •   第5個引數是根視窗控制程式碼。

 

有了這些認識後,再配置就比較簡單了,我們這裡要修改為如下:

gx_studio_display_configure(DISPLAY_1, stm32h7_graphics_driver_setup_565rgb,
        LANGUAGE_ENGLISH, DISPLAY_1_THEME_1, &root);

12.6.3        第3步:修改gx_studio_named_widget_create形參

此函式的實現也在guiapp_specifications.c檔案裡面,GUIX Studio自動生成的,無需使用者管,使用者要做就是填對引數即可,特別是第1個引數:

UINT gx_studio_named_widget_create(char *name, GX_WIDGET *parent, GX_WIDGET **new_widget)
{
    UINT status = GX_FAILURE;
    GX_CONST GX_STUDIO_WIDGET_ENTRY *entry = guiapp_widget_table;
    GX_WIDGET *widget = GX_NULL;

    while(entry->widget_information)
    {
        if (!strcmp(name, entry->widget_information->widget_name))
        {
            widget = gx_studio_widget_create((GX_BYTE *) entry->widget, entry->widget_information, parent);
            if (widget)
            {
                status = GX_SUCCESS;
            }
            break;
        }
        entry++;
    }

    if (new_widget)
    {
        *new_widget = widget;
    }
    return status;
}
  •   第1個引數比較重要,不是隨便寫的,因為此函式裡面的strcmp會做比較匹配,檢視此視窗名是否存在。大家要填的這個引數在檔案guiapp_specifications.c的xxxx__widget_table裡面定義,對應我們前面GUIX Studio生成的程式碼就是guiapp_widget_table,我們這裡僅有一個window_define:
GX_CONST GX_STUDIO_WIDGET_ENTRY guiapp_widget_table[] =
{
    { &window_define, (GX_WIDGET *) &window },
    {GX_NULL, GX_NULL}
};
GX_CONST GX_STUDIO_WIDGET window_define =
{
    "window",
    GX_TYPE_WINDOW,                          /* widget type                    */
    GUIX_ID_WINDOW0,                         /* widget id                      */
    #if defined(GX_WIDGET_USER_DATA)
    0,                                       /* user data                      */
    #endif
    GX_STYLE_BORDER_THIN|GX_STYLE_ENABLED,   /* style flags                    */
    GX_STATUS_ACCEPTS_FOCUS,                 /* status flags                   */
    sizeof(WINDOW_CONTROL_BLOCK),            /* control block size             */
    GX_COLOR_ID_WINDOW_FILL,                 /* normal color id                */
    GX_COLOR_ID_WINDOW_FILL,                 /* selected color id              */
    GX_COLOR_ID_DISABLED_FILL,               /* disabled color id              */
    gx_studio_window_create,                 /* create function                */
    GX_NULL,                                 /* drawing function override      */
    GX_NULL,                                 /* event function override        */
    {0, 0, 799, 479},                        /* widget size                    */
    GX_NULL,                                 /* next widget                    */
    &window_prompt_define,                   /* child widget                   */
    0,                                       /* control block                  */
    (void *) &window_properties              /* extended properties            */
};

我們這裡第1個引數要寫window。

  •   第2個引數是根視窗控制程式碼。
  •   第3個引數是新建立視窗控制程式碼。

 

有了這些認識後,再配置就比較簡單了,我們這裡要修改為如下:

  gx_studio_named_widget_create("window", (GX_WIDGET *)root, (GX_WIDGET **)&pScreen);

12.6.4        第4步:修改檔案App_SysFunction.c

針對我們配套的例子模板,不需要修改這個檔案,大家自己做的移植需要根據情況選擇是否修改。針對這個檔案要注意下面幾點:

  •   動態記憶體的分配

主要配置了GUIX動態記憶體的地址和大小以及畫布的地址,大家根據自己的情況做修改即可:

/*
*********************************************************************************************************
*                                            動態記憶體分配
*********************************************************************************************************
*/
#define       GUI_NUMBYTES     1024*1024*8                         /* 設定動態記憶體大小 */
#define       Canvas_Memory    0xC0400000                          /* 設定Canvas地址   */
TX_BYTE_POOL  memory_pool;
uint8_t       *MemoryBlock = (uint8_t *)(0xC0000000 + 1024*1024*8); /* 動態記憶體地址    */

動態記憶體設定的地址:0xC0000000 + 1024*1024*8, 大小8MB。

canvas畫布地址:0xC0400000, 大小4MB,實際沒有使用這麼大,以我們本次GUIX Studio生成的程式碼為例,實際大小在guiapp_specifications.c檔案裡面定義:

  •   結構體guiapp_display_table

為了方便設定畫布,將guiapp_specifications.c檔案裡面結構體guiapp_display_table放到了此檔案裡面引用,大家根據自己的定義做修改。

/*
*********************************************************************************************************
*                                            變數
*********************************************************************************************************
*/
extern GX_STUDIO_DISPLAY_INFO guiapp_display_table[1];
  •   自適應不同解析度螢幕

我們的螢幕有4.3寸,5寸和7寸,解析度主要有兩類480*272和800*480。為了讓800*480解析度下實現的介面在480*272下也可以使用,這裡做了一個簡單的自適應,即800*480下設計的內容都在480*272解析度範圍內,那麼在兩個解析度下都是可以正常顯示的。

/*
*********************************************************************************************************
*    函 數 名: gx_initconfig
*    功能說明: GUIX
*    形    參: 無       
*    返 回 值: 無
*********************************************************************************************************
*/
void gx_initconfig(void) 
{
    /* 省略未寫 */
    
    /* 自適應不同解析度螢幕 */
    switch (g_LcdType)
    {
        
        case LCD_43_480X272:        /* 4.3寸 480 * 272 */    
        case LCD_50_480X272:        /* 5.0寸 480 * 272 */
            guiapp_display_table[0].x_resolution = 480;
            guiapp_display_table[0].y_resolution = 272;
            break;
        
        case LCD_50_800X480:        /* 5.0寸 800 * 480 */
        case LCD_70_800X480:        /* 7.0寸 800 * 480 */    
            guiapp_display_table[0].x_resolution = 800;
            guiapp_display_table[0].y_resolution = 480;
            break;
        
        default:    
            break;
    }
}
  •   畫布地址空間

畫布地址設定放在了函式gx_initconfig末尾。

/*
*********************************************************************************************************
*    函 數 名: gx_initconfig
*    功能說明: GUIX
*    形    參: 無       
*    返 回 值: 無
*********************************************************************************************************
*/
void gx_initconfig(void) 
{
    /* 省略未寫 */
    
    guiapp_display_table[0].canvas_memory = (GX_COLOR *)Canvas_Memory;
}

12.6.5        第5步:編譯執行

通過前面四步就完成了GUIX Studio生成程式碼移植到Embedded Studio,然後大家編譯執行即可。這裡特別注意一點,如果大家測試遇到更新了GUIX Studio生成的程式碼,但是實際板子執行效果沒有變化,此時就需要大家開啟GUIX Studio生成的每個C檔案單獨編譯,然後全編譯即可。

12.7 實驗例程

(注,如果是電阻屏,需要做觸控校準,校準方法看本教程附件章節A)

本章節配套了如下兩個例子供大家移植參考:

  •   V7-2009_GUIX Base

GUIX Studio生成的程式碼在硬體平臺實際執行的工程,,含有GCC,IAR,MDK AC5和AC6四個版本工程。

  •   V7-2010_GUIX Studio Base

GUIX Studio工程模板,設計介面後,生成的檔案可直接新增到MDK,IAR和GCC軟體平臺使用。

 

顯示效果如下,800*480解析度:

IAR,MDK AC5和AC6工程可以串列埠列印任務執行情況:按開發板的按鍵K1可以列印,波特率 115200,資料位 8,奇偶校驗位無,停止位 1:

Embedded Studio(GCC)平臺的串列埠列印是通過其除錯元件SEGGER RTT做的串列埠列印,速度也非常快,列印效果如下:

 

展示裡面有亂碼是因為Embedded Studio不支援中文。

12.8 總結

本章節主要為大家講解了GUIX Studio生成的工程移植到硬體平臺的方法,有幾處比較重要的注意事項,都在帖子裡面為大家做了說明,建議大家實際操作一遍,加深理解。

 

相關文章