嵌入式GUI大概有这些:MicroWindows、MiniGui、QT for MCU、GTK+、OpenGUI、FLTK、EFL(Enlightenment Foundation Libraries)、AWTK(Toolkit AnyWhere)、Wayland/WestonSDL(Simple DirectMedia Layer)、DirectFBLittlevGLNuklear、touchGFX、uGFX、emWIN、uCgui 等GUI框架。本文重点介绍uCgui的移植。

【uCgui 背景介绍】

  在国内做嵌入式系统的,开始入门OS的时候,大家应该都会选择uC/OS,为什么?因为代码开源且资料众多嘛。由于uC/OS的原因大家也一定接触了uC/GUI的嵌入式图形软件库。其实uC/Gui的核心代码并不是Micrium公司开发的,而是Segger公司为Micrium公司定制的图形软件库,当然也是基于Segger公司的emwin图形软件库开发的。所有说uC/GUI其实是emwin的一版精简版。

  在以前较旧的版本程序中uC/Gui的源代码是开源的(可以在网上能够找到),但是新版本的程序emWin和uC/gui只对用户提供库文件,是不开源的。

  Segger 除了向Micrium公司提供定制的uC/GUI版本,还向其他的IC厂家提供定制服务,比如向ST 公司出售了emWin 的版权,从而 ST 公司也得到了定制版的emWin,然后改了名字叫 STemWin。当用户在 STM32 芯片上使用 emWin 软件库时,是不需要向 emWin 或 ST 公司付费的。还有NXP公司也使用了emWin的图形库,大家使用NXP芯片的时候同样也不需要支付费用。

  总而言之,uC/GUI 和 STemWin 都是 Segger 公司的 emWin 产品,而且它们的版本编号是统一的,如 uC/GUI 目前最新版本命名为uC-GUI V5.24, STemWin 最新版本命名为STemWin Library V5.24,emWin 最新版本则为 emWin V5.24,所以,要比较这三个软件库功能上的区别,只需要看它们的版本号就可以了。

【uCgui 移植准备】

  先直接跑官方提供的demo例程,有关touch lcd的样例中已经实现了 exmc 、spi以及相关外设的初始化,而且添加了 320 * 240 尺寸的LCD 驱动接口,于是先从例程着手熟悉一下驱动LCD 的原理,跑完例程后屏幕显示如下:

152112b4u6yjhzq4v6h6xz.png.thumb.jpg

  以上显示了几个按钮,点触对应的按钮时可以看到板子上面的指示LED有相应的显示反馈。

【uCgui 移植步骤】

  跑完官方例程,已经熟悉了各个驱动接口的原理以及实现,接下来正式进行uCgui的移植。

第一步:先通过官网或者其它资源渠道,获取到uCgui 3.90a的源码包,官网可能现在只开放lib包而非源码 。以下为源码目录结构:

155807u133uec2yz3uklu2.png.thumb.jpg


带“*”标志的为可选项,不同版本带的有所不同)

说明:移植是要特别注意配置文件Config和GUI/LCDDriver。

①.GUI/LCDDriver文件夹中存放的是一些LCD驱动代码,如果你使用的LCD在这里可以找到代码,可以直接通过Config中的LCDConfig.h里边的:

#define LCD_CONTROLLER -1 // -1:表示没有选择的LCD驱动,而是使用里边的样本程序进行修改。

uCGUI中具体支持哪些LCD?可以查询《uCGUI用户手册》的第22章 LCD驱动程序。里边详细的说明了,支持些什么控制器的LCD。

②.在工程中只需加载需要的LCD驱动代码文件即可。如果设置为-1,则选择加载LCDDummy.C或LCDTemplate.C文件(不同的版本,此代码的文件名可能会不同)。

第二步:获取到源码包后,将所有相关文件加入到工程中,并且添加好相关的编译路径,工程结构如下:

160509lyzubilsakgsgy62.png.thumb.jpg

第三步:必须编写好 LCDDummy.C 中的LCD的以下驱动函数,底层驱动需要包含如下函数:

①.LCD_INIT_CONTROLLER() : LCD初始化函数。

②.LCD_SetPixel(): LCD画点函数。

③.LCD_GetPixel(): LCD读取像素点函数。

第四步: 根据需要修改GUI_config的 配置.h 文件 ,本次暂时不移植 touch 和 OS功能 ,配置如下:

161317rqz44e9mnjefeed3.png.thumb.jpg

161341j6suxsziuhi49tu6.png.thumb.jpg 第六步:在例程中拷贝GUI_X文件夹中的文件:

①.GUI_X.C  :无系统

②.GUI_X_embOS.C :embOS系统

③.GUI_X_uCOS.C  :uCOS系统

根据不同条件添加不同文件,如果是无系统下添加文件①,否则根据系统添加文件,或编写文件。特别说明如下函数:

a.int  GUI_X_GetTime(void);

此函数调用系统时间如果你的系统有实时时钟之类的可以将实时时钟驱动程序放在这里面。没有也没关系只是调用系统时间相关的函数不能用而已,可能这个功能很多人也不会用。

b.void GUI_X_Delay(int Period);

此函数用于GUI的延时,由于没有跑系统,就自己手动写个延时程序。其它的函数置空即可。

第七步:在应用层面先需要初始化好 mcu相关的时钟及LCD外设接口驱动,接着做好GUI_Init 就可以根据 API手册编写应用程序了,这里实现了不同大小、颜色、位置的字符显示对比,以及还实现了一个简单的进度条功能 :

162202qhapwmm2p2hwmmsp.png.thumb.jpg


【uCgui 移植试验结语】

  此次移植完uCgui库后,进行完简单的进度条显示测试,后面可以增加 uCos、touch驱动功能 ,以及利用 uC tools 来快速构建UI界面,简化c语言的编程复杂性。

Project_GD32E50x_LCD_uCgui_V1.0.rar (1.66 MB, 下载次数: 2)

全部回复 2
  • 98 主题
  • 328 帖子
  • 1576 积分
身份:LV4 高级技术员
E币:1883
这里补充一点: ThreadX的GUIX 也非常值得关注!
他的点评
发表于 2021-1-29 13:55
  • 117 主题
  • 401 帖子
  • 1262 积分
身份:LV4 高级技术员
E币:810
SnailWillow 发表于 2021-1-29 10:29
这里补充一点: ThreadX的GUIX 也非常值得关注!

感觉上GUI了,基本就得奔MPU去了
回复楼主
您需要登录后才可以评论 登录 立即注册