基于STM32的uCGUI移植和优化.docx
- 文档编号:9468083
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:41
- 大小:37.05KB
基于STM32的uCGUI移植和优化.docx
《基于STM32的uCGUI移植和优化.docx》由会员分享,可在线阅读,更多相关《基于STM32的uCGUI移植和优化.docx(41页珍藏版)》请在冰豆网上搜索。
基于STM32的uCGUI移植和优化
基于STM32的uCGUI移植和优化
首先在开始这个说明之前,要简要说明下具体的环境:
编译工具:
MDK4.20
开发板:
安富莱v2版开发板
调试器:
JLink v8盗版
移植篇
相信大家有移植经验的都知道,移植确实是一件非常墨迹的事情,怎么说呢,代码都是别人的,风格也是别人的,文件结构,定义之类都是别人的,看别人的东西是种进步,但是,也是一个痛苦的过程,因为有时候资料确实很少,而且有时候还是E文的,专业名词一大堆,我们根本没有办法想象工作量是多么的巨大.
不过事情都是这样,你不懂他的时候他就像是巨山,但是一旦你理解他的时候,你才会感觉到原来他是那么的简单(从我的经验上来看,至少应该是这样的).
好吧,闲话少说,我们就来开始我们的移植之旅把.
首先,我们需要准备的东西有uCGUI3.90,这个版本是大家现在用的比较多的,效率也比较高,别人都是这么评论的,至于其他版本的,我没有接触很多,所以不能过多评论.
uCGUI有三个文件夹,一个是tool,这个文件夹是用来使用一些uCgui的上位机程序,基本都是字体和模板查看之类的.在sample文件夹下面是已经别人帮你写好了很多有用的东西,像跟操作系统有关的GUI_X或者一些模板(后面我们会用到的自己定义的Demo),或者是gui配置.后面再一一详细叙说这个文件夹的功能.在Start文件夹里面,这是我们最主要的文件夹.里面就包含了uCGUI的源代码,uCGUI的作者把源代码放进vc里面进行编译了(当然,这是用标准C语言写的程序,所以我们可以放在任何C语言平台下编译而不会担心兼容性问题,这个uCGUI在这方面做的算是完美了),所以,我们可以在vc平台下写界面,然后再把代码拷进我们的下位机编译器进行编译,这样子效率就会非常高了.(像51那时候写界面就是疯狂的一次一次的烧,真是纠结..).
然后这里放的就是uCGUI的源代码了,在GUI文件夹下面.
这则是每个文件夹的功能(参考uCGUI中文手册,翻译).
大概看一下就可以了,这个跟我们移植的关系不大,关键点是带*的可以不包含进去(待会配置会讲到.).然后其他的都要包含进去.
接着我们要把我们的文件包含进我们已经搭建好的工程,这里说明下我们的工程要求.
一般来说,我们要画一个图形,最基本的就是从点开始,从点到线,从点到面...,所以在已经建好的工程里面你要能点亮你的屏幕,能点出最基本的点,能填充出最基本矩阵(这是uCGUI最包含的函数),反正我移植的时候涉及到的包括三个函数,LCD_Init();LCD_Draw_Point(x,y,color),LCD_Fillcircuit(x1,x2,y1,y2).这三个函数是必须的,后面也会说明如何把这三个函数进行填充.
当我们把文件复制进去的时候,再加上我们一开始已经创建好的工程的时候,文件结构差不多就是这个样子了,截图如下
user包括,main函数就是我们初始化和函数调用,绘图用的文件,另外那几个文件相信大家都明白了把,tft_lcd.c就是你在,没有移植uCGUI的情况下,纯液晶屏驱动,这里建议把液晶屏的API和最底层驱动(API就是画圆啊,画椭圆啊,清除屏幕之类的,底层驱动就是驱动液晶屏的管脚运作,fsmc初始化,时钟配置之类的),不过我这里也是集成在一起了,比较懒,大家别学.
其他文件夹我都包含进去了,在没包含进去的时候,编译是可以通过的,但是,那么多文件包含进去,有些配置还是没有设定好的.所以会有错误,蛮编译一下.没事的.
这里我们需要修改的文件只有这几个:
这是ucgui开放给我们的用户层的文件,在ucgui中,lcdDrive文件夹要自己加进去,GUI_X.c也是,另外三个文件都是包含了,在GUIConf.h中
1#ifndefGUICONF_H
2#defineGUICONF_H
3
4#defineGUI_OS(0) //这里指的是对操作系统的支持,因为我们这里只有单纯的移植uCGUI,
5 //所以,要把这个关闭,不然后面会有很多东西编译进去
6 //不然到时候编译的时候会发生很多你无法修改的错误
7#defineGUI_SUPPORT_TOUCH(0) //这里则是对触摸屏的支持,触摸屏我是能做,但是没有用,
8//所以省去麻烦,把触摸屏关掉,相信移植好之后,要支持触摸屏大家都会有门路了
9#defineGUI_SUPPORT_UNICODE
(1) //UNICODE编码支持,如果大家只是单纯的想用英文显示,而不移植中文字库进去,
10//这个是可以关掉的,因为UNICODE是向下支持的,所以开不开无所谓
11 //反正都是能够正常显示的
12#defineGUI_DEFAULT_FONT&GUI_Font6*8 //这里是设定默认字体的,我们可以在要写什么字的时候把该字号的字体.
13//c包含进我们的主函数里面,所以这里不用改
14#defineGUI_ALLOC_SIZE5000//这里讲的是动态内存机制
15 //这里rgb接口模式的可能会有用到,uCGUI就是在我们的ram开辟一块空间,
//然后uCGUI把运算好的每个点都放进我们主控ram里面的空间
16 //所以,这里就相当于把写进液晶gram里面的操作变成了写进主控ram里面,
//那么大家可能就会问了,干嘛这么多次一举,直接写进去不就可以了
17
18/*原理:
一般来说,在大的屏幕上面(4.0以上吧,印象中),都是没有控制器,(像我的液晶屏就是spfd5420,当然,
19不同的屏幕的液晶主控都是不一样的,但是寄存器操作都是差不多的,
20所以有些初始化配置还是能互用的.)所以呢,这时候我们要用到的就只有RGB接口了,
21RGB要求我们要不断的刷新屏幕,刷新率越高,效果就越好,因为一般这种用来做动态的,uCGUI就是属于静态类型的
22像如果我们要用stm32主控做视频应用的时候,就是动态的,我们需要不断的刷新屏幕,但是当我们主控一边运算,
23一边往液晶接口送数据的时候,会有明显刷屏的感觉(运算->画点->运算->画点....,这个运算
24->运算.......画点->画点->画点...是不一样的,因为对屏幕一直画点,填充,而中间不用插入运算,
25刷一个屏幕时间时间倍速差别是非常巨大的,后面大家也会见识到这种差别.),所以,用GUI申请的空间里面
26边运算,边填充,填充完再一次性运出去(这里可以通过DMA控制FSMC总线,不断的从外置SRAM往GRAM自动搬运数据,
27这是不用主控去插手的,所以,主控大部分时间是负责运算,其他时间可以空闲出来,
28让DMA自己去忙活),同理,因为dma跟cpu的分工,所以,这里同样的把画点,画点,运算,运算不完全的分开了,
29屏幕刷新速度非常之可观(DMA的速度相比大家还是非常了解的,它就是为速度而生的.),*/
30
31//#defineGUI_ALLOC_SIZE1024*1024
/*Sizeofdynamicmemory...ForWMandmemorydevices*/
32
33/*********************************************************************
34*
35*Configurationofavailablepackages
36*/
37
38#defineGUI_WINSUPPORT1//这个是窗口支持,一般开始开着的
39#defineGUI_SUPPORT_MEMDEV1//内存控制,开
40#defineGUI_SUPPORT_AA0//抗锯齿,为了性能着想,还是关了比较好
41
42#endif/*Avoidmultipleinclusion*/
复制代码
GUITouchConf.h是有关于触摸屏配置的,这里我们就略过了.
1#ifndefLCDCONF_H
2#defineLCDCONF_H
3
4/*********************************************************************
5*
6*GeneralconfigurationofLCD
7*
8**********************************************************************
9*/
10
11/*
12*这个定义的是你x轴的长度,像我这里的屏幕长为400个像素
13*/
14#defineLCD_XSIZE(400)
15
16/*
17*这里这是屏幕的宽
18*/
19#defineLCD_YSIZE(240)/*Y轴长度*/
20
21/*
22*这里是屏幕的颜色有多少个位
23*/
24#defineLCD_BITSPERPIXEL(16)/*定义数据长度为16bit*/
25
26/*
27*控制器类型,如果你里面有包含这些判断变量,这个最好改成你认识的
28*/
29#defineLCD_CONTROLLER9325/*定义控制器类型*/
30
31
32#endif/*LCDCONF_H*/
复制代码
配置层的东西我们都已经搞定了,接下来我们要修改的是uCGUI开放给我们的用户层的东西,GUI_X.c可以直接拷进去,这个是用户层和系统层的关联文件,一些demo也会用到这个文件的时间函数或者延迟函数,所以这个文件拷进去放着就可以了.
1#include"GUI.h"
2#include"GUI_X.h"
3
4/*********************************************************************
5*
6*Globaldata
7*/
8volatileintOS_TimeMS;
9
10/*********************************************************************
11*
12*Timing:
13*GUI_X_GetTime()
14*GUI_X_Delay(int)
15
16SometimingdependentroutinesrequireaGetTime
17anddelayfunction.Defaulttimeunit(tick),normallyis
181ms.
19译:
一些需要时间的相关函数需要用到gettime和延迟.
20默认时间单位为1ms.
21*/
22
23intGUI_X_GetTime(void){
24return0;
25}
26
27voidGUI_X_Delay(intms)
28{
29}
30
31/*********************************************************************
32*
33*GUI_X_Init()
34*
35*Note:
36*GUI_X_Init()iscalledfromGUI_Initisapossibilitytoinit
37*somehardwarewhichneedstobeupandrunningbeforetheGUI.
38*Ifnotrequired,leavethisroutineblank.
39*
40*译:
GUI_X_Init()是在gui_init()调用前,gui启动或者运行前准备.
41*如果不是必须的,可以把这个函数留空白.
42*/
43
44voidGUI_X_Init(void)
45{
46
47}
48
49
50
51/*********************************************************************
52*
53*GUI_X_ExecIdle
54*
55*Note:
56*CalledifWMisinidlestate
57*译:
视窗管理器空闲时候调用
58*/
59
60voidGUI_X_ExecIdle(void){}
61
62/*********************************************************************
63*
64*Logging:
OSdependent
65
66Note:
67Loggingisusedinhigherdebuglevelsonly.Thetypicaltarget
68builddoesnotuselogginganddoestherefornotrequireanyof
69theloggingroutinesbelow.Forareleasebuildwithoutlogging
70theroutinesbelowmaybeeliminatedtosavesomespace.
71(Ifthelinkerisnotfunctionawareandeliminatesunreferenced
72functionsautomatically)
73译:
系统日志层应用程序
74
75*/
76
77voidGUI_X_Log(constchar*s){}
78voidGUI_X_Warn(constchar*s){}
79voidGUI_X_ErrorOut(constchar*s){}
复制代码
在uCGUI和底层驱动的接口文件时LCDDriver.c,大家打开文件夹可以看到这几个文件:
lcdwin.c,lcdnull.c,lcdDummy.c,这三个文件你随便修改哪个都行,一开始我是直接修改lcdnull.c的,不过一开始没经验,一直不能正常调用我的uCGUI函数,所以,我的队友告诉我,要修改另外一个(lcdwin.c),这次才反应过来,理论上,修改lcdnull.c也是可以的,就是一些细节性的东西可以要多注意点.下面我讲解下怎么修改lcdwin.c这个文件.
源文件我先贴出来:
#ifdefined(WIN32)&&!
defined(LCD_SIMCONTROLLER)
#include
#include"LCD.h"
#include"LCD_Private.h"/*includeLCDConf.h*/
#include"LCDSIM.h"
#include"GUI_Private.h"
#include"memory.h"
/*********************************************************************
*
*Defines
*
**********************************************************************
*/
#ifLCD_BITSPERPIXEL<=8
#definePIXELINDEXU8
#else
#definePIXELINDEXWORD
#endif
#ifdefWIN32
#ifndefASSERT
#defineASSERT(Val)\
if(!
(Val))\
MessageBox(NULL,"...infile"__FILE__,"Assertionfailed...",MB_OK);
#endif
#endif
#ifdefLCD_ASSERT
#undefLCD_ASSERT
#endif
#defineLCD_ASSERT(v)ASSERT(v)
#ifndefLCD_DISPLAY_INDEX
#defineLCD_DISPLAY_INDEX0
#endif
/*********************************************************************
*
*Macrosforinternaluse
*/
#ifdef_DEBUG
staticint_CheckBound(unsignedintc){
unsignedintNumColors=LCD_BITSPERPIXEL>8?
0xffff:
(1< if(c>NumColors){ GUI_DEBUG_ERROROUT("LCDWin: : SETPIXEL: parametersoutofbounds"); return1; } return0; } #defineSETPIXEL(x,y,c)\ if(! _CheckBound(c)){\ LCDSIM_SetPixelIndex(x,y,c,LCD_DISPLAY_INDEX);\ } #else #defineSETPIXEL(x,y,c)LCDSIM_SetPixelIndex(x,y,c,LCD_DISPLAY_INDEX) #endif #defineXORPIXEL(x,y)_XorPixel(x,y) /********************************************************************* * *Staticcode * ********************************************************************** */ /********************************************************************* * *_XorPixel */ staticvoid_XorPixel(intx,inty){ unsignedintIndex=LCD_L0_GetPixelIndex(x,y); LCDSIM_SetPixelIndex(x,y,LCD_NUM_COLORS-1-Index,LCD_DISPLAY_INDEX); } /********************************************************************* * *_DrawBitLine1BPP */ staticvoid_DrawBitLine1BPP(intx,inty,U8const*p,intDiff,intxsize,constLCD_PIXELINDEX*pTrans){ LCD_PIXELINDEXIndex0=*(pTrans+0); LCD_PIXELINDEXIndex1=*(pTrans+1); x+=Diff; switch(GUI_Context.DrawMode&(LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)){ case0: /*Writemode*/ do{ LCDSIM_SetPixelIndex(x++,y,(*p&(0x80>>Diff))? Index1: Index0,LCD_DISPLAY_INDEX); if(++Diff==8){ Diff=0; p++; } }while(--xsize); break; caseLCD_DRAWMODE_TRANS: do{ if(*p&(0x80>>Diff)) LCDSIM_SetPixelIndex(x,y,Index1,LCD_DISPLAY_INDEX); x++; if(++Diff==8){ Diff=0; p++; } }while(--xsize); break; caseLCD_DRAWMODE_XOR: ; do{ if(*p&(0x80>>Diff)){ intPixel=LCDSIM_GetPixelIndex(x,y,LCD_DISPLAY_INDEX); LCDSIM_SetPixelIndex(x,y,LCD_NUM_COLORS-1-Pixel,LCD_DISPLAY_INDEX); } x++; if(++Diff==8){ Diff=0; p++; } }while(--xsize); break; } } /********************************************************************* * *_DrawBitLine2BPP */ #if(LCD_MAX_LOG_COLORS>2) staticvoid_DrawBitLine2BPP(intx,inty,U8const*p,intDiff,intxsize,constLCD_PIXELINDEX*pTrans){ LCD_PIXELINDEXPixels=*p; intCurrentPixel=Diff; x+=Diff; switch(GUI_Context.DrawMode&(LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)){ case0: if(pTrans){ do{ intShift=(3-CurrentPixel)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STM32 uCGUI 移植 优化