老牌ucGUI与ucOS II一样的历史悠久,好笑的是我竟然没用过,,,
移植以TNeo操作系统为例,对ucGUI v3.98移植细节进行相关记录,以达到快速入门目的。
go go go!!下载好的ucGUI如下:
在上图 “删除后”中,我们进入Sample文件夹,如下图:
其他文件, 应该有也参考价值,但大家伙都是使用GUI_X,这次也随主流吧!
然后再进入Start文件夹,如下图:
以上就是整理后的ucGUI了,已保留了GUI主要框架。
现在假设已经把所有的文件.C和.H全部加入到了你的工程里,当前我用Embedded Studio开发STM32.
下面是一些要改动具体文件,以TNeo进行移植。
第1个为uC-GUI\Start\Config,如下图:
我们先移植LCD屏,触摸面板先不移植,请不要删除上图 Touch,在配置项关掉它就可以了。每一个宏的作用
可以去查网上查阅信息,最好先看看“UCGUI中文手册”,结合你用的LCD显示屏进行配置,这里不要配置错就行了
第2个为uC-GUI\Start\GUI下的文件:
打开LCDDriver文件,里面有LCDMem.c、LCDNull.c、LCDTemplate.c,LCDWin.c
先进入Config文件夹内对LCDConf.h进行配置如下:
#define LCD_CONTROLLER -1 // 使用LCDTemplate.c这份文件
这样就选定了LCDTemplate.c这个驱动文件了,要实现对应的俩个函数:
void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) //描点函数
unsigned int LCD_L0_GetPixelIndex(int x, int y) //读点函数
/********************************************************************* * * Exported functions * ********************************************************************** */ //-- SPI屏,芯片R61505V #include "spi.h" /********************************************************************* * * LCD_L0_SetPixelIndex * 描点 * Purpose: * Sets the index of the given pixel. The upper layers * calling this routine make sure that the coordinates are in range, so * that no check on the parameters needs to be performed. */ void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) { //GUI_USE_PARA(x); //-- 原来的 //GUI_USE_PARA(y); //GUI_USE_PARA(PixelIndex); /* Convert logical into physical coordinates (Dep. on LCDConf.h) */ #if LCD_SWAP_XY | LCD_MIRROR_X| LCD_MIRROR_Y int xPhys = LOG2PHYS_X(x, y); int yPhys = LOG2PHYS_Y(x, y); #else #define xPhys x #define yPhys y #endif /* Write into hardware ... Adapt to your system */ { /* ... */ DrawPixel(xPhys, yPhys, PixelIndex); // 现有测试SPI屏 } }
找LCD屏厂商,要一份LCD屏基础驱动,通常会有描点函数或读点函数,上面代码DrawPixel(xPhys, yPhys, PixelIndex);是我当前LCD屏描点。
对原文GUI_USE_PARA建意全部注释它,它们没有价值的,有时还会出错!!现在,有描点就可以进行显示些内容了。
第3个为uC-GUI\Sample\GUI_X如下的文件:
我们使用GUI_X.c文件,不过在开始之前,先进入uC-GUI\Start\Config下打开GUIConf.h文件配置一下:
/* ********************************************************************************************************* * uC/GUI V3.98 * Universal graphic software for embedded applications * * (c) Copyright 2002, Micrium Inc., Weston, FL * (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH * * µC/GUI is protected by international copyright laws. Knowledge of the * source code may not be used to write a similar product. This file may * only be used in accordance with a license and should not be redistributed * in any way. We appreciate your understanding and fairness. * ---------------------------------------------------------------------- File : GUIConf.h Purpose : Configures abilities, fonts etc. 为1时激活 ---------------------------------------------------------------------- */ #ifndef GUICONF_H #define GUICONF_H #define GUI_OS (0) /* 编译时支持多任务处理 */ #define GUI_SUPPORT_TOUCH (0) /* 支持触摸屏 */ #define GUI_SUPPORT_MOUSE (0) /* 支持鼠标 */ #define GUI_SUPPORT_UNICODE (1) /* 支持ASCII/UNICODE混合字符串 */ #define GUI_DEFAULT_FONT &GUI_Font8x16 //-- 系统字体 #define GUI_ALLOC_SIZE 12500 /* 动态内存的大小... 对于WM和内存设备,单位? */ /*-******************************************************************** * * 配置可用的软件包 */ #define GUI_WINSUPPORT 0 /* 可用的窗口管理器软件包 */ #define GUI_SUPPORT_MEMDEV 0 /* 可用的存储设备 */ #define GUI_SUPPORT_AA 0 /* 有抗锯齿功能 */ #endif /* Avoid multiple inclusion */
上面define时GUI_OS为0,则不使用操作系统,对应的文件就是GUI_X.c,其实我会变相的使用TNeo操作系统,哈哈
现在对GUI_X.c进行编写,如下图:
/* ********************************************************************************************************* * uC/GUI V3.98 * Universal graphic software for embedded applications * * (c) Copyright 2002, Micrium Inc., Weston, FL * (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH * * �C/GUI is protected by international copyright laws. Knowledge of the * source code may not be used to write a similar product. This file may * only be used in accordance with a license and should not be redistributed * in any way. We appreciate your understanding and fairness. * ---------------------------------------------------------------------- File : GUI_X.C Purpose : Config / System dependent externals for GUI ---------------------------END-OF-HEADER------------------------------ */ #include "tn.h" // 用到tn_task_sleep(xx);函数 #include "GUI.h" #include "GUI_X.h" /********************************************************************* * * Global data */ volatile int OS_TimeMS; /********************************************************************* * * Timing: * GUI_X_GetTime() * GUI_X_Delay(int) Some timing dependent routines require a GetTime and delay function. Default time unit (tick), normally is 1 ms. */ int GUI_X_GetTime(void) { OS_TimeMS = tn_sys_time_get(); // TN的TICK计数器 return OS_TimeMS; } void GUI_X_Delay(int ms) { //int tEnd = OS_TimeMS + ms; //while ((tEnd - OS_TimeMS) > 0); tn_task_sleep(ms); // // TN的系统廷时 } /********************************************************************* * * GUI_X_Init() * * Note: * GUI_X_Init() is called from GUI_Init is a possibility to init * some hardware which needs to be up and running before the GUI. * If not required, leave this routine blank. */ void GUI_X_Init(void) {} /********************************************************************* * * GUI_X_ExecIdle * * Note: * Called if WM is in idle state */ void GUI_X_ExecIdle(void) {tn_task_sleep(1);} /********************************************************************* * * Logging: OS dependent Note: Logging is used in higher debug levels only. The typical target build does not use logging and does therefor not require any of the logging routines below. For a release build without logging the routines below may be eliminated to save some space. (If the linker is not function aware and eliminates unreferenced functions automatically) */ void GUI_X_Log (const char *s) { GUI_USE_PARA(s); } void GUI_X_Warn (const char *s) { GUI_USE_PARA(s); } void GUI_X_ErrorOut(const char *s) { GUI_USE_PARA(s); }
哈哈,这里把TNeo套路进去了吧?
还有一些其他细节,我是SPI接口的LCD屏,先要对STM32的SPI外设进行初始化的,我是放在这里:
还有一个就是LCD屏的初始化,是放在LCDTemplate.c的,这里我没有使用GUIConf.h宏定义,直接放进LCDTemplate.c:
/********************************************************************* * * LCD_L0_Init * * Purpose: * Initialises the LCD-controller. */ int LCD_L0_Init(void) { //LCD_INIT_CONTROLLER();//--GUI原来的 Lcd_Initialize(); //-- SPI_LCD初始化 return 0; }
如何让GUI实时更新呢?资料显示是定期调用GUI_Exec();
我呢就直接放在TNeo空闲函数里,有什么不可以的??
//-- 空闲回调,从空闲任务中定期调用 void idle_task_callback (void) { GUI_Exec(); // 让GUI更新屏,触面板也可以放在这里 }
最后用OS的任务,让ucGUI打印一串字符:
void task_d_body(void *par) { printf("New task d is OK!\n"); for(;;) { GUI_DispStringAt("hello,I am ucGUI!!!",5,5); tn_task_sleep(500); } }
在线仿真如下图:
这一套操作下来以后,也试了一下横屏与坚屏的功能,发现也是正常的:
LCDConf.h坚屏参数:
/*-******************************************************************** * * General configuration of LCD * ********************************************************************** */ #define LCD_XSIZE (240) /* X-resolution of LCD, Logical coor. */ #define LCD_YSIZE (320) /* Y-resolution of LCD, Logical coor. */ #define LCD_BITSPERPIXEL (16) // 16bit RGB565 #define LCD_CONTROLLER -1 // 使用LCDTemplate.c这份文件 #define LCD_SWAP_RB 1 // RGB的红色 蓝色对换 #define LCD_SWAP_XY (1) /* 由横屏变成竖屏 */ #define LCD_MIRROR_Y (0) #define LCD_MIRROR_X (1)
实物效果:
LCDConf.h横屏参数:
#define LCD_XSIZE (324) /* X-resolution of LCD, Logical coor. */ #define LCD_YSIZE (240) /* Y-resolution of LCD, Logical coor. */ #define LCD_BITSPERPIXEL (16) // 16bit RGB565 #define LCD_CONTROLLER -1 // 使用LCDTemplate.c这份文件 #define LCD_SWAP_RB 1 // RGB的红色 蓝色对换 #define LCD_SWAP_XY (0) /* 由横屏变成竖屏 */ #define LCD_MIRROR_Y (0) #define LCD_MIRROR_X (0) #define LCD_REVERSE (0) // 翻转颜色,比如白色变黑色等等
实物效果:
到此为止已经打开了ucGUI的大门了,再见!
=== END ===