历史上的今天
返回首页

历史上的今天

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

正在发生

2018年11月20日 | STM32如何移植uCGUI,看这里!

2018-11-20 来源:eefocus

第一部分:在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,完全有你个人的系统所决定。


推荐阅读

史海拾趣

Altitude Technology公司的发展小趣事

Altitude Technology公司成立于一个科技迅猛发展的时代,创始人李华怀揣着对电子技术的热爱和对未来科技的憧憬,决定创立一家专注于高度集成和智能化电子产品研发的公司。初期,公司面临着资金短缺、人才匮乏等重重困难,但李华凭借对技术的深刻理解和敏锐的市场洞察力,带领团队开发出了一款具有划时代意义的智能手环,这款产品以其出色的性能和人性化的设计迅速在市场上获得了认可,为Altitude Technology公司赢得了第一桶金。

ABLIC公司的发展小趣事

在“2018慕尼黑上海电子展”上,ABLIC展示了其即将推出的紫外传感器。这一产品的推出,彰显了ABLIC在传感器领域的创新能力。紫外传感器在环境监测、安全防护等领域具有广泛应用前景。ABLIC凭借其在半导体技术方面的深厚积累,成功研发出具有高性能和稳定性的紫外传感器,为市场带来了新的选择。

华润微(CRMICRO)公司的发展小趣事

尽管面临市场终端景气度低迷等挑战,华润微依然保持稳健的发展态势。公司积极应对市场变化,通过优化产品结构、加大研发投入等措施,不断提升自身竞争力。同时,华润微也看到了新能源业务等领域的巨大潜力,将其作为未来发展的重要方向。通过不断的技术创新和市场拓展,华润微有望在电子行业中实现更加辉煌的成就。

Fermionics Lasertech Inc公司的发展小趣事

随着公司规模的不断扩大,Fermionics Lasertech Inc公司开始寻求国际合作与全球布局。他们与国外的知名企业和研究机构建立了紧密的合作关系,共同开展技术研发和市场拓展。同时,公司还在海外设立了多个分支机构和办事处,以便更好地服务当地客户。这些举措不仅提升了公司的国际影响力,还为公司的长期发展提供了有力保障。

Euvis Inc公司的发展小趣事

在技术创新的基础上,Euvis Inc公司积极拓展市场,通过与国际知名电子产品制造商的合作,将其产品应用于各类高端电子产品中。同时,公司注重品牌建设,通过一系列营销活动提升品牌知名度和美誉度。随着市场份额的不断扩大,Euvis Inc公司逐渐在电子行业中树立起了高端、可靠的品牌形象。

BusBoard公司的发展小趣事

BusBoard公司的创始人李明,是一位具有远见卓识的电子工程师。他看到电子行业正处于飞速发展的阶段,但市场上缺乏一种高效、灵活的电路板解决方案。于是,他毅然决然地创立了BusBoard公司,致力于研发和生产标准化的电路板总线板,为电子设备制造商提供便捷的定制和升级服务。通过不懈努力,BusBoard公司的产品在市场上获得了广泛认可,为公司的发展奠定了坚实基础。

问答坊 | AI 解惑

FPGA是什么?FPGA现状?如何学习FPGA?

FPGA是什么?FPGA现状?如何学习FPGA? FPGA介绍     FPGA是现场可编程门阵列的简称,FPGA的应用领域最初为通信领域,但目前,随着信息产业和微电子技术的发展,可编程逻辑嵌入式系统设计技术已经成为信息产业最热门的技术之一,应用范 ...…

查看全部问答>

对面的高手看过来,ST公司的数据结构啥意思

typedef union {   u16 whole;   struct   {     unsigned IMPLEMENTED : 1; /**< Indicates that the key is implemented (from Customer Code to TSL only) */     unsigned ENABLED&nb ...…

查看全部问答>

传一个周公的资料,起动代码详解

周公的起动代码都差不多,根据需要自己改一下就可以用,一个网友加了很详细的注释 …

查看全部问答>

三菱模块资料整理

三菱模块资料整理。都是些常用的功率模块的介绍、应用指南及其参数。对做功率驱动的有参考价值。…

查看全部问答>

放大电路在反馈电阻上加电容的作用?

本信息来自合作QQ群:电子工程师技术交流(12425841) 群主在坛子ID:Kata 请问:放大电路在反馈电阻上加电容,什么作用?…

查看全部问答>

如何在最短时间内了解并熟悉嵌入式系统(比如arm linux)的引导,加载,裁剪

要了解嵌入式系统(比如arm linux)的引导加载裁剪,需要看些什么书和资料(最好是免费可下载的资源)?…

查看全部问答>

永久注册表保存问题

我参照网上的操作,这样nk.bin能否通过网络下载运行。 我得出现错误: X86Init done, OEMAddressTable = 802261a8. OEMIoControl: Unsupported Code 0x101008c - device 0x0101 func 35 OEMIoControl: Unsupported Code 0x10100f8 - device 0x0 ...…

查看全部问答>

STM8S大家用库函数还是直接写寄存器?

本人觉得用库函数好烦,效率很低啊,例如要取消AD口的施密特触发器要每个口都要调一次,   ADC1_SchmittTriggerConfig(ADC1_SCHMITTTRIG_CHANNEL2, DISABLE);   ADC1_SchmittTriggerConfig(ADC1_SCHMITTTRIG_CHANNEL3, ...…

查看全部问答>

为何不进中断?

用C语言编程,dsp发SPWM波,怎么总也进不了中断? nclude \\\"2407.h\\\" #include \\\"math.h\\\" #include \\\"float.h\\\" #define     PI2      2*3.1415926 #define      ...…

查看全部问答>

各位老师好,请教一下STM8汇编的问题

各位老师好,小弟刚刚开始接触STM8,由于感觉单片机这种东西毕竟资源有限,所以想从汇编学起。对于STVD,有一个小问题想请教一下模板中生成了一个main.asm,我知道主程序都写在这里,不过我想把一些子程序单独做到一个.asm中,以方便以后的重复使用 ...…

查看全部问答>