腾讯微群加入QQ群

 找回密码
 加入我们

!connect_header_login!

!connect_header_login_tip!

搜索
查看: 1247|回复: 0

手把手教你在STM32下移植UCGUI(基于正点原子的MINI开发板)

[复制链接]
发表于 2016-8-23 15:04:39 | 显示全部楼层 |阅读模式

准备资料:

1、  到网上下载UCGUI3.90的源码,如果下不到,可以点击以下链接进行下载:

http://download.csdn.net/detail/ballack_linux/8122901

下载后解压,可看到如下目录:

     

     

Sample目录主要包含一些示例代码,Start目录包含工程文件和源码,Tool包含一些取模工具,很实用。

 

开始移植:

1、  此例程是基于“ALIENTEKMINISTM32 实验10 TFTLCD显示实验”来移植的。打开该目录目录,可以看到:

     

     在此路径下建立一个UCGUI文件夹。建立后如下:

     

2、  将UCGUI 3.90目录下的Start\GUI下的所有文件夹和Config文件夹拷贝到上面建立的UCGUI文件夹下:

     

     此时需要注意:由于UCGUI\Core下有LCD.C和LCD.H文件,而例程中也有,如下:

     

     

所以将ALIENTEK MINISTM32实验10 TFTLCD显示实验\HARDWARE\LCD路径下的Lcd.c改名为local_lcd.c,Lcd.h改名为local_lcd.h。

3、  将UCGUI源码和local_lcd.c添加到工程中,如下:

     

     记得添加路径到工程中,

      

4、  将local_lcd.c和main.c中的#include"lcd.h"改为#include "local_lcd.h",编译,报错如下:

      

函数重名引起的错误,在此将local_lcd.c和local_lcd.h中的void LCD_Init(void);改为void LCD_Local_Init(void); 同时把main.c中的LCD_Init();调用先注释掉。再次编译,报错如下:

     

     将UCGUI最新3.90版源码\UCGUI390a\Sample下的GUI_X文件夹也拷贝到UCGUI路径下,并把GUI_X.c添加到工程中。

     

     再次编译,报错:

     

     可在LCD.h中找到如下宏定义:

     

     然后继续跟踪,可以看到在LCDDummy.c、LCDNull.c、LCDWin.c都有定义LCD_L0_SetLUTEntry函数。在此例程中使用LCDDummy.c文件,打开该文件可看到整个文件都由以下宏决定是否参与编译:

     

     将其修改为

     

     在工程中查找LCD_CONTROLLER,可以看到在LCDConf.h中定义了:

     

     将其改为:

     

     再次编译,报错:

     

     打开gui_touch_driveranalog.c文件,可以看到:

     

     查找GUI_SUPPORT_TOUCH,可以在GUIConf.h文件中看到如下定义:

     

     由于在此没有跑操作系统,也没有使用触摸屏,也暂时用不到中文字符,更没有用到动态内存分配,只是用TFT来做显示。所以改动如下:

     

     可以看到,编译通过了:

     

5、  在main.c中包含gui.h头文件,即#include“gui.h”,又报错了:

     

     这个问题我找了大半天,可以查到在GUIType.h中有如下定义:

     

     LCD_COLOR是在LCD.h中定义的,而GUIType.h中是有#include “LCD.h”的,那这是为啥呢?

     打开LCD.h,可以看到预编译指令如下:

     

     打开local_lcd.h和local_lcd.c,可以找到如下:

     

     

     看到原因了吧?local_lcd.h用LCD_H定义了TFT屏的高度,而LCD.h用LCD_H作为整个文件的预编译控制。所以导致了#include “LCD.h”根本就没包含到GUIType.h里面去!!!所以做如下修改:

     将local_lcd.h和local_lcd.c中的LCD_W改为LCD_WIDTH,LCD_H改为LCD_HEIGHT。改完后如下:

     

     

     再次编译,通过了!!

6、  接下来需要在UCGUI源码中添加一些LCD驱动的函数。具体如下:

①  我们使用GUI之前,肯定要对GUI进行初始化,此时会调用GUI_Init()函数,GUI_Init()函数中调用了LCD_Init();由于我们此例程用的是LCDDummy.c文件,在LCDDummy.c文件的LCD_Init();函数中又调用了LCD_INIT_CONTROLLER();我们可以在LCDConf.h文件中找到该定义:

     

     将其改为

    

     然后在LCDDummy.c文件头添加  

②  在local_lcd.c中添加以下函数,并在local_lcd.h中添加声明:

     

③  在LCDDummy.c中包含local_lcd.h头文件,然后在其中几个函数中添加内容:

     

     

7、  此时可以写一个测试程序测试了,我们一般使用红黄蓝565的分配比例,而且在有些TFT屏会发现红蓝两种颜色是相反的,我使用的屏正好是相反的,所以可以在LCDConf.h中通过定义以下宏,来交换红蓝两色:

     

8、  下面我写了一个测试的例程,是显示进度条的简单例程。

     Main.c中改成如下:

     

     烧录到板子上,你会发现只有“Progressbar”字幕和进度条显示,但是进度条没动作。

     这是为啥呢,可以查到,是卡死在GUI_Delay(intPeriod)函数中,深入到底层查看,可以知道如果不带操作系统,是会陷入死循环的。可以自己写一个函数做延时函数,也可以使用正点原子的SysTick作为延时的基准。我的处理如下:

     在GUITime.c中添加

     

     

     9、  编译后通过,下载到板子,可以看到有一个进度条在执行进度。


     资源下载地址:http://download.csdn.net/detail/ballack_linux/8125055

 

0
0

转自:http://blog.csdn.net/ballack_linux/article/details/40829313?locationNum=5
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

QQ|手机版|Archiver|小黑屋|一起疯|苦咖啡 ( 新ICP备12000197号  

GMT+8, 2018-6-24 09:46 , Processed in 0.094437 second(s), 11 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表