【STM32H7】第12章 GUIX Studio生成代碼移植到硬件平臺

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

第12章       GUIX Studio生成代碼移植到硬件平臺

本章節爲你們講解GUIX Studio生成的代碼移植到硬件平臺的方法canvas

12.1初學者重要提示app

12.2 GUIX Studio生成代碼文件ide

12.3 GUIX Studio生成文件移植到MDK AC5函數

12.4 GUIX Studio生成文件移植到MDK AC6測試

12.5 GUIX Studio生成文件移植到IARui

12.6 GUIX Studio生成文件移植到Embedded Studiospa

12.7實驗例程設計

12.8 總結3d

 

 

12.1 初學者重要提示

  1.  移植GUIX Studio生成的代碼到硬件平臺有好幾處須要注意的地方,你們移植的時候必定要注意,本章教程也進行了詳細說明。

12.2 GUIX Studio生成代碼文件

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

 

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

 

彈出以下界面:

 

一、用於選擇導出那些內容,默認是所有導出,建議所有導出,防止沒必要要的麻煩。

二、若是勾上覆選框,會多出來一個編輯框,能夠設置生成的資源文件名:

 

三、若是勾上binary mode,表示生成的資源文件使用二進制模式。

  •   選擇S-Record

表示資源文件後綴採用srec,此設置模式下還能夠設置偏移地址

 

  •   選擇Binary

表示資源文件後綴採用bin。

四、若是勾上覆選框,表示生成資源頭文件,取消表示不生成。

 

瞭解了這些配置選項後,再設置就比較容易理解了,當前咱們這裏所有生成源文件,帶資源文件頭,具體配置以下:

 

設置完畢後,點擊右下角的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步:添加生成的文件到工程裏

工程模板使用前面章節制做的例子V7-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顏色格式採用的函數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.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*24                           /* 設置動態內存大小 */
#define       Canvas_Memory    0xC0400000                             /* 設置Canvas地址   */
TX_BYTE_POOL  memory_pool;
uint8_t       *MemoryBlock = (uint8_t *)(0xC0000000 + 1024*1024*8); /* 動態內存地址    */

動態內存設置的地址:0xC0000000 + 1024*1024*8, 大小24MB。

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步:添加生成的文件到工程裏

工程模板使用前面章節制做的例子V7-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*24                           /* 設置動態內存大小 */
#define       Canvas_Memory    0xC0400000                             /* 設置Canvas地址   */
TX_BYTE_POOL  memory_pool;
uint8_t       *MemoryBlock = (uint8_t *)(0xC0000000 + 1024*1024*8); /* 動態內存地址    */

動態內存設置的地址:0xC0000000 + 1024*1024*8, 大小24MB。

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步:添加生成的文件到工程裏

工程模板使用前面章節制做的例子V7-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*24                           /* 設置動態內存大小 */
#define       Canvas_Memory    0xC0400000                             /* 設置Canvas地址   */
TX_BYTE_POOL  memory_pool;
uint8_t       *MemoryBlock = (uint8_t *)(0xC0000000 + 1024*1024*8); /* 動態內存地址    */

動態內存設置的地址:0xC0000000 + 1024*1024*8, 大小24MB。

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步:添加生成的文件到工程裏

工程模板使用前面章節制做的例子V7-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*24                           /* 設置動態內存大小 */
#define       Canvas_Memory    0xC0400000                             /* 設置Canvas地址   */
TX_BYTE_POOL  memory_pool;
uint8_t       *MemoryBlock = (uint8_t *)(0xC0000000 + 1024*1024*8); /* 動態內存地址    */

動態內存設置的地址:0xC0000000 + 1024*1024*8, 大小24MB。

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.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生成的工程移植到硬件平臺的方法,有幾處比較重要的注意事項,都在帖子裏面爲你們作了說明,建議你們實際操做一遍,加深理解。

相關文章
相關標籤/搜索