发 帖  
原厂入驻New
[分享] 【MM32F103试用体验】ucGUI + FreeRTOS +触摸屏图形界面开发
2016-8-1 12:42:42  16282 开发板 触摸屏
分享
MM32F103 开发板带了一块2.8寸触摸屏,可玩性大大增加,何不来一个UI来方便进行图形界面的开发呢。于是上网搜了下,目前嵌入式8/16/32位的低开销的UI也就ucGUI/emWin以及RT-Thread 的RTUI。
其实uC/Gui的核心代码并不是Micrium公司开发的,而是Segger公司为Micrium公司定制的图形软件库,当然也是基于Segger公司的
emwin
图形软件库开发的。所有说uC/GUI其实是
emwin
的一版精简版。

MM32F103的SRAM只有20KB,当然选择有源码的ucGUI。能找到的最新源码基本就是3.98了吧。

第一部分:在UCGUI移植之前

在移植之前,首先要了解在网上下的UCGUI 3.98源码的文件结构是。

UCGUI 3.98源码中有三个文件夹:

1)“tool文件夹”是用来使用一些uCgui的上位机程序,基本都是字体和模板查看之类的.

2)“sample文件夹”下面是已经别人帮你写好了很多有用的东西,像跟操作系统有关的GUI_X或者一些模板(后面我们会用到的自己定义的Demo),或者是gui配置.后面再一一详细叙说这个文件夹的功能.

3)“Start文件夹”里面,这是我们最主要的文件夹.里面就包含了uCGUI的源代码,uCGUI的作者把源代码放进vc里面进行编译了(当然,这是用标准C语言写的程序,所以我们可以放在任何C语言平台下编译而不会担心兼容性问题,这个uCGUI在这方面做的算是完美了),所以,我们可以在vc平台下写界面,然后再把代码拷进我们的下位机编译器进行编译,这样子效率就会非常高了。

Start文件夹”目录内容:

Config,配置文件;
GUI/AntiAlias,抗锯齿支持;
GUI/ConvertMono,用于B/W(黑白两色)及灰度显示的色彩转换程序;
GUI/ConvertColor,用于彩色显示的色彩转换的程序;
GUI/Core µC/GUI,内核文件;
GUI/Font,字体文件;
GUI/LCDDriver,LCD 驱动;
GUI/Mendev,存储器件支持;
GUI/Touch,触摸屏支持;
GUI/Widget,视窗控件库;
GUI/WM,视窗管理器;

移植uC/GUI主要集中在修改三个头文件和两个C文件:
三个头文件都在\Config下,分别是GUICon.h ,GUITouchConf.h,LCDConf.h ;
两个C文件一个是GUI_X.C(Sample\GUI_X.C),另外一个在GUI\LCDDriver目录下(LCDWin.c)。

第二部分:修改配置文件GUICon.h ,GUITouchConf.h,LCDConf.h

在“Start文件夹”里有两个文件夹里的内容,使我们移植所关心的。一个是CONFIG  ,   另一个是\GUI\LCDDriver。


在CONFIG文件夹中有三个.h文件,GUIConf.h、

CONFIG:

  配置LCDConf.h文件如下:
         #IFndef LCDCONF_H
#define LCDCONF_H
#define LCD_XSIZE           (240)    //配置TFT的水平分辨率
#define LCD_YSIZE           (320)    //配置TFT的垂直分辨率
#define LCD_CONTROLLER      (9341) //TFT控制器的名称
#define LCD_BITSPERPIXEL    (16)     //每个像素的位数
#define LCD_FIXEDPALETTE    (565)    //调色板格式
#define LCD_SWAP_RB         (1)      //红蓝反色交换
#define LCD_INIT_CONTROLLER()    TFT_Init() ;         //此处需要定义的是你的TFT初始化函数,注意由于ucGUI 里定义了LCD_Init()函数,所以LCD driver里的函数名不能为LCD_init, 可以自己改一下名字。
         #endif /* LCDCONF_H */

配置GUIConf.h文件如下:
         #ifndef GUICONF_H
         #define GUICONF_H

#define GUI_OS                  (1)   //多任务
#define GUI_SUPPORT_TOUCH       (1)   //触摸
                      #define GUI_SUPPORT_UNICODE     (1)   //Unicode支持
#define GUI_DEFAULT_FONT         &GUI_Font6x8   //GUI默认字体
#define GUI_ALLOC_SIZE           5000   //动态内存的大小
#define GUI_WINSUPPORT           1   //窗口控件支持
#define GUI_SUPPORT_MEMDEV       1   //支持内存设备
#define GUI_SUPPORT_AA           1   /* Anti aliasing available */

         #endif   /* Avoid multiple inclusion */

配置GUITouchConf.h文件如下:
#ifndef __GUITOUCH_CONF_H
#define __GUITOUCH_CONF_H

#define GUI_TOUCH_SWAP_XY       0
#define GUI_TOUCH_MIRROR_X      0
#define GUI_TOUCH_MIRROR_Y      0

#define GUI_TOUCH_AD_LEFT       0
#define GUI_TOUCH_AD_RIGHT     240
#define GUI_TOUCH_AD_TOP        0
#define GUI_TOUCH_AD_BOTTOM     320 //这里我直接使用了屏幕的物理坐标。ucGUI是含有AD到物理坐标转换功能的。为了简单直接采用Touch 驱动里的转换。

#endif /* GUITOUCH_CONF_H */


第三部分:修改LCDWin.c

LCDDriver这个文件夹中一共有三个文件分别是:LCDWin、LCDNull.c、LCDDummy.c 。

在LCD的最基本操作就是在某一个坐标上画点,其他的操作都是画点操作延伸出来的。必须要把画点这个函数连接到uC/GUI的代码里面。连接的函数就在LCDDriver下,我选用LCDWin.c(还有两个文件是LCDNULL.c和LCDDUMMY.c,这三个文件选一个作为驱动程序就可以,都是些模板)

修改这个文件的时候要注意,首先要屏蔽掉第一行的条件编译语句 #if defined(WIN32) && !defined(LCD_SIMCONTROLLER) 和文件的最后一行的#endif  顺便把#endif头上的#else 也干掉。这个文件是针对PC仿真的,不注释掉这几个地方,整个文件都不会被编译的。

分别根据自己的硬件板重写如下函数:
void LCD_L0_DrawPixel(int x, int y)
void LCD_L0_DrawHLine(int x0, int y,  int x1)
void LCD_L0_DrawVLine(int x, int y0,  int y1)
void LCD_L0_FillRect(int x0, int y0, int x1, int y1)
void LCD_L0_DrawBitmap(int x0, int y0,
                       int xsize, int ysize,
                       int BitsPerPixel,
                       int BytesPerLine,
                       const U8* pData, int Diff,
                       const LCD_PIXELINDEX* pTrans)
void LCD_L0_SetOrg(int x, int y)
int  LCD_GetErrStat(void)
void LCD_ClrErrStat(void)
int  LCD_GetErrCnt (void)
void LCD_Off(void) {}
void LCD_On(void) {}
int  LCD_L0_Init(void)
int  LCD_L0_CheckInit(void)
void LCD_L0_ReInit(void)
unsigned LCD_L0_GetPixelIndex(int x, int y)
void LCD_L0_XorPixel(int x, int y)
void LCD_L0_SetPixelIndex(int x, int y, int ColorIndex)
void * LCD_L0_GetDevFunc(int Index)

说明:有的函数可以不用修改,可以用它软件的实现,有的则要重写,有的则可以直接返回0,完全有你个人的硬件板所决定。

其实,基本上只改了void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)和unsigned int LCD_L0_GetPixelIndex(int x, int y)这两个函数,以及LCD_On和LCD_Off。
5、修改GUI_X.C(Sample\GUI_X.C)文件,这主要是系统级的函数。

在GUI_X这个文件夹下有3个GUI_X*文件。分别为:GUI_X.c、GUI_X_embOS.c、GUI_X_ucOS.c这3个文件分别对应无操作系统、embOS和ucOS。

分别根据自己的硬件板重写如下函数:

void GUI_X_Init(void)

void GUI_X_InitOS()

void GUI_X_Unlock()

void GUI_X_Lock()

int GUI_X_GetTime(void)

void GUI_X_Delay(int ms)

int GUI_X_GetTaskID()

void GUI_X_ExecIdle(void)

void GUI_X_UpdateScreen()

void GUI_X_Log     (const char *s) { GUI_USE_PARA(s); }

void GUI_X_Warn    (const char *s) { GUI_USE_PARA(s); }

void GUI_X_ErrorOut(const char *s) { GUI_USE_PARA(s); }

   

说明:有的函数可以不用修改,可以用它软件的实现,有的则要重写,有的则可以直接返回0,完全有你个人的系统所决定。

我是用的FreeRTOS,所以修改了GUI_X_ucOS.c,实现了几个函数。

6. 触摸屏移植:

只需实现GUI_X_Touch.c里的4个函数,简单的可以只实现GUI_TOUCH_X_MeasureX(void)和GUI_TOUCH_X_MeasureY(void),获得x,y坐标即可。

void GUI_TOUCH_X_ActivateX(void) {
}

void GUI_TOUCH_X_ActivateY(void) {
}

int  GUI_TOUCH_X_MeasureX(void) {  // According to the code in GUI_TOUCH_Exec function Measure Y is first calLED.
tp_dev.scan(0);
return tp_dev.x[0];
}

int  GUI_TOUCH_X_MeasureY(void) {
  return tp_dev.y[0];
}


7. 修改完成后,编译通过。
MainTask.c里的MainTask是一个示例,可以用来测试显示。我移植的时候为了测试触摸屏找了个带对话框等windows控件的更加复杂的MainTaskWM.c.
注意如果使用触摸屏,需要每秒大概100次的调用GUI_TOUCH_Exec();
这些文件可以在附件里找到。文件目录如下:

8. 运行
效果见http://bbs.elecfans.com/forum.php?mod=viewthread&tid=921347&page=1#pid4924502



2
Untitled.png

smart prj.zip

1.54 MB, 下载次数: 200

关键代码

2016-8-1 12:42:42   评论 分享淘帖

相关讨论

28 个讨论
2016-8-1 12:46:05 评论

举报

刷屏估计够呛。
2016-8-1 15:48:05 评论

举报

顶楼主
2016-8-1 15:50:54 评论

举报

zhifubao 发表于 2016-8-1 15:48
刷屏估计够呛。

还行吧,用用户交互界面,一般不会全屏刷,很小的局部刷新不会卡顿。没有测刷一屏需要多长时间。
2016-8-2 09:31:48 评论

举报


谢啦。。。。。。
2016-8-2 09:32:15 评论

举报

MM32系统频率最高是可以到96MHz的,我们默认例程的系统时钟设置为72MHz,如果觉得刷屏太慢的话可以试试96MHz
2016-8-2 10:07:54 评论

举报

本帖最后由 guo8113 于 2016-8-2 12:19 编辑
MMCU5721167 发表于 2016-8-2 10:07
MM32系统频率最高是可以到96MHz的,我们默认例程的系统时钟设置为72MHz,如果觉得刷屏太慢的话可以试试96MHz

嗯,有时间的时候测一下不同频率的刷屏速度。
能使用优化的话,应该会快很多,之前也给你们反应了,触摸屏的程序-level1优化就出问题了。
2016-8-2 12:18:23 评论

举报

表示佩服
2016-8-3 09:32:23 评论

举报


谢谢。
.
.
.
.
2016-8-3 09:51:30 评论

举报

这个屏幕驱动应该会有点卡顿才对吧?
2016-8-11 16:06:15 评论

举报

jianfeii 发表于 2016-8-11 16:06
这个屏幕驱动应该会有点卡顿才对吧?

只是菜单界面的话是没问题的
2016-8-11 16:11:07 评论

举报

谢谢分享
2016-8-12 20:58:03 评论

举报

不错,我也在用
2016-8-16 17:01:11 评论

举报

2016-8-19 14:52:57 评论

举报

头像被屏蔽
{:1:}
2016-8-22 11:20:12 评论

举报

头像被屏蔽
顶一个!!再顶一个!!
2016-8-26 20:21:33 评论

举报

很全面,下载学习,谢谢楼主!!!
2016-8-26 20:22:00 评论

举报

十分佩服楼主的毅力与精神!...
2016-8-29 09:42:05 评论

举报

xyz543 发表于 2016-8-29 09:42
十分佩服楼主的毅力与精神!...


谢谢。。。。。。。。。。。。。。。。。
2016-8-29 10:21:38 评论

举报

只有小组成员才能发言,加入小组>>

12下一页

1447个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

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