查看: 410|回复: 9
打印 上一主题 下一主题

STM32F103之ucGUI移植

[复制链接] qrcode

25

主题

29

帖子

90

积分

注册会员

Rank: 2

积分
90
楼主
跳转到指定楼层
发表于 2014-4-25 11:01 PM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    连续来一发,最近写的小结,刚接触ucGUI不久,分享一些入门的经验,希望对大家有益处,也希望帮我补充不足之处

最近学习完成UCOSII/III后,也想玩玩LCD,直接驱动LCD后,感觉人机交互还是很欠缺,又想玩玩界面;一番搜索后,回到Micrium;相同的代码风格,完整的资料,让人倍感亲切。

参数:keil  UCGUI390a  STM32F103 不带UCOS 不带触摸

知识储备:

1、 STM32F103相关见上一个贴:http://bbs.ickey.cn/group-topic-id-19668.html

2、 UCGUI :官网上能下载到Trial版的源码,和英文的数据手册,这里提供一份UCGUI390a和中文版的数据手册:http://pan.baidu.com/s/1pJFcVhD

一、UcGUI工程组建

下载上面的源码,打开文件夹,有三个文件SampleStartTool分别点击开来,会发现有好多文件,对,UcGUI是一个很强大的工具;下面具体说说移植步骤:

1、 准备一个可以跑的,不带UCOSII的裸机程序;

2、 在工程文件根目录下新建文件夹GUI 文件夹Config

3、 打开UcGUI源码文件,复制StartGUIStartConfig到对应文件名的文件下

4、 复制SampleGUI_X文件夹下的所有文件到StartConfig

5、 添加.c.h文件到工程目录

注:SampleGUI_X复制过去的三个文件各有用处,裸跑UCGUI的时候添加GUI_X;带触摸屏功能,加GUI_X_Touch;带UCOS去掉GUI_X添加GUI_X_uCOS

建立好的工程文件结构:


下面为GUI所有子目录的内容

注:截图自中文手册

必须保证每个文件只能使用一个版本的UcGUI.

二、修改源码

修改底层驱动的方法有很多,我选择通用性比较强的,修改LCD_LCDDriver下的LCDDummy.CLCD_LCDDriver下的另外连个c文件属相同功能的不同模板,删除亦可;

先来看看LCDDummy.C的简介

File        : LCDDummy.C

Purpose     : Empty driver

This driver does no perform any function, but it can be

used for 2 purposes:

a) Satisfy all externals so an application can be

compiled and linked in target hardware even if the

driver is not already available

b) Template for a starting point for a new driver.

很显然这个文件是用来是源文件编译通过,和新驱动的一个模板;

整个移植要修改的文件相对UCOS少很多,要修改的文件就三个LCDDummy.c

LCDConf.h GUIConf.h

1、 修改GUIConf.h

顶层的配置,每个参数后面都有具体的说明,亦可参考数据手册的第21章、高层次配置

下面是我的代码:


#define GUI_OS                    (0)  /* Compile with multitasking support */

#define GUI_SUPPORT_TOUCH         (0)  /* Support a touch screen (req. win-manager) */

#define GUI_SUPPORT_UNICODE       (0)  /* Support mixed ASCII/UNICODE strings */

#define GUI_DEFAULT_FONT          &GUI_Font6x8

//#define GUI_ALLOC_SIZE          12500  /* Size of dynamic memory ... For WM and memory devices*/

#define GUI_ALLOC_SIZE          1024*1024  /* Size of dynamic memory ... For WM and memory devices*/

/**********************************************************************

*         Configuration of available packages

*/

#define GUI_WINSUPPORT            0  /* Window manager package available */

#define GUI_SUPPORT_MEMDEV        0  /* Memory devices available */

#define GUI_SUPPORT_AA            0  /* Anti aliasing available */

#endif  /* Avoid multiple inclusion */

去除了所有功能,纯净裸跑 ——!

2、 修改LCDConf.h

底层的配置,每个参数后面都有具体的说明,亦可参考数据手册的第20章、底层配置;这个根据自己手上的LCD来修改

#define LCD_XSIZE      (240)   /* X-resolution of LCD, Logical coor. */

#define LCD_YSIZE      (320)   /* Y-resolution of LCD, Logical coor. */

//#define LCD_BITSPERPIXEL (8)

#define LCD_BITSPERPIXEL (16)                                             /* lcd 颜色深度*/

#define LCD_CONTROLLER (-1)                                          /* lcd 控制器设置*/

#define LCD_FIXEDPALETTE (565)                                        /* RGB 颜色位数*/

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

#define LCD_INIT_CONTROLLER()      ILI9320_LCD_Init();

这里着重说明一下红色标记的两个设置

#define LCD_CONTROLLER (-1)                                          /* lcd 控制器设置*/

这个是LCD控制器的设置;如果用到的控制器,ucGUI原本就支持,直接选择编号即可;参考中文手册的第22章 LCD驱动程序。

如果不支持就要自己书写,统一将这个参数设置成-1;这里我用的控制器是ILI9320;故而改成-1.

#define LCD_INIT_CONTROLLER()      ILI9320_LCD_Init();

将控制器的初始化函数改成自己手上LCD驱动器的初始化程序,每一块LCD厂家都提供驱动程序的。注意不要定义为LCD_Init();因为GUI文件中已经含有这个函数;可搜索查找其具体位置。

3、 修改LCDDummy.c

修改底层驱动,也是移植最难的部分,先来看一下LCDDummy.c的说明

Adapting to a new system (creating a new driver):

In this case, the first step is to fill the routines

LCD_L0_GetPixelIndex, LCD_L0_SetPixelIndex and LCD_L0_Init with

functionality, which is sufficient to make the hardware work.

A second (optional) step would be to optimize higher level routines.

很明确的告诉我们要修改哪些函数,即:LCD_L0_GetPixelIndex, LCD_L0_SetPixelIndex and LCD_L0_Init

修改这三个函数我们要准备好底层的驱动,一般LCD都会有相应的LCD.CLCD.H;这里涉及底层驱动源文件的就不过多的讨论。注意不要使用LCD.CLCD.H文件名加入到工程中,因为工程本身有lcd.CGUI_Core下;可改为相应控制器的文件名,如:ili9320_lcd.c .h

找到你的驱动文件中对应的函数修改上面提到的三个函数,例如:

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

{

LCD_DrawPoint(x,y,PixelIndex);

}

unsigned int LCD_L0_GetPixelIndex(int x, int y)

{

return LCD_ReadPoint(x,y);

}

int  LCD_L0_Init(void) {

LCD_INIT_CONTROLLER();

return 0;

}

当然用到驱动文件的函数就要包含进来他的头文件:#include "ILI9320.h"

#if (LCD_CONTROLLER == -1) && (!defined(WIN32) |defined(LCD_SIMCONTROLLER)) 中后半部分的删掉, 即剩下#if(LCD_CONTROLLER == -1);否则整个LCDDummy.c文件都不会编译。也就是为什么很多时候修改完没有反应的原因。

至此移植基本完成

main文件中随意添加几个函数

GUI_Init();

//ILI9320_LCD_Init();

GUI_SetBkColor(GUI_RED);

GUI_SetColor(GUI_WHITE);

GUI_Clear();

GUI_DrawCircle(100,100,50);

GUI_DispStringAt("Made By supermu!",10,10);

实现一下功能

三、一点思考

跑几个程序以后会发现很多的显示有点滞后,翻看底层驱动会会发现很多的功能都是靠描点和线来实现,典型的像

/*********************************************************************

*

*       LCD_L0_FillRect

*/

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

for (; y0 <= y1; y0++) {

LCD_L0_DrawHLine(x0, y0, x1);

}

}

/*********************************************************************

很明显这是通过调用画线程序来调用画点程序,不知道怎么全面实现应用GRAM来提高显示速度——待研究。

另一个方法是提取底层驱动有用的数据融合到LCDDummy.c中,将上面修改的上个函数改为直接实现,速度也有所提升。

吸取上次教训,这次基本木有图,哈哈,轻松多了

附件为本文PDF:




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

0

主题

81

帖子

10

积分

新手上路

Rank: 1

积分
10
沙发
发表于 2014-4-26 08:52 AM | 只看该作者
学习一下,谢谢
回复 支持 反对

使用道具 举报

38

主题

120

帖子

145

积分

注册会员

Rank: 2

积分
145
板凳
发表于 2014-4-26 08:54 AM | 只看该作者

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

0

主题

79

帖子

10

积分

新手上路

Rank: 1

积分
10
地板
发表于 2014-4-26 02:42 PM | 只看该作者
这个要严重关注一下。
回复 支持 反对

使用道具 举报

1

主题

81

帖子

25

积分

新手上路

Rank: 1

积分
25
5#
发表于 2014-4-26 10:07 PM | 只看该作者
谢谢支持!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

0

主题

74

帖子

16

积分

新手上路

Rank: 1

积分
16
6#
发表于 2014-4-26 10:08 PM | 只看该作者

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

0

主题

81

帖子

2

积分

新手上路

Rank: 1

积分
2
7#
发表于 2014-4-26 10:08 PM | 只看该作者
荣幸,多多交流

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

10

主题

191

帖子

228

积分

中级会员

Rank: 3Rank: 3

积分
228
8#
发表于 2014-4-27 10:39 AM | 只看该作者
顶起。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

0

主题

77

帖子

22

积分

新手上路

Rank: 1

积分
22
9#
发表于 2014-4-27 11:47 AM | 只看该作者
谢谢支持 

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

0

主题

85

帖子

14

积分

新手上路

Rank: 1

积分
14
10#
发表于 2014-4-28 10:13 AM | 只看该作者
牛逼的贴子,LZ多发好贴
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表