ucGUI3.9版本快速移植构建


在之前的博客中移植了STemwin5.32版本的,最近更换了 GD芯片所以STemwin没法用了,只有移植emwin或者是ucGUI所有芯片都可以用了!
之前都是分散修改GUIxxx.c文件或者GUIxxx.h文件,现在打包成一个接口文件和一个库文件,不用再折腾了,累。。。

移植前提条件

参考博客STemwin的移植

涉及文件

  • emwPort.c–修改驱动
  • emwPort.h–修改配置
  • ucGUI3.9.a
  • 一堆ucGUI的头文件,无需改

移植过程

修改绘制驱动文件

ucGUI底层将调用以下绘制函数,必须对画点函数进行填充

/**
 *  @file: emwPort.c
 *
 *  @date: 2020/5/8
 *
 *  @author: aron566
 *
 *  @brief:emwin 移植接口
 *
 *  @version:v1.0
 */
#ifdef __cplusplus ///<use C compiler
extern "C" {
#endif
/** Includes -----------------------------------------------------------------*/
/* Private includes ----------------------------------------------------------*/
#include "emwPort.h"
#include "GUI.h"
/** Private typedef ----------------------------------------------------------*/
/** Private macros -----------------------------------------------------------*/
/** Private constants --------------------------------------------------------*/
/** Public variables ---------------------------------------------------------*/
/** Private variables --------------------------------------------------------*/
/** Private function prototypes ----------------------------------------------*/
/** Private user code --------------------------------------------------------*/

/** Public application code --------------------------------------------------*/
/*******************************************************************************
*
*       Public code
*
********************************************************************************
*/
/******************************************************************
  * @brief   读取个某点的颜色值
  * @param[in]   x,y:坐标
  * @return  此点的颜色
******************************************************************/
uint32_t EMPORT_LCD_ReadPoint(int x, int y)
{
    return *(uint16_t*)((uint32_t)ltdc_layer1[0] + 2 * (EMPORT_LCD_X_PIXEL * y + x));
}
 
 
/******************************************************************
  * @brief   画点
  * @param[in]   x,y:坐标  color:颜色
  * @return None
******************************************************************/
void EMPORT_LCD_DrawPoint(int x ,int y ,uint32_t color)
{
      uint16_t *TargetAddr = (uint16_t*)((uint32_t)ltdc_layer1[0] + 2 * (EMPORT_LCD_X_PIXEL * y + x));
      *TargetAddr = (uint16_t)color;
}
 
/******************************************************************
  * @brief   在指定区域内填充单个颜色
  * @param[in]   (sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex-sx+1)*(ey-sy+1)
  * @param[in]   color:要填充的颜色
  * @return     None
******************************************************************/
void EMPORT_LCD_Fill(int sx ,int sy ,int ex ,int ey ,uint32_t color)
{
      /*NEW Code*/
//      LCD_DrawFullRect(sx ,sy, ex+1, ey+1);
    for (; sy <= ey; sy++) 
    {
        EMPORT_LCD_DrawHLine(sx ,sy ,ex ,color);
    }
}

/**
  ******************************************************************
  * @brief   绘制横线
  * @param[in]   X起点
  * @param[in]   Y起点
  * @param[in]   X长度
  * @param[in]   颜色
  * @retval  None
  * @author  aron566
  * @version v1.0
  * @date    2020/5/9
  ******************************************************************
  */
void EMPORT_LCD_DrawHLine(int x0 ,int y, int x1 ,uint32_t color)
{
    for (; x0 <= x1; x0++) {
      EMPORT_LCD_DrawPoint(x0, y, color);
    }
}

/**
  ******************************************************************
  * @brief   绘制竖线
  * @param[in]   X起点
  * @param[in]   Y起点
  * @param[in]   Y长度
  * @param[in]   颜色
  * @retval  None
  * @author  aron566
  * @version v1.0
  * @date    2020/5/9
  ******************************************************************
  */
void EMPORT_LCD_DrawVLine(int x ,int y0 ,int y1 ,uint32_t color)
{
    for (; y0 <= y1; y0++) {
      EMPORT_LCD_DrawPoint(x, y0, color);
    }
}

/**
  ******************************************************************
  * @brief   GUI触摸接口 ,获取X坐标
  * @param   None
  * @retval  X坐标 
  * @author  aron566
  * @version v1.0
  * @date    2020/5/8
  ******************************************************************
  */
int EMPORT_Touch_GetPhyX(void)
{
    return 0;
}

/**
  ******************************************************************
  * @brief   GUI触摸接口 ,获取Y坐标
  * @param   None
  * @retval  Y坐标 
  * @author  aron566
  * @version v1.0
  * @date    2020/5/8
  ******************************************************************
  */
int EMPORT_Touch_GetPhyY(void)
{
    return 0;
}

/**
  ******************************************************************
  * @brief   GUI时基 放入1ms中断
  * @param   None
  * @retval  None 
  * @author  aron566
  * @version v1.0
  * @date    2020/5/8
  ******************************************************************
  */
void EMPORT_GUI_Inc_Ticks_Port(void)
{
    extern volatile GUI_TIMER_TIME OS_TimeMS;
    OS_TimeMS++;
}
#ifdef __cplusplus ///<end extern c
}
#endif
/******************************** End of file *********************************/

修改配置文件

emwPort.h

/**
 *  @file: emwPort.h
 *
 *  @date: 2020/5/8
 *
 *  @author: aron566
 *
 *  @brief:emwin 移植接口
 *  
 *  @version:v1.0
 */
#ifndef __EMWPORT_H
#define __EMWPORT_H
#ifdef __cplusplus ///<use C compiler
extern "C" {
#endif
/** Includes -----------------------------------------------------------------*/
#include <stdint.h> /**< nedd definition of uint8_t */
#include <stddef.h> /**< need definition of NULL    */
//#include <stdbool.h>/**< need definition of BOOL    */
#include <stdio.h>  /**< if need printf             */
#include <stdlib.h>
#include <string.h>
/** Private includes ---------------------------------------------------------*/
#include "cmsis_os.h"
#include "ipa.h"
/** Private defines ----------------------------------------------------------*/
/**
 * @name EMWIN移植配置
 * @{
 */
#define EMPORT_FRAME_BUFF_ADDR  ((void*)(LCD_FRAME_BUFFER+BUFFER_OFFSET))
#define EMPORT_BUFF_SIZE        (1024*20U)
#define EMPORT_BLOCKSIZE        (0x80)
#define EMPORT_USE_OS           (0)     /**< 启用OS     */
#define EMPORT_XSIZE_PHYS       (480)   /**< 配合显示方向的X像素*/
#define EMPORT_YSIZE_PHYS       (320)   /**< 配合显示方向的Y像素*/
#define EMPORT_LCD_X_PIXEL      (320)   /**< 实际X像素  */
#define EMPORT_LCD_Y_PIXEL      (480)   /**< 实际Y像素  */
#define EMPORT_LCD_BITSPERPIXEL (16)    /**< 像素位大小 */
#define EMPORT_LCD_FIXEDPALETTE (565)   /**< 颜色格式   */
#define EMPORT_LCD_SWAP_RB      (1)     /**< 红蓝交换   */
#define EMPORT_LCD_CONTROLLER   (566)   /**< 控制器名称 */
#define EMPORT_NUM_LAYERS       (1)     /**< 最大层级   */
#define EMPORT_SUPPORT_TOUCH    (0)     /**< 支持触摸   */
#define EMPORT_SUPPORT_UNICODE  (1)     /**< 支持UNICODE*/
#define EMPORT_SUPPORT_MOUSE    (0)     /**< 支持鼠标   */
#define EMPORT_WINSUPPORT       (1)
#define EMPORT_SUPPORT_MEMDEV   (1)
#define EMPORT_SUPPORT_AA       (1)     /**< 支持反锯齿 */
#define EMPORT_SUPPORT_DEVICES  (1)
#define EMPORT_SUPPORT_NOTIFY_VIS_CHANGED    (1)
#define EMPORT_DEFAULT_FONT     (&GUI_FontD24x32)  /**< 默认字体大小*/
#define EMPORT_COLOR_CONVERSION GUICC_M565//GUICC_565//GUICC_888
#define EMPORT_DISPLAY_DRIVER   GUIDRV_WIN32//GUIDRV_TEMPLATE

/**
 * @name EMWIN调整显示方向
 * @{
 */
/* 1 1 0 横竖屏切换 */
#define EMPORT_LCD_SWAP_XY      (1)    
#define EMPORT_LCD_MIRROR_X     (1)
#define EMPORT_LCD_MIRROR_Y     (0)
/** @}*/   
#define EMPORT_TOUCH_SWAP_XY    (1)
#define EMPORT_TOUCH_MIRROR_X   (0)
#define EMPORT_TOUCH_MIRROR_Y   (1)
#define EMPORT_CALIBRATION      (4000)
#define EMPORT_TOUCH_AD_LEFT    (300)
#define EMPORT_TOUCH_AD_RIGHT   (3700)
#define EMPORT_TOUCH_AD_TOP     (300)
#define EMPORT_TOUCH_AD_BOTTOM  (3700)
/** @}*/
/** Exported typedefines -----------------------------------------------------*/

/** Exported constants -------------------------------------------------------*/
/** Exported macros-----------------------------------------------------------*/
/** Exported variables -------------------------------------------------------*/
/** Exported functions prototypes --------------------------------------------*/
uint32_t EMPORT_LCD_ReadPoint(int x ,int y);
void EMPORT_LCD_DrawPoint(int x ,int y ,uint32_t color);
void EMPORT_LCD_Fill(int sx ,int sy ,int ex ,int ey ,uint32_t color);
void EMPORT_LCD_DrawHLine(int x0 ,int y, int x1 ,uint32_t color);
void EMPORT_LCD_DrawVLine(int x ,int y0 ,int y1 ,uint32_t color);
void EMPORT_GUI_Inc_Ticks_Port(void);
int EMPORT_Touch_GetPhyX(void);
int EMPORT_Touch_GetPhyY(void);
#ifdef __cplusplus ///<end extern c
}
#endif
#endif
/******************************** End of file *********************************/

打包进工程

三个文件夹:
INCLUDE ucGUI的一堆头文件
LIB 库文件
PORT ucGUI移植接口
在这里插入图片描述
加入工程,图为IAR工程,两个文件即可,接口文件,库文件,其他的头文件路径包含即可
在这里插入图片描述

涉及的资源获取

前往下载

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
最近在弄ucGUI移植,网上搜了不少资料,也问了同学,总算把简单的一个程序弄好了,现在跟大家分享下心得。该程序是直接用的原子大哥的TFTLCD显示的例子,直接拿过来移植的。所用到的是原子大哥TFTLCD例子(库函数版本)和ucGUI3.90源码。 建工程就不说了,附件里有,相信大家也看到别人建的工程了,下面直接说重点。 由于ucGUI移植笔记内容太多,就介绍其中几点(具体的还需看附件内容): 1. 如果LCD驱动文件是lcd.c和lcd.h,最好改为别的名字,比如ili93xx.c和ili93xx.h。然后还要把LCD_Init()初始化函数改为LCDx_Init(); 2. 需要改的地方: A. LCDConf.h中按照下面的图就行,其余的可以删除掉,注意红框中是刚刚改过的LCD初始化函数,改为刚刚更改的初始化函数就行。 B.接下来事GUIConf.h中的设置,目前只是用到简单的一个现实函数,多以就全部设为0 C. 这个是LCD驱动函数的修改,这三个最好改红框选中的文件。 接下来就是更改的第一块,首先的把第1部所更改的相应的LCD底层函数的头文件加进来,不然ucGUI没办法正常工作。然后就是第二个红框给为自己的驱动芯片型号。 再就是第二块,找到画蓝线的两个函数,用方框里的函数取代,如果是用原子大哥的,第一个函数必须要用快速画点函数,因为函数参数里有颜色这个参数,画点函数没有,如果是别的程序,也是一样,加入画点函数就行,但必须要有颜色的参数。第二个函数就是读取某点的颜色值的函数,加进来就行,我这儿直接就用了原子大哥的程序。 3. 最后修改主函数 有人纳闷了,为什么把LCD初始化函数 给注释掉了,没关系,在前面 文件中不是有个宏定义嘛 这个宏定义已经在 这个文件中调用,见下图哦 还有一项特别注意的,如果你用原子大哥的LCD初始化函数,移植完后,你会发现你的屏幕先白屏一下之后就马上黑屏,而且后面无论设置什么颜色都是这样的情况。在调用GUI_Init()的时候,这个函数会进入LCD_Init(),然后再LCD_Init()函数里面有这样的语句 #if (GUI_DEFAULT_BKCOLOR != GUI_INVALID_COLOR) /* Clear video memory */ LCD_SetDrawMode(GUI_DRAWMODE_REV); LCD_FillRect(0,0, GUI_XMAX, GUI_YMAX); LCD_SetDrawMode(0); #endif 这句#if (GUI_DEFAULT_BKCOLOR != GUI_INVALID_COLOR)里面的GUI_DEFAULT_BKCOLOR 初值是OXFFFF, GUI_INVALID_COLOR 初值也是0XFFFF,而原子哥的初始化函数最后有一句LCD_Clear(WHITE);这样就把 GUI_INVALID_COLOR 的值设置成了0X0000;导致调用了下面的三个函数。从而出现上面的问题。只要把 原子哥 的初始化函数LCD_Clear(WHITE); 注释掉就不会错了,小问题大错误。这是引用的hua290565456的帖子里的话,觉得很有用,就粘贴过来了。 这就是一个基本的ucGUI移植。该笔记放在附件了,有工程和源码,还有此贴的word文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aron566

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值