最新教程下載:http://www.armbbs.cn/forum.php?mod=viewthread&tid=98429php
本章節爲你們講解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
第11章講解了GUIX Studio的使用方法,並製做了一個GUIX Studio的簡單Demo。咱們這裏直接使用這個Demo:
點擊GUIX Studio左上角的Project –>Generate All Output Files:
彈出以下界面:
一、用於選擇導出那些內容,默認是所有導出,建議所有導出,防止沒必要要的麻煩。
二、若是勾上覆選框,會多出來一個編輯框,能夠設置生成的資源文件名:
三、若是勾上binary mode,表示生成的資源文件使用二進制模式。
表示資源文件後綴採用srec,此設置模式下還能夠設置偏移地址
表示資源文件後綴採用bin。
四、若是勾上覆選框,表示生成資源頭文件,取消表示不生成。
瞭解了這些配置選項後,再設置就比較容易理解了,當前咱們這裏所有生成源文件,帶資源文件頭,具體配置以下:
設置完畢後,點擊右下角的Generate按鈕就能夠生成文件了,點擊後彈出以下對話框,表示生成成功:
生成的文件就在你們建立GUIX Studio工程時指定的文件裏面,生成的文件以下:
這兩個文件主要用於字庫,圖庫等資源。
這兩個文件是基於GUIX API新封裝的一些函數,方便用戶調用。
這裏分步爲你們詳細說明:
工程模板使用前面章節制做的例子V7-2005_GUIX Template(RG565)。打開路徑:\User\guix,將此文件裏面的以下四個文件刪掉:
而後將咱們新制做的這四個文件添加進去,打開工程後,效果以下:
因爲新做的GUIX Studio工程名是guiapp,與此例子以前使用的GUI Studio模板名同樣,因此直接替換便可,若是你們建立的工程名不一致,須要你們手動刪掉以前的,並添加新生成的文件。
此函數的實如今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; }
/* 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
/* Language definitions */ #define LANGUAGE_ENGLISH 0 #define DISPLAY_1_LANGUAGE_TABLE_SIZE 1
#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
有了這些認識後,再配置就比較簡單了,咱們這裏要修改成以下:
gx_studio_display_configure(DISPLAY_1, stm32h7_graphics_driver_setup_565rgb,
LANGUAGE_ENGLISH, DISPLAY_1_THEME_1, &root);
此函數的實現也在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; }
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。
有了這些認識後,再配置就比較簡單了,咱們這裏要修改成以下:
gx_studio_named_widget_create("window", (GX_WIDGET *)root, (GX_WIDGET **)&pScreen);
針對咱們配套的例子模板,不須要修改這個文件,你們本身作的移植須要根據狀況選擇是否修改。針對這個文件要注意下面幾點:
主要配置了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_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; }
經過前面四步就完成了GUIX Studio生成代碼移植到MDK AC5,而後你們編譯運行便可。這裏特別注意一點,若是你們測試遇到更新了GUIX Studio生成的代碼,可是實際板子運行效果沒有變化,此時就須要你們打開GUIX Studio生成的每一個C文件單獨編譯,而後全編譯便可。
移植到MDK AC5和AC6基本是同樣的。
工程模板使用前面章節制做的例子V7-2005_GUIX Template(RG565)。打開路徑:\User\guix,將此文件裏面的以下四個文件刪掉:
而後將咱們新制做的這四個文件添加進去,打開工程後,效果以下:
因爲新做的GUIX Studio工程名是guiapp,與此例子以前使用的GUI Studio模板名同樣,因此直接替換便可,若是你們建立的工程名不一致,須要你們手動刪掉以前的,並添加新生成的文件。
此函數的實如今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; }
/* 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
/* Language definitions */ #define LANGUAGE_ENGLISH 0 #define DISPLAY_1_LANGUAGE_TABLE_SIZE 1
#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
有了這些認識後,再配置就比較簡單了,咱們這裏要修改成以下:
gx_studio_display_configure(DISPLAY_1, stm32h7_graphics_driver_setup_565rgb,
LANGUAGE_ENGLISH, DISPLAY_1_THEME_1, &root);
此函數的實現也在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; }
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。
有了這些認識後,再配置就比較簡單了,咱們這裏要修改成以下:
gx_studio_named_widget_create("window", (GX_WIDGET *)root, (GX_WIDGET **)&pScreen);
針對咱們配套的例子模板,不須要修改這個文件,你們本身作的移植須要根據狀況選擇是否修改。針對這個文件要注意下面幾點:
主要配置了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_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; }
經過前面四步就完成了GUIX Studio生成代碼移植到MDK AC6,而後你們編譯運行便可。這裏特別注意一點,若是你們測試遇到更新了GUIX Studio生成的代碼,可是實際板子運行效果沒有變化,此時就須要你們打開GUIX Studio生成的每一個C文件單獨編譯,而後全編譯便可。
移植到IAR與移植的MDK基本是同樣的。
工程模板使用前面章節制做的例子V7-2005_GUIX Template(RG565)。打開路徑:\User\guix,將此文件裏面的以下四個文件刪掉:
而後將咱們新制做的這四個文件添加進去,打開工程後,效果以下:
因爲新做的GUIX Studio工程名是guiapp,與此例子以前使用的GUI Studio模板名同樣,因此直接替換便可,若是你們建立的工程名不一致,須要你們手動刪掉以前的,並添加新生成的文件。
此函數的實如今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; }
/* 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
/* Language definitions */ #define LANGUAGE_ENGLISH 0 #define DISPLAY_1_LANGUAGE_TABLE_SIZE 1
#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
有了這些認識後,再配置就比較簡單了,咱們這裏要修改成以下:
gx_studio_display_configure(DISPLAY_1, stm32h7_graphics_driver_setup_565rgb,
LANGUAGE_ENGLISH, DISPLAY_1_THEME_1, &root);
此函數的實現也在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; }
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。
有了這些認識後,再配置就比較簡單了,咱們這裏要修改成以下:
gx_studio_named_widget_create("window", (GX_WIDGET *)root, (GX_WIDGET **)&pScreen);
針對咱們配套的例子模板,不須要修改這個文件,你們本身作的移植須要根據狀況選擇是否修改。針對這個文件要注意下面幾點:
主要配置了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_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; }
經過前面四步就完成了GUIX Studio生成代碼移植到IAR,而後你們編譯運行便可。這裏特別注意一點,若是你們測試遇到更新了GUIX Studio生成的代碼,可是實際板子運行效果沒有變化,此時就須要你們打開GUIX Studio生成的每一個C文件單獨編譯,而後全編譯便可。
移植到Embedded Studio和移植到MDK與IAR基本是同樣的。
工程模板使用前面章節制做的例子V7-2005_GUIX Template(RG565)。打開路徑:\User\guix,將此文件裏面的以下四個文件刪掉:
而後將咱們新制做的這四個文件添加進去,打開工程後,效果以下:
因爲新做的GUIX Studio工程名是guiapp,與此例子以前使用的GUI Studio模板名同樣,因此直接替換便可,若是你們建立的工程名不一致,須要你們手動刪掉以前的,並添加新生成的文件。
此函數的實如今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; }
/* 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
/* Language definitions */ #define LANGUAGE_ENGLISH 0 #define DISPLAY_1_LANGUAGE_TABLE_SIZE 1
#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
有了這些認識後,再配置就比較簡單了,咱們這裏要修改成以下:
gx_studio_display_configure(DISPLAY_1, stm32h7_graphics_driver_setup_565rgb,
LANGUAGE_ENGLISH, DISPLAY_1_THEME_1, &root);
此函數的實現也在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; }
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。
有了這些認識後,再配置就比較簡單了,咱們這裏要修改成以下:
gx_studio_named_widget_create("window", (GX_WIDGET *)root, (GX_WIDGET **)&pScreen);
針對咱們配套的例子模板,不須要修改這個文件,你們本身作的移植須要根據狀況選擇是否修改。針對這個文件要注意下面幾點:
主要配置了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_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; }
經過前面四步就完成了GUIX Studio生成代碼移植到Embedded Studio,而後你們編譯運行便可。這裏特別注意一點,若是你們測試遇到更新了GUIX Studio生成的代碼,可是實際板子運行效果沒有變化,此時就須要你們打開GUIX Studio生成的每一個C文件單獨編譯,而後全編譯便可。
(注,若是是電阻屏,須要作觸摸校準,校準方法看本教程附件章節A)
本章節配套了以下兩個例子供你們移植參考:
GUIX Studio生成的代碼在硬件平臺實際運行的工程,,含有GCC,IAR,MDK AC5和AC6四個版本工程。
GUIX Studio工程模板,設計界面後,生成的文件可直接添加到MDK,IAR和GCC軟件平臺使用。
顯示效果以下,800*480分辨率:
IAR,MDK AC5和AC6工程能夠串口打印任務執行狀況:按開發板的按鍵K1能夠打印,波特率 115200,數據位 8,奇偶校驗位無,中止位 1:
Embedded Studio(GCC)平臺的串口打印是經過其調試組件SEGGER RTT作的串口打印,速度也很是快,打印效果以下:
展現裏面有亂碼是由於Embedded Studio不支持中文。
本章節主要爲你們講解了GUIX Studio生成的工程移植到硬件平臺的方法,有幾處比較重要的注意事項,都在帖子裏面爲你們作了說明,建議你們實際操做一遍,加深理解。