uCGUI在STM32开发板上的移植及优化
晓梦逸尘 发布于:2013-8-25 22:42 分类:
STM321、打开调试好的TFTLCD测试程序(这里是打开“ALIENTEK MINISTM32 实验10 TFTLCD显示实验”)的工程文件夹,在其中创建ucGUI的文件夹。由于ucGUI/CORE文件中已经存在了lcd.h和lcd.c的文件,所以我们将工程目录HARDWARE/LCD中的lcd.c文件和lcd.h文件的文件名换成ili93xx.c和ili93xx.h,并将其中的预处理命令也相应的更换。然后将ili93xx.h和ili93xx.c中用来标识液晶屏宽和高的LCD_H与LCD_W分别换成LCD_HEIGHT和LCD_WIDTH。
2、打开ucGUI源码文件,将其Start/GUI目录下的除JPEG文件夹以外的文件夹复制到第一步中创建的ucGUI文件夹中。
3、将Start/Config和Sample/GUI_X也复制到之前的文件夹 ucGUI中。
4、打开工程文件,添加工程文件夹如下图:
其中,USER、HARDWARE、SYSTEM、CORE、FWLib是工程中原有的文件,除此之外为需要新建的文件。 由于ucGUI目录下的CORE文件名与原有的文件名相冲突,故将其修改为ucCORE。并将ucGUI目录下的除GUI_X、Config以外的所有文件添加到相应的文件夹下。然后再添加Config目录下对应的三个.h文件和GUI_X目录下的GUI_X.c文件。
5、打开Config/GUIConf.h将其修改如下:
05 | #define GUI_SUPPORT_TOUCH (0) |
06 | #define GUI_SUPPORT_UNICODE (0) |
08 | #define GUI_DEFAULT_FONT &GUI_Font6x8 |
09 | //#define GUI_ALLOC_SIZE 12500 |
10 | #define GUI_ALLOC_SIZE 5000 |
13 | #define GUI_WINSUPPORT 0 |
14 | #define GUI_SUPPORT_MEMDEV 0 |
15 | #define GUI_SUPPORT_AA 0 |
6、打开Config/LCDConf.h将其修改为如下:
05 | #define LCD_XSIZE (240) |
06 | #define LCD_YSIZE (320) |
07 | #define LCD_CONTROLLER (-1) |
08 | #define LCD_BITSPERPIXEL (16) |
09 | #define LCD_FIXEDPALETTE (565) |
10 | #define LCD_SWAP_RB (1) //红蓝反色交换 |
11 | //#define LCD_SWAP_XY (1) |
13 | #define LCD_INIT_CONTROLLER() LCD_hard_Init(); |
7、打开ili93xx.c和ili93xx.h文件,将其中的void LCD_Init(void)函数更名为void LCD_hard_Init(void)以防与ucGUI中的原有函数名冲突。然后再在ili93xx.c中添加如下函数,并在ili93xx.h中将其声明。
1 | void ili9320_SetPoint(u16 x,u16 y,u16 color) |
8、打开LCDDummy.c文件,添加头文件包含#include "ili93xx.h";将预处理命令修改为#if (LCD_CONTROLLER == -1) 。
9、在void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)函数最后添加语句ili9320_SetPoint( xPhys, yPhys ,PixelIndex);
10、在unsigned int LCD_L0_GetPixelIndex(int x, int y)函return语句之前添加PixelIndex = LCD_ReadPoint(x,y);
11、移植ColorBar程序,将main.c文件修改为如下形式(别忘了在main.c文件中添加#include“gui.h”的预处理命令):
01 | void DemoShowColorBar( void ); |
06 | delay_init(72); //延时初始化 |
13 | GUI_SetBkColor(GUI_BLACK); |
15 | GUI_SetColor(GUI_WHITE); |
17 | GUI_SetFont(&GUI_Font24_ASCII); |
18 | GUI_DispStringHCenterAt( "COLOR_ShowColorBar - Sample" , 160, 5); |
29 | void DemoShowColorBar( void ) |
31 | int x0 = 60, y0 = 40, yStep = 15, i; |
32 | int xsize = LCD_GetDevCap(LCD_DEVCAP_XSIZE) - x0; |
33 | GUI_SetFont(&GUI_Font8x16); |
37 | GUI_DispStringAt( "Fixed palette: " , 0, 40); |
38 | GUI_DispDecMin(LCD_FIXEDPALETTE); |
40 | GUI_DispStringAt( "Red" , 0, y0 + yStep); |
41 | GUI_DispStringAt( "Green" , 0, y0 + 3 * yStep); |
42 | GUI_DispStringAt( "Blue" , 0, y0 + 5 * yStep); |
43 | GUI_DispStringAt( "Grey" , 0, y0 + 6 * yStep); |
44 | GUI_DispStringAt( "Yellow" , 0, y0 + 8 * yStep); |
45 | GUI_DispStringAt( "Cyan" , 0, y0 + 10 * yStep); |
46 | GUI_DispStringAt( "Magenta" , 0, y0 + 12 * yStep); |
47 | for (i = 0; i < xsize; i++) { |
48 | U16 cs = (255 * (U32)i) / xsize; |
51 | GUI_DrawVLine(x, y0 , y0 + yStep - 1); |
52 | GUI_SetColor(0xff + (255 - cs) * 0x10100L); |
53 | GUI_DrawVLine(x, y0 + yStep, y0 + 2 * yStep - 1); |
55 | GUI_DrawVLine(x, y0 + 2 * yStep, y0 + 3 * yStep - 1); |
56 | GUI_SetColor(0xff00 + (255 - cs) * 0x10001L); |
57 | GUI_DrawVLine(x, y0 + 3 * yStep, y0 + 4 * yStep - 1); |
58 | GUI_SetColor(cs * 0x10000L); |
59 | GUI_DrawVLine(x, y0 + 4 * yStep, y0 + 5 * yStep - 1); |
60 | GUI_SetColor(0xff0000 + (255 - cs) * 0x101L); |
61 | GUI_DrawVLine(x, y0 + 5 * yStep, y0 + 6 * yStep - 1); |
62 | GUI_SetColor((U32)cs * 0x10101L); |
63 | GUI_DrawVLine(x, y0 + 6 * yStep, y0 + 7 * yStep - 1); |
64 | GUI_SetColor(cs * 0x101); |
65 | GUI_DrawVLine(x, y0 + 7 * yStep, y0 + 8 * yStep - 1); |
66 | GUI_SetColor(0xffff + (255 - cs) * 0x10000L); |
67 | GUI_DrawVLine(x, y0 + 8 * yStep, y0 + 9 * yStep - 1); |
68 | GUI_SetColor(cs * 0x10100L); |
69 | GUI_DrawVLine(x, y0 + 9 * yStep, y0 + 10 * yStep - 1); |
70 | GUI_SetColor(0xffff00 + (255 - cs) * 0x1L); |
71 | GUI_DrawVLine(x, y0 + 10 * yStep, y0 + 11 * yStep - 1); |
72 | GUI_SetColor(cs * 0x10001); |
73 | GUI_DrawVLine(x, y0 + 11 * yStep, y0 + 12 * yStep - 1); |
74 | GUI_SetColor(0xff00ff + (255 - cs) * 0x100L); |
75 | GUI_DrawVLine(x, y0 + 12 * yStep, y0 + 13 * yStep - 1); |
12、下载到开发板运行如下图所示:
13、以上就完成了ucGUI裸机移植的所有步骤,但是发现刷屏较慢。然后我们跟踪GUI_Clear()刷屏函数的执行情况,发现是void LCD_L0_FillRect(int x0, int y0, int x1, int y1)函数执行效率不高。于是将其修改如下:
1 | void LCD_L0_FillRect( int x0, int y0, int x1, int y1) |
3 | LCD_Fill(x0,y0,x1,y1,LCD_COLORINDEX); |
重新烧写程序,发现刷屏速度大幅度提升!
14、ucGUI预定义了一些颜色,这些预定义是放在gui.h文件中。然而,我们发现这些颜色是以24bits的方式定义的。通过查询手册发现我们所使用的颜色被ucGUI定义成了“逻辑颜色” ,它通过最小平方偏移搜索的方式将其映射为“物理颜色”。所以在用户使用颜色时有很强的灵活性。
源码详见
http://pan.baidu.com/share/link?shareid=590010509&uk=1208661112