资源描述
UCGUI在STM32上移植教程
1 说明
l 开发板芯片型号STM32F103VET6
l 板载液晶型号ILI9341
l 所需准备资料UCGUI3.90源码
l 一个工程模板
为了节约时间,此处所用模板为野火M3工程模板(3.5.0)
制作时间---2013-08-07 By NUAA---Kylin
2 移植过程讲解
2.1 首先打开工工程模板,页面如下,这个模板工程很简单
2.2 在工程模板中新建两个文件夹
2.2.1 命名为GUI与Mylib
2.2.2 在GUI文件夹下添加以下内容
l 上述图片为UCGUI3.90源码中的一些文件夹
l 进入UCGUI3.90源码文件夹/Start,将Config文件夹原封不动的拷过来
l 进入UCGUI3.90源码文件夹/Start/GUI文件夹,将其中所有文件夹拷过来
l 在GUI文件夹下新建GUI_X文件夹,进入UCGUI3.90源码文件夹/ Sample/ GUI_X文件夹中,如果带操作系统应该拷贝GUI_X_uCOS.c,如果不带操作系统拷贝GUI_X.c,在这里我们将将GUI_X.c拷贝到新建GUI_X文件夹。
2.2.3 各文件夹说明
1) AntiAlias:9个C文件,主要用于抗锯齿的显示效果。
2) ConvertColor:彩色显示的色彩转换支持。
3) ConvertMono:(b/w)和灰度显示的色彩转换支持。
4) Core:核心文件,提供了GUI基本的功能。
5) Font:字库。
6) JPEG:图片操作函数。
7) LCDDriver:LCD驱动程序
8) MenDev:Memorydevice 支持。这个东西可用在很多情况下,但最主要的功能是防止在项目重叠时,防止屏幕的闪烁。
9) Widget:窗体控件库。
10) WM:窗口管理库。
11) Config:配置文件。
12) GUI:源代码。
13) GUI_X:操作系统接口函数。
2.3 添加组及源文件
2.3.1 将GUI文件夹下的所有文件夹添加到GROUP
右键工程工程项目名选择manage components将这些组全部添加上如图
2.3.2 然后除了LCDDriver以及Font不Add Files
其他的都将对应文件夹下的内容添加进来
原因如下:
因为不同液晶需要不同的驱动,字体的话也是自行选择。
完成后如下图所示
2.3.3 添加头文件路径
2.3.4 完成以上操作之后开始编译
因编译时间较长,编译过程中将Config组下的GUIConf.h改成如下图所示,初步移植,这些功能可以先关掉,修改内容如图
另外将Config组下的GUITouchConf.h改成如下图所示
其他部分删掉
将Config组下的LCDConf.h改成如下图所示
2.3.5 编译完发现存在很多错误
如下图所示,不过还好错误都是一些未定义的
2.3.6 错误解决
首先看第一个错误,缺少字体文件,所以右键组Font将Font文件夹下的Font6x8.c添加进组
其他未定义的内容有:
l LCD_L0_SetLUTEntry
l LCD_L0_SetOrg
l LCD_L0_SetPixelIndex
l LCD_L0_DrawBitmap
l LCD_L0_DrawHLine
l LCD_L0_FillRect
l LCD_L0_Init
l LCD_L0_On
l LCD_L0_XorPixel
l LCD_L0_DrawVLine
l LCD_L0_GetPixelIndex
解决方法:
在GUI/LCDDriver/目录下新建一个LCD_GUI.c文件,并添加到组LCDDriver当中,由于这些错误都是未定义的,所以我们新建这样一个文件进行定义
点击菜单栏Edit选择find in files找到函数声明的位置,会发现这些定义都在LCD_protected.h当中,将他们拷贝出来,放入LCD_GUI.c文件当中
l int LCD_L0_Init (void){}//要有返回值,不然编译报错 可以写return 0;
l void LCD_L0_SetLUTEntry (U8 Pos, LCD_COLOR color){}
l void LCD_L0_SetOrg (int x, int y){}
l void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex){}
l void LCD_L0_DrawBitmap (int x0, int y0, int xsize, int ysize, int BitsPerPixel, int BytesPerLine, const U8 GUI_UNI_PTR * pData, int Diff, const LCD_PIXELINDEX* pTrans){}
l void LCD_L0_DrawHLine (int x0, int y0, int x1){}
l void LCD_L0_FillRect (int x0, int y0, int x1, int y1){}
l void LCD_L0_On (void){}
l void LCD_L0_XorPixel (int x, int y){}
l void LCD_L0_DrawVLine (int x, int y0, int y1){}
l unsigned int LCD_L0_GetPixelIndex (int x, int y){}
2.3.7 液晶驱动程序
由于不同液晶的驱动程序不一样,所以直接拷贝对应液晶的驱动程序即可
这里我直接拷贝野火教程中自带的液晶驱动程序bsp_ili9341_lcd.h,bsp_ili9341_lcd.c到LCDDriver文件夹的当中并添加到组LCDDriver当中
并在LCD_GUI.c文件中添加下列头文件
#include "LCD_Private.h"
#include "GUI_Private.h"
#include "bsp_ili9341_lcd.h"
完成这些任务后就离成功不远了
2.4 Mylib文件夹内容添加
2.4.1 添加自己以前编好的底层函数
如我这边有添加如下函数,其实刚开始移植加不加都无所谓
2.4.2 新建文件夹FSMC
另外在Mylib再新建下一个文件夹FSMC进行配置,不过已经配置好了,在附件可添加函数当中,拷贝过来即可,并将内容添加到组Mylib当中
(FSMC说明:FSMC(Flexible Static Memory Controller,可变静态存储控制器)是STM32系列中内部集成256 KB以上FlaSh,后缀为xC、xD和xE的高存储密度微控制器特有的存储控制机制。之所以称为“可变”,是由于通过对特殊功能寄存器的设置,FSMC能够根据不同的外部存储器类型,发出相应的数据/地址/控制信号类型以匹配信号的速度,从而使得STM32系列微控制器不仅能够应用各种不同类型、不同速度的外部静态存储器,而且能够在不增加外部器件的情况下同时扩展多种不同类型的静态存储器,满足系统设计对存储容量、产品体积以及成本的综合要求。)
最后组视图如下:
在main函数当中添加头文件说明
#include"GUI.h"
#include"FSMC.h"
#include"LCD_Protected.h"
这个时候编译不会再出现错误,不过具体的功能未能实现
2.5 函数功能添加
在bsp_ili9341_lcd.c文件中查找相应的函数加入到LCD_GUI.c当中,下面举两个例子,其他的自行添加,如下方截图
Main函数测试
展开阅读全文