连续来一发,最近写的小结,刚接触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
下载上面的源码,打开文件夹,有三个文件Sample、Start、Tool分别点击开来,会发现有好多文件,对,UcGUI是一个很强大的工具;下面具体说说移植步骤:
1、 准备一个可以跑的,不带UCOSII的裸机程序;
2、 在工程文件根目录下新建文件夹GUI 文件夹Config
3、 打开UcGUI源码文件,复制StartGUI和StartConfig到对应文件名的文件下
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.C;LCD_LCDDriver下的另外连个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.C和LCD.H;这里涉及底层驱动源文件的就不过多的讨论。注意不要使用LCD.C和LCD.H文件名加入到工程中,因为工程本身有lcd.C在GUI_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:
|