STM32平台移植uCGUI详细说明v1.0
硬件平台:盘古UE-STM32F103开发板
软件平台:RVMDK_v4.20 + uCOS-II_v2.86 + StmLib_v3.5 + uCGUI_v3.9 联系方式:WWW.UE-TECH.NET 淘宝店铺:UETECH.TAOBAO.COM 文档作者:合嵌电子科技有限公司
uCGUI是一种嵌入式应用中的图形支持系统.它设计用于为任何使用LCD图形显示的应用提供高效的于处理器及LCD控制器的图形用户接口,它适用单任务或是多任务系统环境, 并适用于任意LCD控制器和CPU下任何尺寸的真实显示或虚拟显示。它的设计架构是模块化的, 由不同的模块中的不同层组成, 由一个LCD驱动层来包含所有对LCD的具体图形操作, uCGUI可以在任何的CPU上运行, 因为它是100%的标准C代码编写的。uCGUI能够适应大多数的使用黑白或彩色LCD的应用, 它提供非常好的允许处理灰度的颜色管理.还提供一个可扩展的2D图形库及占用极少RAM的窗口管理体系.
移植准备
本文档基于盘古STM32F103开发板进行uCGUI的移植实验,移植的软件基础为RVMDK_v4.20 + uCOS-II_v2.86 + StmLib_v3.5。具体uCOS-II的移植过程请参见文档《STM32平台移植uCOS-II详细说明》,在移植最后,将通过uCOS-II创建进程运行uCGUI自带DEMO代码,以熟悉其运行流程。
1. 打开盘古UE-STM32F103光盘中的基础例程:27_uCOS-II移植
由于此例程已经移植完成uCOS-II_v2.86,因此直接在此基础移植就可以,此例程文件结构如下:
2. 下载uCGUI_v3.9源码
解压后,有如下文件结构
其源代码主要在start文件夹下,Sample是官方制作的一个Demo例程,我们一会再移植的过程中,
需要用到里面的文件,这儿跳过,以下是对start作出简介:
1 / 12
STM32平台移植uCGUI详细说明
目 录ConfigGUI/AntiAliasGUI/ConvertMonoGUI/ConvertColorGUI/CoreGUI/FontGUI/LCDDriverGUI/MendevGUI/TouchGUI/WidgetGUI/WM说 明配置文件目录,包含了LCD、TOUCHGUI配置文件抗锯齿支持文件用于黑白两色及灰度显示的色彩转换程序用于彩色显示的色彩转换程序UCGUI内核程序文件有关字体的程序文件LCD驱动代码文件存储器的支持文件触摸屏的支持文件视窗控件文件库视窗管理器 3. 裸机下功能正常的LCD驱动,此处为GLCD.C。 主要保证:LCD_Initializtion( ) >LCD的初始化函数 LCD_GetPoint( ) >LCD读取定点颜色函数,读取一个像素点的16位RGB颜色值
LCD_SetPoint( ) >LCD画点函数, 用指定颜色填充一个像素 这3个函数能正常运行就可以了。 开始移植 关于uCGUI的移植步骤相对固定,可以移植,也可以在uCOS-II的基础上进行移植,步骤大同小异,本文档的移植工作,默认读者已有盘古开发板基础例程之27_uCOS-II移植例程进行; 1. 创建移植顶层文件夹:uCGUI移植; 2. 打开27_uCOS-II移植例程文件夹,将里面所有的文件拷贝至uCGUI移植文件夹; 3. 在uCGUI移植文件夹下再创建一个uCGUI文件夹,最终uCGUI移植文件夹内容如下: 4. 对例程的工程名和输出文件名等进行相应的修改。
5. 打开uCGUI_v3.9源码,进入uCGUI_v3.9\\Start\\,把Config和GUI两个文件夹,包括文件夹下所有文件拷贝至移植工作目录uCGUI移植\下;
6. 打开uCGUI_v3.9源码,进入uCGUI_v3.9\\Sample\\,把GUIDemo文件夹及其所有文件拷贝至移植工作目录uCGUI移植\下;
7. 同时,由于我们的是基于uCOS-II进行移植工作,所以我们依然打开uCGUI_v3.9源码,进入uCGUI_v3.9\\Sample\\GUI_X,把此文件夹下面的GUI_X_uCOS.c文件拷贝至移植工作目录uCGUI移植
\下,需要说明的是,如果读者是裸机进行移植的话,需拷贝GUI_X.c文件,如果读者还需要移植
2 / 12
STM32平台移植uCGUI详细说明
触摸屏的话,还需要拷贝GUI_X_Touch.c文件,在此由于我们只需要拷贝GUI_X_uCOS.c文件。 8. 最后我们需要在移植工作目录uCGUI移植\下创建LCDDriver文件夹,用于存放开发板上LCD对的驱动文件,此处我们存放GLCD.c和GLCD.h两个文件。
至此,我们的文件已经全部创建完毕,已经完成移植的三分之一操作,下面可以进行文件的修改。 9. 打开MDK工程文件,我们需要对添加的文件进行添加分组操作,uCGUI官方在这方面有个推荐的结构,如下所示:
所以,我们进行一些列的添加和创建之后,分组如下:
3 / 12
STM32平台移植uCGUI详细说明
文件与组的添加方法在此不再重复,只需右击项目名称,选择Manage Components即可,其中用红色方框框出的那部分是需要新创建的,在进行了一系列的创建以后,需给每个组添加文件,具体添加如下:
GUI_X组中添加 uCGUI移植\\\GUI_X_uCOS.c文件 Config组中添加 uCGUI移植\\\Config中的C文件
LCDDriver组中添加 Demo组中添加
uCGUI移植\\\LCDDriver\\GLCD.c文件 uCGUI移植\\\GUIDemo中的C文件
GUI_Antialias组中添加 uCGUI移植\\\AntiAlias中的C文件 GUI_ ConvertColor组中添加 uCGUI移植\\\ConvertColor中的C文件 GUI_ ConvertMono组中添加 uCGUI移植\\\ConvertMono中的C文件 GUI_ Core组中添加 GUI_ Font组中添加
uCGUI移植\\\Core中的C文件 uCGUI移植\\\Font中的C文件 uCGUI移植\\\JPEG中的C文件
uCGUI移植\\\LCDDriver中的C文件 uCGUI移植\\\MemDev中的C文件 uCGUI移植\\\MultiLayer中的C文件 GUI_ JPEG组中添加 GUI_ LCDDriver组中添加
GUI_ MemDev组中添加 GUI_ MultiLayer组中添加 GUI_ Widget组中添加 GUI_ WM组中添加
uCGUI移植\\\Widget中的C文件 uCGUI移植\\\WM中的C文件
10. 在完成了C文件的添加后,我们需要包含头文件路径,打开Option选项,在C/C++选项卡中,记性添加操作,具体如下所示:
其中有些文件没有头文件,我们可以省略,但是如果你也搞不清楚,就像这样全部都添加一遍。 至此为止,我们已经完成移植工作的三分之二的操作,接下来进行详细的修改操作。
11. 配置uCGUI
这一部分主要是配置Config组的文件:LCDConf.h和 GUIConf.h。对于初学者建议先从简单的LCD开始,尽量不要复杂化,触摸屏部分先不使用。
此步骤往下,我们需要准备好正常运行的LCD驱动程序,主要是 LCD_Initializtion( ) //LCD的初始化函数 LCD_GetPoint( ) //LCD读取定点颜色函数,读取一个像素点的16位RGB颜色值
4 / 12
STM32平台移植uCGUI详细说明
LCD_SetPoint( ) //LCD画点函数, 用指定颜色填充一个像素
通过点的操作,我们就可以进行间接的调用进行线和面的操作了。
首先进行LCDConf.h文件的修改,具体如下: #ifndef LCDCONF_H
接下来GUIConf.h文件,我们可以默认不动
其次需要解释一下的是,uCGUI和底层驱动的接口文件是uCGUI移植\\\GUI\\LCDDriver\\,大家打开文件夹可以看到这3个文件:lcdwin.c,lcdnull.c和lcdDummy.c,这三个文件你随便修改哪个都行,都是uCGUI的LCD接口模板文件,功能一样,只是移植时修改的细节不一样,我们可以选用其中一个,稍作修改作为接口文件,此处以LCDDummy.c为例:
1. 将以下代码: #include \"LCD_Private.h\" /* private modul definitions & config */
#if (LCD_CONTROLLER == -1) \\ && (!defined(WIN32) | defined(LCD_SIMCONTROLLER)) #include \"GUI_Private.h\" #include \"GUIDebug.h\" #define LCD_XSIZE #define LCD_YSIZE
(320) (240)
(LCD_ID) (16) (565)
//换成实际的控制器型号
//换成实际的LCD像素
#define LCDCONF_H #define SSD #define LCD_ID
() SSD
//盘古STM32F103开发板LCD控制器型号
#define LCD_CONTROLLER #define LCD_BITSPERPIXEL #define LCD_FIXEDPALETTE
#define LCD_SWAP_RB (1)
#define LCD_INIT_CONTROLLER( ) LCD_Initializtion(); //换成实际的LCD初始化函数 #endif
修改为: #include \"LCD_Private.h\" /* private modul definitions & config */
#include \"GUI_Private.h\" #include \"GUIDebug.h\" #include \"GLCD.h\"
#if (LCD_CONTROLLER == LCD_ID)
//包含驱动头文件 //LCDConf.h中已经定义
2. 将LCD_L0_SetPixelIndex函数
void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) { /* Convert logical into physical coordinates (Dep. on LCDConf.h) */
5 / 12
STM32平台移植uCGUI详细说明
#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 }
直接换成:
void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) {
LCD_SetPoint(x,y,PixelIndex);
/* Write into hardware ... Adapt to your system */ {
/* ... */ }
}
3. 将LCD_L0_GetPixelIndex函数
unsigned int LCD_L0_GetPixelIndex(int x, int y) {
LCD_PIXELINDEX 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
/* Read from hardware ... Adapt to your system */ {
PixelIndex = 0;/* ... */ } }
return PixelIndex; 直接替换成:
unsigned int LCD_L0_GetPixelIndex(int x, int y) { }
return LCD_GetPoint(x,y);
4. 将LCD_L0_Init函数
int LCD_L0_Init(void)
6 / 12
STM32平台移植uCGUI详细说明
{
LCD_INIT_CONTROLLER(); return 0; }
直接替换成: int LCD_L0_Init(void) { }
LCD_Initializtion(); return 0;
剩下的函数基本就不需要修改了,你可以直接把函数里面的东西清空,然后写上自己在底层硬件驱动的API。
移植完成
根据以上的移植步骤,应该没有问题。在移植完成以后,我们需要在uCOS-II的基础上创建新的线程,来启动uCGUI,调用官方提供的一些Demo程序,同时还需要创建一个线程,来驱动3个LED进行循环的显示,因为在调试过程中相对条件比较缺乏,我们可以通过灯的闪烁,来判断当前程序是否跑飞。
在基于uCOS-II的设计开发中,uCOS-II系统要求用户在调用任何服务之前,首先对系统进行初始化,即调用OSIint(),之后再建立至少一个应用任务,最后在通过OSStart()实现多任务的启动。 关于uCOS-II的任务,系统提供了任务管理的多种函数调用,包括创建任务,删除任务,改变任务的优先级和恢复等。系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,该任务仅给一个整形变量做累加运算;另一个是系统任务,它的优先级次低,该任务负责统计当前CPU的利用率。 至于用户的任务,当然首先需要建立任务,用户可以通过以下两种函数来建立任务:OSTaskCreate() 或 OSTaskCreateExe()。函数OSTaskCreateExe()是OSTaskCreate()的扩展版本,提供了一些附加的功能。 说完了uCOS-II我们说说uCGUI,关于它的使用,首先我们也需要对uCGUI进行初始化GUI_Init(),其次我们可以通过一系列uCGUI提供的函数进行数据的输出与配置,比如: 显示二进制数据: GUI_DispBin()
GUI_DispBinAt() GUI_DispDec() GUI_DispDecAt() GUI_DispDecMin() GUI_DispDecShift() GUI_DispHex() GUI_DispHexAt() GUI_DispFloat() GUI_DispFloatFix () GUI_DispFloatMin() GUI_DispSFloatFix() GUI_DispSFloatMin() GUI_DispChar() GUI_DispCharAt()
7 / 12
显示十进制数据:
显示十六进制数据: 显示浮点数据:
显示文本数据:
STM32平台移植uCGUI详细说明
GUI_DispChars()
GUI_DispString() GUI_DispStringAt() GUI_DispStringLen()
GUI_DispStringHCenterAt()
这样就完成了数据的显示,我们也可以对显示的数据的颜色、背景色、字体进行配置: 字体设置: GUI_SetFont()
在简单熟悉了uCOS-II和uCGUI之后,我们可以完善我们的工程了。这是我们需要在APP.c中添加如下代码:
#include static OS_STK startup_task_stk[128]; //跑马灯任务堆栈 字体颜色设置: 字体背景色设置: GUI_SetColor() GUI_SetBkColor() static OS_STK AppTaskUserIFStk[APP_TASK_USER_IF_STK_SIZE]; //uCGUI的DEMO任务堆栈 static void systick_init(void); extern void MainTask(void); static void startup_task(void *p_arg); static void AppTaskUserIF(void *p_arg); int main(void) { } NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); BSP_Init(); OSInit(); systick_init(); //板级硬件初始化 //uCOS-II初始化 //创建LED任务线程 OSTaskCreate(startup_task, (void *)0, &startup_task_stk[STARTUP_TASK_STK_SIZE - 1], STARTUP_TASK_PRIO); //创建Demo任务线程 OSTaskCreateExt(AppTaskUserIF, (void *)0, (OS_STK *)&AppTaskUserIFStk[APP_TASK_USER_IF_STK_SIZE-1], APP_TASK_USER_IF_PRIO, APP_TASK_USER_IF_PRIO, (OS_STK *)&AppTaskUserIFStk[0], APP_TASK_USER_IF_STK_SIZE, (void *)0, OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR); OSStart(); return 0; 8 / 12 STM32平台移植uCGUI详细说明 static void systick_init(void) { RCC_ClocksTypeDef rcc_clocks; RCC_GetClocksFreq(&rcc_clocks); SysTick_Config(rcc_clocks.HCLK_Frequency / OS_TICKS_PER_SEC); } static void startup_task(void *p_arg) //跑马灯任务 { while(1) { GPIO_SetBits(GPIOD, GPIO_Pin_5); GPIO_ResetBits(GPIOD, GPIO_Pin_6); GPIO_ResetBits(GPIOD, GPIO_Pin_7); OSTimeDlyHMSM(0,0,0,500); GPIO_ResetBits(GPIOD, GPIO_Pin_5); GPIO_SetBits(GPIOD, GPIO_Pin_6); GPIO_ResetBits(GPIOD, GPIO_Pin_7); OSTimeDlyHMSM(0,0,0, 500); GPIO_ResetBits(GPIOD, GPIO_Pin_5); } GPIO_ResetBits(GPIOD, GPIO_Pin_6); GPIO_SetBits(GPIOD, GPIO_Pin_7); OSTimeDlyHMSM(0,0,0, 500); } static void AppTaskUserIF (void *p_arg) { while(DEF_TRUE) MainTask(); //此函数在uCGUI移植\\\GUIDemo\\GUIDEMO.c中定义 { } } 在添加了APP.c的代码的同时,我们需要在app_cfg.h中对线程任务所需的优先级和占空间进行定义,首先添加优先级代码: #define STARTUP_TASK_PRIO 7 #define APP_TASK_USER_IF_PRIO 5 其次进行占空间的定义: #define STARTUP_TASK_STK_SIZE 80 #define APP_TASK_USER_IF_STK_SIZE 256 至此所有的过程都已经结束了。最后可以进行编译和下载操作了,以下为上电运行后的实物图: 9 / 12 STM32平台移植uCGUI详细说明 10 / 12 STM32平台移植uCGUI详细说明 说明 本开发板可以以下几个模块配套使用,模块详情请登录官网查询,或直接进入店铺购买 双路RS485/422转RS232模块 GPS模块 GPRS模块 Zigbee模块 WIFI模块 陀螺仪模块(支持MPU6050加速度+陀螺仪、HMC5883磁力计、BMP085气压计) 7寸液晶屏模块 合嵌电子提供良好电磁兼容性的嵌入式开发板,陆续将推出的嵌入式开发板如下: STM32F103开发板、 STM32F407开发板、 AT91SAM9260开发板(ARM9系列)、 LPC1768开发板、 LPC1788开发板 敬请关注,同时诚招各地加盟代理商,欢迎联系洽谈。 11 / 12 STM32平台移植uCGUI详细说明 联系方式 电话:0550-37700 店铺:UETECH.TAOBAO.COM 邮箱:UE_TECH@126.COM 网站:WWW.UE-TECH.NET WWW.UETECH.NET 地址:安徽省滁州市南谯区花园西路82号(科技创业中心1幢302室) 12 / 12 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo3.cn 版权所有 湘ICP备2023017654号-3
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务