木子剑
生命不熄,学习不止!

老牌ucGUI与ucOS II一样的历史悠久,好笑的是我竟然没用过,,,

移植以TNeo操作系统为例,对ucGUI v3.98移植细节进行相关记录,以达到快速入门目的。

 

go go go!!下载好的ucGUI如下:

  

 

 

在上图 “删除后”中,我们进入Sample文件夹,如下图:

  

 其他文件, 应该有也参考价值,但大家伙都是使用GUI_X,这次也随主流吧!

 

然后再进入Start文件夹,如下图:

 

  以上就是整理后的ucGUI了,已保留了GUI主要框架。

 

现在假设已经把所有的文件.C和.H全部加入到了你的工程里,当前我用Embedded Studio开发STM32.

下面是一些要改动具体文件,以TNeo进行移植。 

第1个为uC-GUI\Start\Config,如下图:

 我们先移植LCD屏,触摸面板先不移植,请不要删除上图 Touch,在配置项关掉它就可以了。每一个宏的作用

可以去查网上查阅信息,最好先看看“UCGUI中文手册”,结合你用的LCD显示屏进行配置,这里不要配置错就行了

 

第2个为uC-GUI\Start\GUI下的文件:

  打开LCDDriver文件,里面有LCDMem.c、LCDNull.c、LCDTemplate.c,LCDWin.c

先进入Config文件夹内对LCDConf.h进行配置如下:

#define LCD_CONTROLLER -1  //  使用LCDTemplate.c这份文件

这样就选定了LCDTemplate.c这个驱动文件了,要实现对应的俩个函数:

void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)   //描点函数

unsigned int LCD_L0_GetPixelIndex(int x, int y)  //读点函数

/*********************************************************************
*
*       Exported functions
*
**********************************************************************
*/

//-- SPI屏,芯片R61505V 
#include "spi.h"

/*********************************************************************
*
*       LCD_L0_SetPixelIndex
*              描点
* Purpose:
*   Sets the index of the given pixel. The upper layers
*   calling this routine make sure that the coordinates are in range, so
*   that no check on the parameters needs to be performed.
*/
void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) {

  //GUI_USE_PARA(x); //-- 原来的
  //GUI_USE_PARA(y);
  //GUI_USE_PARA(PixelIndex);


  /* Convert logical into physical coordinates (Dep. on LCDConf.h) */
  #if LCD_SWAP_XY | LCD_MIRROR_X| LCD_MIRROR_Y
    int xPhys = LOG2PHYS_X(x, y);
    int yPhys = LOG2PHYS_Y(x, y);

  #else
    #define xPhys x
    #define yPhys y
  #endif
  /* Write into hardware ... Adapt to your system */
  {
    /* ... */
    DrawPixel(xPhys, yPhys, PixelIndex); // 现有测试SPI屏
  }
}

找LCD屏厂商,要一份LCD屏基础驱动,通常会有描点函数读点函数,上面代码DrawPixel(xPhys, yPhys, PixelIndex);是我当前LCD屏描点。

对原文GUI_USE_PARA建意全部注释它,它们没有价值的,有时还会出错!!现在,有描点就可以进行显示些内容了。

第3个为uC-GUI\Sample\GUI_X如下的文件:

 

 我们使用GUI_X.c文件,不过在开始之前,先进入uC-GUI\Start\Config下打开GUIConf.h文件配置一下:

/*
*********************************************************************************************************
*                                             uC/GUI V3.98
*                        Universal graphic software for embedded applications
*
*                       (c) Copyright 2002, Micrium Inc., Weston, FL
*                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
*
*              µC/GUI is protected by international copyright laws. Knowledge of the
*              source code may not be used to write a similar product. This file may
*              only be used in accordance with a license and should not be redistributed
*              in any way. We appreciate your understanding and fairness.
*
----------------------------------------------------------------------
File        : GUIConf.h
Purpose     : Configures abilities, fonts etc. 为1时激活
----------------------------------------------------------------------
*/


#ifndef GUICONF_H
#define GUICONF_H

#define GUI_OS                    (0)  /* 编译时支持多任务处理 */
#define GUI_SUPPORT_TOUCH         (0)  /* 支持触摸屏 */
#define GUI_SUPPORT_MOUSE         (0)  /* 支持鼠标 */
#define GUI_SUPPORT_UNICODE       (1)  /* 支持ASCII/UNICODE混合字符串 */

#define GUI_DEFAULT_FONT          &GUI_Font8x16   //-- 系统字体
#define GUI_ALLOC_SIZE            12500  /* 动态内存的大小... 对于WM和内存设备,单位? */

/*-********************************************************************
*
*                配置可用的软件包
*/

#define GUI_WINSUPPORT            0  /* 可用的窗口管理器软件包 */
#define GUI_SUPPORT_MEMDEV        0  /* 可用的存储设备 */
#define GUI_SUPPORT_AA            0  /* 有抗锯齿功能 */

#endif  /* Avoid multiple inclusion */

上面define时GUI_OS为0,则不使用操作系统,对应的文件就是GUI_X.c,其实我会变相的使用TNeo操作系统,哈哈

现在对GUI_X.c进行编写,如下图:

/*
*********************************************************************************************************
*                                             uC/GUI V3.98
*                        Universal graphic software for embedded applications
*
*                       (c) Copyright 2002, Micrium Inc., Weston, FL
*                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
*
*              �C/GUI is protected by international copyright laws. Knowledge of the
*              source code may not be used to write a similar product. This file may
*              only be used in accordance with a license and should not be redistributed
*              in any way. We appreciate your understanding and fairness.
*
----------------------------------------------------------------------
File        : GUI_X.C
Purpose     : Config / System dependent externals for GUI
---------------------------END-OF-HEADER------------------------------
*/
#include "tn.h" // 用到tn_task_sleep(xx);函数
#include "GUI.h"
#include "GUI_X.h"

/*********************************************************************
*
*       Global data
*/
volatile int OS_TimeMS;

/*********************************************************************
*
*      Timing:
*                 GUI_X_GetTime()
*                 GUI_X_Delay(int)

  Some timing dependent routines require a GetTime
  and delay function. Default time unit (tick), normally is
  1 ms.
*/

int GUI_X_GetTime(void) { 

  OS_TimeMS = tn_sys_time_get(); // TN的TICK计数器

  return OS_TimeMS; 
}

void GUI_X_Delay(int ms) { 
  //int tEnd = OS_TimeMS + ms;
  //while ((tEnd - OS_TimeMS) > 0);

  tn_task_sleep(ms); // // TN的系统廷时
}

/*********************************************************************
*
*       GUI_X_Init()
*
* Note:
*     GUI_X_Init() is called from GUI_Init is a possibility to init
*     some hardware which needs to be up and running before the GUI.
*     If not required, leave this routine blank.
*/

void GUI_X_Init(void) {}


/*********************************************************************
*
*       GUI_X_ExecIdle
*
* Note:
*  Called if WM is in idle state
*/

void GUI_X_ExecIdle(void) {tn_task_sleep(1);}

/*********************************************************************
*
*      Logging: OS dependent

Note:
  Logging is used in higher debug levels only. The typical target
  build does not use logging and does therefor not require any of
  the logging routines below. For a release build without logging
  the routines below may be eliminated to save some space.
  (If the linker is not function aware and eliminates unreferenced
  functions automatically)

*/

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); }
                                                                                                                                                                                                                                                                                                                                                                                                                                                             

哈哈,这里把TNeo套路进去了吧?

 

还有一些其他细节,我是SPI接口的LCD屏,先要对STM32的SPI外设进行初始化的,我是放在这里:

 

 

还有一个就是LCD屏的初始化,是放在LCDTemplate.c的,这里我没有使用GUIConf.h宏定义,直接放进LCDTemplate.c:

/*********************************************************************
*
*       LCD_L0_Init
*
* Purpose:
*   Initialises the LCD-controller.
*/
int  LCD_L0_Init(void) {
  //LCD_INIT_CONTROLLER();//--GUI原来的
  Lcd_Initialize();  //-- SPI_LCD初始化
  return 0;
}

 

如何让GUI实时更新呢?资料显示是定期调用GUI_Exec(); 

我呢就直接放在TNeo空闲函数里,有什么不可以的??

//-- 空闲回调,从空闲任务中定期调用
void idle_task_callback (void)
{
  GUI_Exec(); // 让GUI更新屏,触面板也可以放在这里
}

 

 

最后用OS的任务,让ucGUI打印一串字符:

void task_d_body(void *par)
  {
   printf("New task d is OK!\n");
   for(;;)
   {
         GUI_DispStringAt("hello,I am ucGUI!!!",5,5);
         tn_task_sleep(500);
   }
  }

在线仿真如下图: 

 

 这一套操作下来以后,也试了一下横屏与坚屏的功能,发现也是正常的:

LCDConf.h坚屏参数:

/*-********************************************************************
*
*                   General configuration of LCD
*
**********************************************************************
*/

#define LCD_XSIZE      (240)   /* X-resolution of LCD, Logical coor. */
#define LCD_YSIZE      (320)   /* Y-resolution of LCD, Logical coor. */

#define LCD_BITSPERPIXEL (16)  // 16bit  RGB565

#define LCD_CONTROLLER -1  //  使用LCDTemplate.c这份文件

#define LCD_SWAP_RB 1      //  RGB的红色 蓝色对换 

#define LCD_SWAP_XY    (1)    /* 由横屏变成竖屏 */
#define LCD_MIRROR_Y   (0)
#define LCD_MIRROR_X   (1)

实物效果:

  

LCDConf.h横屏参数:

#define LCD_XSIZE      (324)   /* X-resolution of LCD, Logical coor. */
#define LCD_YSIZE      (240)   /* Y-resolution of LCD, Logical coor. */

#define LCD_BITSPERPIXEL (16)  // 16bit  RGB565

#define LCD_CONTROLLER -1  //  使用LCDTemplate.c这份文件

#define LCD_SWAP_RB 1      //  RGB的红色 蓝色对换 

#define LCD_SWAP_XY    (0)    /* 由横屏变成竖屏 */
#define LCD_MIRROR_Y   (0)
#define LCD_MIRROR_X   (0)

#define LCD_REVERSE    (0)  // 翻转颜色,比如白色变黑色等等

实物效果:

 

 到此为止已经打开了ucGUI的大门了,再见!

 === END ===

posted on 2022-03-28 11:16  木子剑  阅读(429)  评论(0编辑  收藏  举报