当前位置:首页 >> 单片机入门 >> STM32如何移植uCGUI,看这里!

STM32如何移植uCGUI,看这里!

STM32 uCGUI移植 单片机 作者:admin 来源:不详 发布时间:2018-05-18 21:24:45   浏览:17

第一部分:在UCGUI移植之前

在移植之前,首先要了解在网上下的UCGUI 3.98源码的文件结构是。

UCGUI 3.98源码中有三个文件夹:

1)“tool文件夹”是用来使用一些uCgui的上位机程序,基本都是字体和模板查看之类的.

2)“sample文件夹”下面是已经别人帮你写好了很多有用的东西,像跟操作系统有关的GUI_X或者一些模板(后面我们会用到的自己定义的Demo),或者是gui配置.后面再一一详细叙说这个文件夹的功能.

3)“Start文件夹”里面,这是我们最主要的文件夹.里面就包含了uCGUI的源代码,uCGUI的作者把源代码放进vc里面进行编译了(当然,这是用标准C语言写的程序,所以我们可以放在任何c语言平台下编译而不会担心兼容性问题,这个uCGUI在这方面做的算是完美了),所以,我们可以在vc平台下写界面,然后再把代码拷进我们的下位机编译器进行编译,这样子效率就会非常高了。

Start文件夹”目录内容:

Config,配置文件;

GUI/AntiAlias,抗锯齿支持;

GUI/ConvertMono,用于B/W(黑白两色)及灰度显示的色彩转换程序;

GUI/ConvertColor,用于彩色显示的色彩转换的程序;

GUI/Core μC/GUI,内核文件;

GUI/Font,字体文件;

GUI/LCDDriver,LCD 驱动;

GUI/Mendev,存储器件支持;

GUI/Touch,触摸屏支持;

GUI/Widget,视窗控件库;

GUI/WM,视窗管理器;

移植uC/GUI主要集中在修改三个头文件和两个C文件:

三个头文件都在\Config下,分别是GUICon.h ,GUITouchConf.h,LCDConf.h ;

两个C文件一个是GUI_X.C(Sample\GUI_X.C),另外一个在GUI\LCDDriver目录下(LCDWin.c)。

第二部分:修改配置文件GUICon.h ,GUITouchConf.h,LCDConf.h

在“Start文件夹”里有两个文件夹里的内容,使我们移植所关心的。一个是CONFIG , 另一个是\GUI\LCDDriver。

在CONFIG文件夹中有三个.h文件,GUIConf.h、

CONFIG:

配置LCDConf.h文件如下:

#ifndef LCDCONF_H

#define LCDCONF_H

#define LCD_XSIZE (160) //配置TFT的水平分辨率

#define LCD_YSIZE (128) //配置TFT的垂直分辨率

#define LCD_CONTROLLER (54124) //TFT控制器的名称

#define LCD_BITSPERPIXEL (16) //每个像素的位数

#define LCD_FIXEDPALETTE (565) //调色板格式

#define LCD_SWAP_RB (0) //红蓝反色交换

#define LCD_INIT_CONTROLLER() TFT_Init() ; //此处需要定义的是你的TFT初始化函数

#endif /* LCDCONF_H */

配置GUIConf.h文件如下:

#ifndef GUICONF_H

#define GUICONF_H

#define GUI_OS (1) //多任务

#define GUI_SUPPORT_TOUCH (0) //触摸

#define GUI_SUPPORT_UNICODE (1) //Unicode支持

#define GUI_DEFAULT_FONT &GUI_Font6x8 //GUI默认字体

#define GUI_ALLOC_SIZE 5000 //动态内存的大小

#define GUI_WINSUPPORT 1 //窗口控件支持

#define GUI_SUPPORT_MEMDEV 1 //支持内存设备

#define GUI_SUPPORT_AA 1 /* Anti aliasing available */

#endif /* Avoid multiple inclusion */

配置GUITouchConf.h文件如下:

#ifndef __GUITOUCH_CONF_H

#define __GUITOUCH_CONF_H

#define GUI_TOUCH_SWAP_XY 0

#define GUI_TOUCH_MIRROR_X 0

#define GUI_TOUCH_MIRROR_Y 0

#define GUI_TOUCH_AD_LEFT 3601

#define GUI_TOUCH_AD_RIGHT 393

#define GUI_TOUCH_AD_TOP 273

#define GUI_TOUCH_AD_BOTTOM 3671

#endif /* GUITOUCH_CONF_H */

第三部分:修改LCDWin.c

LCDDriver这个文件夹中一共有三个文件分别是:LCDWin、LCDNull.c、LCDDummy.c 。

在LCD的最基本操作就是在某一个坐标上画点,其他的操作都是画点操作延伸出来的。必须要把画点这个函数连接到uC/GUI的代码里面。连接的函数就在LCDDriver下,我选用LCDWin.c(还有两个文件是LCDNULL.c和LCDDUMMY.c,这三个文件选一个作为驱动程序就可以,都是些模板)

修改这个文件的时候要注意,首先要屏蔽掉第一行的条件编译语句 #if defined(WIN32) && !defined(LCD_SIMCONTROLLER) 和文件的最后一行的#endif 顺便把#endif头上的#else 也干掉。这个文件是针对PC仿真的,不注释掉这几个地方,整个文件都不会被编译的。

分别根据自己的硬件板重写如下函数:

void LCD_L0_DrawPixel(int x, int y)

void LCD_L0_DrawHLine(int x0, int y, int x1)

void LCD_L0_DrawVLine(int x, int y0, int y1)

void LCD_L0_FillRect(int x0, int y0, int x1, int y1)

void LCD_L0_DrawBitmap(int x0, int y0,

int xsize, int ysize,

int BitsPerPixel,

int BytesPerLine,

const U8* pData, int Diff,

const LCD_PIXELINDEX* pTrans)

void LCD_L0_SetOrg(int x, int y)

int LCD_GetErrStat(void)

void LCD_ClrErrStat(void)

int LCD_GetErrCnt (void)

void LCD_Off(void) {}

void LCD_On(void) {}

int LCD_L0_Init(void)

int LCD_L0_CheckInit(void)

void LCD_L0_ReInit(void)

unsigned LCD_L0_GetPixelIndex(int x, int y)

void LCD_L0_XorPixel(int x, int y)

void LCD_L0_SetPixelIndex(int x, int y, int ColorIndex)

void * LCD_L0_GetDevFunc(int Index)

说明:有的函数可以不用修改,可以用它软件的实现,有的则要重写,有的则可以直接返回0,完全有你个人的硬件板所决定。

5、修改GUI_X.C(Sample\GUI_X.C)文件,这主要是系统级的函数。

在GUI_X这个文件夹下有3个GUI_X*文件。分别为:GUI_X.c、GUI_X_embOS.c、GUI_X_ucOS.c这3个文件分别对应无操作系统、embOS和ucOS。

分别根据自己的硬件板重写如下函数:

void GUI_X_Init(void)

void GUI_X_InitOS()

void GUI_X_Unlock()

void GUI_X_Lock()

int GUI_X_GetTime(void)

void GUI_X_Delay(int ms)

int GUI_X_GetTaskID()

void GUI_X_ExecIdle(void)

void GUI_X_UpdateScreen()

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); }

说明:有的函数可以不用修改,可以用它软件的实现,有的则要重写,有的则可以直接返回0,完全有你个人的系统所决定。

编辑:admin  最后修改时间:2018-05-22