历史上的今天
返回首页

历史上的今天

今天是:2024年11月20日(星期三)

正在发生

2018年11月20日 | 菜鸟福利!STM32学习之uCGUI移植详解

2018-11-20 来源:eefocus

以下内容大多是网上资源,我只做一些修改和结合,为的是能够方便更多的和我一样的菜鸟们搞懂GUI的移植。


第一部分:在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 (160) //配置TFT的水平分辨率

#define LCD_YSIZE (128) //配置TFT的垂直分辨率

#define LCD_CONTROLLER (54124) //TFT控制器的名称

#define LCD_BITSPERPIXEL (16) //每个像素的位数

#define LCD_FIXEDPALETTE (565) //调色板格式

#define LCD_SWAP_RB (0) //红蓝反色交换

#define LCD_INIT_CONTROLLER() TFT_Init() ; //此处需要定义的是你的TFT初始化函数

#endif /* LCDCONF_H */

配置GUIConf.h文件如下:

#ifndef GUICONF_H

#define GUICONF_H

#define GUI_OS (1) //多任务

#define GUI_SUPPORT_TOUCH (0) //触摸

#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 3601

#define GUI_TOUCH_AD_RIGHT 393

#define GUI_TOUCH_AD_TOP 273

#define GUI_TOUCH_AD_BOTTOM 3671

#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,完全有你个人的硬件板所决定。

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,完全有你个人的系统所决定。


推荐阅读

史海拾趣

HI Microwave Technology Limited公司的发展小趣事

人才是企业最宝贵的资源。HI Microwave高度重视人才培养和团队建设,通过引进和培养高素质的技术人才和管理人才,不断提升企业的核心竞争力。公司建立了完善的人才激励机制和培训体系,鼓励员工不断学习和创新。同时,公司还注重营造和谐、开放的企业文化氛围,激发员工的积极性和创造力。这些措施为公司的持续发展提供了有力的人才保障和智力支持。

DFI公司的发展小趣事

近年来,随着智能医疗和金融科技等新兴领域的兴起,DFI看到了新的发展机遇。公司开始将这些领域作为重点发展方向,投入大量资源进行研发和创新。通过与合作伙伴的紧密合作,DFI成功推出了一系列具有创新性的智能医疗和金融科技产品。这些产品不仅为客户提供了更便捷、更高效的服务体验,也为DFI带来了新的增长点。随着这些新兴领域的不断发展壮大,DFI有望在未来实现更大的突破和发展。

请注意,以上故事均为虚构,旨在展示DFI公司可能的发展历程和业务活动。实际情况可能有所不同,具体信息请参考DFI公司的官方资料。

EREM公司的发展小趣事

随着电子行业的不断发展,EREM公司也面临着越来越多的挑战。为了保持市场领先地位,EREM投入大量资金进行技术研发,推出了一系列具有创新性的产品。其中,一种新型的高硬度碳化钨合金剪钳因其卓越的耐用性和精度而备受好评。这一技术突破不仅为EREM赢得了更多客户,也进一步巩固了其在电子行业中的地位。

Chen Yang Technologies GmbH & Co KG公司的发展小趣事

在快速发展的过程中,Chen Yang Technologies始终重视内部管理和人才培养。公司推行了一系列创新的管理理念和措施,如扁平化管理、项目制运作等,这些措施有效提高了工作效率和团队协作能力。同时,公司还注重人才培养和引进,通过设立激励机制、提供培训和发展机会等方式,吸引和留住了一批优秀的技术人才和管理人才。

Hammond公司的发展小趣事

随着业务的发展,Chen Yang Technologies意识到单靠自身力量难以实现快速扩张。因此,公司开始积极寻求与其他电子行业巨头的战略合作。通过与这些公司的合作,Chen Yang Technologies不仅获得了更多的资金支持和技术资源,还成功进入了新的市场领域。这些合作使得公司的业务范围得到了极大的拓展,同时也提升了公司的品牌影响力。

Genisco Electronics公司的发展小趣事
根据负载的功率、电压、电流等需求选择合适的发电机容量和类型。

问答坊 | AI 解惑

短距离无线消费电子的RF前端设计

随着系统成本和功耗进一步降低以及产品性能的提高,无线短距离消费电子市场正高速增长。本文将向设计工程师介绍一些市场上出现的新趋势和方案,并介绍RFW102芯片组的特点和应用。 短距离无线应用是指可在最远100米范围内传输数据的解决方案。无线 ...…

查看全部问答>

初学者之---uClinux和Linux的异同分析

标准Linux是针对有MMU的处理器设计的。在这种处理器上,虚拟地址被送到MMU,把虚拟地址映射为物理地址。通过赋予每个任务不同的虚拟-物理地址转换映射,支持不同任务之间的保护。uClinux是针对控制领域的嵌入式linux操作系统,它从Linux 2.0/2.4内 ...…

查看全部问答>

Blinky

流水灯测试代码…

查看全部问答>

BIOS知识点滴Follow Bini系列之--PCI CLKRUN# & PCIE CLKREQ#

本帖最后由 paulhyde 于 2014-9-15 08:55 编辑 PCI设备的Pin定义上有CLOCK RUN这个Option信号 PCI Express设备有定义CLOCK REQUEST这个Option 这两个信号为了省电的目的而设的 先看PCI的CLKRUN#,如下图: 如果PCI Deivce A和B,某个或全部设 ...…

查看全部问答>

Quartus 9.0 破解后依然出现以下问题 已经弄了一周了,急需解决!

这是用SOPC builder 生成 cpu过程的 信息提示   我试过很多license了 但仍然是这个问题  正常生成的话 Encrypted license 貌似是不用found  问题出在哪儿呢?请各位大侠看看啊!谢谢啦!!! # 2010.11.26 00:33:16 ...…

查看全部问答>

哪位同胞有Boost DC_DC的小信号分析的论文

哪位同胞有Boost DC_DC的小信号分析的论文…

查看全部问答>

请教关于矩阵按键和DAC液晶显示的问题~

   我想用矩阵按键输入数据 然后送如DAC12中 经过DAC后在用12864显示出转换结果  :我用的是169的片子 主要问题是 我想用矩阵键盘输入以个4位数 如何将这个4位数送给430内部的DAC12   希望大侠们不惜赐教啊~谢谢了 ...…

查看全部问答>

进来看看吧,寻求各位帮忙解答一下。

我是msp430g2553初学者,我想问一下我手里有l298n电机驱动,直流电机一个,2553板子一块,我改怎样搭建让电机转动?谢谢大家帮帮忙指导一下。小弟感激不尽!…

查看全部问答>

51单片机波形发生器

最近在做单片机课设,要求用纯汇编语言,路过的大神点拨一下啊! 要求波形发生器。三种信号:正弦波、方波、三角波。利用DA转换器设计一波形发生器,要求波形的峰峰值(0-5v)、频率可调。(通过按键,功能键一个和增减键各一个,功能键短按用于切 ...…

查看全部问答>