基于STM32的uCGUI移植和优化文档格式.docx
《基于STM32的uCGUI移植和优化文档格式.docx》由会员分享,可在线阅读,更多相关《基于STM32的uCGUI移植和优化文档格式.docx(46页珍藏版)》请在冰豆网上搜索。
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
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/*定义控制器类型*/
31
32#endif/*LCDCONF_H*/
配置层的东西我们都已经搞定了,接下来我们要修改的是uCGUI开放给我们的用户层的东西,GUI_X.c可以直接拷进去,这个是用户层和系统层的关联文件,一些demo也会用到这个文件的时间函数或者延迟函数,所以这个文件拷进去放着就可以了.
1#include"
GUI.h"
2#include"
GUI_X.h"
6*Globaldata
7*/
8volatileintOS_TimeMS;
9
10/*********************************************************************
11*
12*Timing:
13*GUI_X_GetTime()
14*GUI_X_Delay(int)
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}
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<
windows.h>
#include"
LCD.h"
LCD_Private.h"
/*includeLCDConf.h*/
LCDSIM.h"
GUI_Private.h"
memory.h"
/*********************************************************************
*
*Defines
**********************************************************************
*/
#ifLCD_BITSPERPIXEL<
=8
#definePIXELINDEXU8
#else
#definePIXELINDEXWORD
#endif
#ifdefWIN32
#ifndefASSERT
#defineASSERT(Val)\
if(!
(Val))\
MessageBox(NULL,"
...infile"
__FILE__,"
Assertionfailed..."
MB_OK);
#endif
#ifdefLCD_ASSERT
#undefLCD_ASSERT
#defineLCD_ASSERT(v)ASSERT(v)
#ifndefLCD_DISPLAY_INDEX
#defineLCD_DISPLAY_INDEX0
*Macrosforinternaluse
#ifdef_DEBUG
staticint_CheckBound(unsignedintc){
unsignedintNumColors=LCD_BITSPERPIXEL>
8?
0xffff:
(1<
<
LCD_BITSPERPIXEL)-1;
if(c>
NumColors){
GUI_DEBUG_ERROROUT("
LCDWin:
:
SETPIXEL:
parametersoutofbounds"
);
return1;
}
return0;
}
#defineSETPIXEL(x,y,c)\
_CheckBound(c)){\
LCDSIM_SetPixelIndex(x,y,c,LCD_DISPLAY_INDEX);
\
#defineSETPIXEL(x,y,c)LCDSIM_SetPixelIndex(x,y,c,LCD_DISPLAY_INDEX)
#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:
if(*p&
Diff))
LCDSIM_SetPixelIndex(x,y,Index1,LCD_DISPLAY_INDEX);
x++;
caseLCD_DRAWMODE_XOR:
;
Diff)){
intPixel=LCDSIM_GetPixelIndex(x,y,LCD_DISPLAY_INDEX);
LCDSIM_SetPixelIndex(x,y,LCD_NUM_COLORS-1-Pixel,LCD_DISPLAY_INDEX);
*_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;
(LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)){
if(pTrans){
intShift=(3-CurrentPixel)<
1;
intIndex=(Pixels&
(0xC0>
(6-Shift)))>
Shift;
LCD_PIXELINDEXPixelIndex=*(pTrans+Index);
SETPIXEL(x++,y,PixelIndex);
if(++CurrentPixel==4){
CurrentPixel=0;
Pixels=*(++p);
}else{
(0xC0