UCGUI移植教程
基于STM32的uCGUI移植手册
STMI 移植手册(无 OS)
Revision V1.0
( 2013-08-05 )
Copyright © 2009-2014 福州芯嵌工作室 ALL rights reserved
1
芯嵌 stm32
Copyright © 2009-2014 福州芯嵌工作室 ALL rights reserved
5
芯嵌 stm32
芯嵌 STM32 用户手册修订记录
日期
版本 修改章节 修改描述
2013-08-05 1.00
全部
创建
作者 51smt32
Copyright © 2009-2014 福州芯嵌工作室 ALL rights reserved
本手册硬件平台是芯嵌 STM32 开发板,软件平台为 MDK3.8 版 本,使用 ST 官方固件库 V3.5 版以及 uC/GUI 源码 3.90 版。详情参 考芯嵌 stm32 开发板光盘,也可在芯嵌 stm32 官网下载获取。后续 会继续推出一系列提高型的教程,欢迎大家在我们论坛以及 QQ 群讨 论交流,一起进步。这里建议,大家提出的问题,越详细具体越好, 这样越有利于其他网友帮助回答问题。
版权声明
本手册版权归属福州芯嵌电子工作室(以下简称“芯嵌”) 所有,并保留一切权力。非经芯嵌同意(书面形式),任何 单位及个人不得擅自摘录本手册部分或全部内容,违者(我 们)公司将追究其法律责任。
Copyright © 2009-2014 福州芯嵌工作室 ALL rights reserved
2
芯嵌 stm32
6
芯嵌 stm32
目录
内容提要...........................................................................................................................................3 前 言.................................................................................................................................................4 手册的约定与更新........................................................................................................................... 5 目录...................................................................................................................................................7 第一章 准备工作.............................................................................................................................8 1.1 uC/GUI 源码获取....................................................................................................................... 8 1.2 集成开发环境 MDK..................................................................................................................8 1.3 硬件平台....................................................................................................................................8 1.4 J-Link 仿真器............................................................................................................................. 9 第二章 uC/GUI 介绍........................................................................................................................9 2.1 uC/GUI 特点............................................................................................................................... 9 2.2 uC/GUI 源码结构.................................................................................................................. 10 第三章 uC/GUI 移植.......................................................................................................................13 3.1 uC/GUI 移植思路..................................................................................................................... 13 3.2 uC/GUI 移植全跟踪................................................................................................................. 14 第四章 uC/GUI 的使用..................................................................................................................22 4.1 uC/GUI 常见 API 介绍.............................................................................................................22 4.2 制作自己的图形界面.............................................................................................................. 23 5 参考文献.....................................................................................................................................24 6 附 录...........................................................................................................................................24 6.1 ILI9341 初始化代码.................................................................................................................24
ucGUI移植详细设计及总结
ucGUI移植详细设计及总结序本文档阐述了将ucGUI移植到IM12上的过程。
ucGUI版本为3.9,移植到IM12上,触摸屏及按键能够正常使用。
在ucGUI源码包的基础上,添加了一些接口函数以适应IM12,在使用时应该根据情况使用这些接口,这些新增加的函数的接口将在后面章节中详细讲述。
此外,适应IM12的ucGUI在Wind River Workbench 3.0环境下被编译成两个静态库文件libNoWindow.a和libWindow.a,编译程序时应该连接这两个库。
文档篇章安排如下:第一章,ucGUI源码包简介。
主要介绍了所使用的ucGUI图形库中各文件夹的内容及功能,并对IM12中与ucGUI移植相关的部分,包括触摸屏、LCD、按键板等进行了简单的介绍。
第二章,图形库移植。
阐述如何对ucGUI进行配置、编译,以在IM12的LCD上显示图形,此部分还未实现触摸屏及按键功能,只是纯粹的显示而已第三章,触摸屏移植。
第四章,按键移植。
第五章,带触摸屏及按键功能的ucGUI应用程序模板。
第一章ucGUI源码包简介ucGUI要移植到im12上,实际上就是根据im12的情况修改ucGUI中的一些配置项,或增加、删减一些程序以适应im12,同时要保持ucGUI的特性。
要做好移植工作,需对ucGUI 及IM12相关部分有足够的了解。
1.1ucGUI简介移植所采用的ucGUI版本为3.9,主要包含的文件夹如图1所示图1 ucGUI源码结构图各文件夹的主要内容如下:Config ----------- 配置文件GUI ----------- 源代码GUI_X ---------- 操作系统接口函数定义文件GUI 源代码文件:1)AntiAlias: 抗锯齿显示效果支持。
2)ConvertColor: 彩色显示的色彩转换支持。
3)ConvertMono: (b/w)和灰度显示的色彩转换支持。
4)Core: 核心文件,提供了GUI基本的功能。
UCGUI移植
移植UCGUI只需要修改3个文件:GUIConf.h,LCDConf.h,LCDDummy.c,并从源代码的Sample/GUI_X文件夹下复制GUI_X.c文件到工程的GUILib/Config目录下1、GUIConf.h刚开始移植的时候是没有RTOS的,LCD也不是触摸屏,所以GUI_OS和GUI_SUPPORT_TOUCH都定义为0,其他宏不需要修改2、LCDConf.hLCD_XSIZE、LCD_YSIZE和LCD_BITSPERPIXEL根据开发板LCD的配置定义,我用的屏的分辨率是480*272的,16位RGB;LCD_CONTROLLER必须定义成-1,表示使用自己定义的LCD驱动,这个LCD驱动是通过修改LCDDummy.c模板来实现的,因为LCDDummy.c中开始部分要判断宏LCD_CONTROLLER是否等于-1,如果不等于-1,LCDDummy.c中的内容不会被编译,当然LCD_CONTROLLER也可以定义成其他植,但和LCDDummy.c中一定要对应起来,而且不能等于UCGUI自带的LCD驱动号LCD_ON和LCD_OFF一定要定义,因为LCDDummy.c中的LCD_On()和LCD_Off()函数先判断相应的宏是否被定义,如果没定义则不会执行函数体中的内容UCGUI的初始化过程中的LCD部分是通过GUI_Init()(GUICore.c)->LCD_Init()(LCD.c)->LCD_L0_Init()(LCD_Dummy.c)实现的,因为LCDDummy.c中的LCD初始化函数LCD_L0_Init()调用LCD_INIT_CONTROLLER()宏来调用自定义的LCD初始化函数,所以要将宏LCD_INIT_CONTROLLER()定义成自定义的LCD 初始化函数GLCD_Init()。
也可以在不用修改LCD_INIT_CONTROLLER()宏,而是在LCD_L0_Init()直接调用GLCD_Init()3、LCDDummy.cLCDDummy.c文件中需要修改的函数有:1)、void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)2)、void LCD_L0_GetPixelIndex(int x, int y)3)、void LCD_On(void)4)、void LCD_Off(void)5)、int LCD_L0_Init(void)修改如下:其中395行的SetPixelIndex函数,422行的GetPixelIndex函数,536行的GLCD_On函数,542行GLCD_Off函数都是自己在LCD驱动文件中定义的函数,LCD_INIT_CONTROLLER()也被定义成LCD驱动文件中的LCD初始化函数4、LCD驱动文件1)、头文件drv_glcd.h:#include "lpc_types.h"#include "sdram_mt48lc2m32lfb5.h"#ifndef __GLCD_DRV_H#define __GLCD_DRV_H#define C_GLCD_PIX_CLK 9000000#define C_GLCD_REFRESH_FREQ (50HZ)#define C_GLCD_H_SIZE 480#define C_GLCD_H_PULSE 41#define C_GLCD_H_FRONT_PORCH 2#define C_GLCD_H_BACK_PORCH 2#define C_GLCD_V_SIZE 272#define C_GLCD_V_PULSE 10#define C_GLCD_V_FRONT_PORCH 2#define C_GLCD_V_BACK_PORCH 2#define LCD_RED 0xf800 /* red color */#define LCD_GREEN 0x07e0 /* green color */#define LCD_BLUE 0x001f /* blue color */#define LCD_BLACK 0x0000 /* black color */#define LCD_WHITE 0xffff /* white color */#define C_GLCD_PWR_ENA_DIS_DL Y 10000#define C_GLCD_ENA_DIS_DL Y 10000extern uint16_t LCD_Frame_Buffer[C_GLCD_H_SIZE * C_GLCD_V_SIZE];void GLCD_Init(void);void GLCD_Ctrl(BOOLEAN bEna);void SetPixelIndex(int x, int y, int PixelIndex);uint16_t GetPixelIndex(int x, int y);void GLCD_On(void);void GLCD_Off(void);#endif // __GLCD_DRV_H2)、drv_glcd.c文件#include <stdio.h>#include <stdlib.h>#include <assert.h>#include "board.h"#include "sdram_mt48lc2m32lfb5.h"#include "drv_glcd.h"#include "lpc177x_8x_clkpwr.h"#include "lpc177x_8x_pinsel.h"uint16_t LCD_Frame_Buffer[C_GLCD_H_SIZE * C_GLCD_V_SIZE];/************************************************************************** Function Name: GLCD_Init* Parameters: const uint32_t *pPain, const uint32_t * pPallete** Return: none** Description: GLCD controller init**************************************************************************/ void GLCD_Init(void){uint32_t i;//uint32_t *pDst = (uint32_t *)LCD_Frame_Buffer;//uint32_t p0,p1,p2,p3;/*Back light enable*///Turn on LCD clockCLKPWR_ConfigPPWR(CLKPWR_PCONP_PCLCD, ENABLE);// Disable cursorLPC_LCD->CRSR_CTRL &=~(1<<0);// disable GLCD controllerLPC_LCD->CTRL = 0;// 16 bppLPC_LCD->CTRL &= ~(0x07 <<1);LPC_LCD->CTRL |=(6<<1);// TFT panelLPC_LCD->CTRL |= (1<<5);// single panelLPC_LCD->CTRL &= ~(1<<7);// notmal output// LPC_LCD->CTRL &= ~(1<<8);LPC_LCD->CTRL |= (1<<8);// little endian byte orderLPC_LCD->CTRL &= ~(1<<9);// little endian pix orderLPC_LCD->CTRL &= ~(1<<10);// disable powerLPC_LCD->CTRL &= ~(1<<11);// init pixel clockLPC_SC->LCD_CFG = 1;//CLKPWR_GetCLK(CLKPWR_CLKTYPE_PER) / ((uint32_t)C_GLCD_PIX_CLK);// bypass inrenal clk dividerLPC_LCD->POL |=(1<<26);// clock source for the LCD block is HCLKLPC_LCD->POL &= ~(1<<5);// LCDFP pin is active LOW and inactive HIGHLPC_LCD->POL |= (1<<11);// LCDLP pin is active LOW and inactive HIGH// LPC_LCD->POL |= (1<<12);LPC_LCD->POL &= ~(1<<12);// data is driven out into the LCD on the falling edge// LPC_LCD->POL |= (1<<13);LPC_LCD->POL &= ~(1<<13);// active highLPC_LCD->POL &= ~(1<<14);LPC_LCD->POL &= ~(0x3FF <<16);LPC_LCD->POL |= (C_GLCD_H_SIZE-1)<<16;// init Horizontal TimingLPC_LCD->TIMH = 0; //reset TIMH before set valueLPC_LCD->TIMH |= (C_GLCD_H_BACK_PORCH - 1)<<24;LPC_LCD->TIMH |= (C_GLCD_H_FRONT_PORCH - 1)<<16;LPC_LCD->TIMH |= (C_GLCD_H_PULSE - 1)<<8;LPC_LCD->TIMH |= ((C_GLCD_H_SIZE/16) - 1)<<2;// init Vertical TimingLPC_LCD->TIMV = 0; //reset TIMV value before settingLPC_LCD->TIMV |= (C_GLCD_V_BACK_PORCH)<<24;LPC_LCD->TIMV |= (C_GLCD_V_FRONT_PORCH)<<16;LPC_LCD->TIMV |= (C_GLCD_V_PULSE - 1)<<10;LPC_LCD->TIMV |= C_GLCD_V_SIZE - 1;// Frame Base Address doubleword alignedLPC_LCD->UPBASE = (uint32_t)LCD_Frame_Buffer & ~7UL ;LPC_LCD->LPBASE = (uint32_t)LCD_Frame_Buffer & ~7UL ;for(i = C_GLCD_ENA_DIS_DL Y; i; i--);return ;}/************************************************************************* * Function Name: GLCD_Ctrl* Parameters: Bool bEna** Return: none** Description: GLCD enable disabe sequence**************************************************************************/void GLCD_Ctrl (BOOLEAN bEna){volatile uint32_t i;if (bEna){// LCD_CTRL_bit.LcdEn = 1;LPC_LCD->CTRL |= (1<<0);for(i = C_GLCD_PWR_ENA_DIS_DL Y; i; i--);// LCD_CTRL_bit.LcdPwr= 1; // enable powerLPC_LCD->CTRL |= (1<<11);}else{// LCD_CTRL_bit.LcdPwr= 0; // disable powerLPC_LCD->CTRL &= ~(1<<11);for(i = C_GLCD_PWR_ENA_DIS_DL Y; i; i--);// LCD_CTRL_bit.LcdEn = 0;LPC_LCD->CTRL &= ~(1<<0);}}void SetPixelIndex(int x, int y, int PixelIndex){if ((x < C_GLCD_H_SIZE) && (y < C_GLCD_V_SIZE)) {LCD_Frame_Buffer[x + y * C_GLCD_H_SIZE] = (uint16_t)PixelIndex;}}uint16_t GetPixelIndex(int x, int y){if ((x < C_GLCD_H_SIZE) && (y < C_GLCD_V_SIZE)) {return LCD_Frame_Buffer[x + y * C_GLCD_H_SIZE];}return 0;}void GLCD_On(void){uint32_t i;// LCD_CTRL_bit.LcdEn = 1;LPC_LCD->CTRL |= (1<<0);for(i = C_GLCD_PWR_ENA_DIS_DL Y; i; i--);// LCD_CTRL_bit.LcdPwr= 1; // enable powerLPC_LCD->CTRL |= (1<<11);}void GLCD_Off(void){uint32_t i;// LCD_CTRL_bit.LcdPwr= 0; // disable power LPC_LCD->CTRL &= ~(1<<11);for(i = C_GLCD_PWR_ENA_DIS_DL Y; i; i--); // LCD_CTRL_bit.LcdEn = 0;LPC_LCD->CTRL &= ~(1<<0);}。
基于STM32的UCGUI移植解析(新手入门)
-----------------如何建立一个简单的 UC/GUI 工程
仅供像我这样的新手学习 UCGUI 使用
做 UCGUI 移植,首先要选择好自己硬件平台,UCGUI 源码,液晶的底层驱 动。关于硬件和 GUI 源码(我选的源码 3.90 版,原子 STM32MINI 开发板)不 必多说。其次,液晶的底层驱动函数得要好好准备,这可是直接和 GUI 源码打 交道的。
(7) 修改:LCDDriver / LCDDummy.c 文件 方法:在这里面添加几个函数,关于这几个函数就是我在开始列举
的几个函数 LCD_ReadPoint(u16 x, u16 y);//读取点坐标 LCD_SetPoint(u16 x, u16 y, u16 color );//画点 你的函数也许不是这个名字哦,大家不要照搬,这是你自己的驱动函数, 在哪里添加这两个函数呢,不要着急,听我来说,
还有一个问题,网上有人说触摸用不到,可以不用添加,然后字体也只
添加几个用得到的,我的意见是:全部添加,避免难以修改的 KEIL 警告, 这点很重要,我是新手,我很清楚怎么过来的,呵呵呵。
(4):文件添加完了,还有一步呢,还要在添加路径。点击魔术棒,出现一 个选项卡,点击 C/C++,在 Include Paths 里包含文件路径,所有文件的都 要包进来哦。能玩移植的朋友们,我相信(3)(4)两步对你们来说不难。
(2):复制 源码/Sample/GUI_X 文件夹下的 GUI_X.c 文件,粘贴到工程 模板下的 Config 里; 图片指示:
(3):打开 KEIL 工程(事先准备好的),KEIL 界面左边有个 Project 视窗, 在 Target1 单击右键,出现一个选项卡,在 Groups 里创建各文件,然后依 次 Add Files,即添加.c .h 文件,这里要着重说明:添加文件的时候,尤 其是 GUI 源码,文件类型选择 ALL Files(系统默认.c 文件),就是为了添 加.h 文件,这一点很重要。举个例子吧,在 Config 文件夹下要添加 GUI_X.c GUIConf.h GUITouch.h LCDConf.h。
在STM32上移植ucGUI之触摸屏
在STM32上移植ucGUI之触摸屏之前的三篇文章分别介绍了如何在STM32 裸机上移植ucGUI,移植ucGUI 源例程以及ucGUI 的存储设备和抗锯齿。
现将STM32 裸机上移植ucGUI 触摸屏的过程详述如下:1、将正点原子的《触摸屏移植实验》中HARDWRAE/TOUCH 目录复制到已经建立好的ucGUI 工程目录的HARDWARE 文件夹下,并添加touch.c 文件和头文件路径。
2、打开ucGUI 工程中的GUIConf.h 文件,将其中的GUI_SUPPORT_TOUCH 和GUI_WINSUPPORT 总开关打开。
如下所示:1#define GUI_SUPPORT_TOUCH 1 /* Support a touch screen (req. win-manager) */2#define GUI_WINSUPPORT 1 /* Window manager package available */此时编译程序,会出现四个函数未定义的错误。
3、在GUI_X 中添加文件GUI_X_Touch.c,此时编译工程错误消失。
4、在GUI_X_Touch.c 中添加预处理命令#include “touch.h”。
然后将其中的GUI_TOUCH_X_MeasureX 和GUI_TOUCH_X_MeasureY 两个函数改为如下所示的形式:01intGUI_TOUCH_X_MeasureX(void) {02u16x,y;03Read_ADS2(&x,&y);04returnx;05}0607intGUI_TOUCH_X_MeasureY(void) {08u16 x,y;09Read_ADS2(&x,&y);10returny;11}5、由于是在裸机上运行ucGUI程序,对话框程序会阻塞当前进程的执行。
所以需要在定时器中断中不断的去扫描触摸屏的状态。
设置定时器10ms 中断一次,在定时器中断处理函数中加入GUI_TOUCH_Exec()语句。
UCGUI 3.90a移植过程
升到 5 版本后,keil 变成了 keil_v5,更改后就好了,就不会再出现没有#include <stdlib.h>找不到的编译错误。不知道是不是我自己个例。 ③屏幕没显示,看看有没有看背光,没有鼠标,看看有没有开鼠标,GUI_CURSOR_Show()。 移植的 SPI 读触摸函数,看看是不是端口都初始化了,以及该端口的时钟都使能了。 ④有 uCOS ii 操作系统,触摸就不用写中断函数,加个 10ms 任务就好了,十分方便,也可 以写到滴答中断中。
#endif /* GUITOUCH_CONF_H */
最重要的就是这个触摸的 AD 值,一般来说买屏幕自带的触摸例程里都能找到换算成坐 标的例子,如:
如果没有,就自己拿 SPI 读触摸 IC 的函数,去取得四个角的 AD 值。如果后面发现触摸 鼠标方向反了,就可以更改这个的上下顺序,或左右顺序。 第五步,修改 GUITouchConf.h
#define GUI_TOUCH_AD_LEFT #define GUI_TOUCH_AD_RIGHT #define GUI_TOUCH_AD_TOP #define GUI_TOUCH_AD_BOTTOM
3750 380 330 3900
#define GUI_TOUCH_SWAP_XY 0 #define GUI_TOUCH_MIRROR_X 0 #define GUI_TOUCH_MIRROR_Y 0
UCGUI 3.90a 移植过程+触摸
2016.12.20 weiyi 1.需要准备好 TFT 屏的驱动函数,最重要的是初始化函数和画点函数。 2.下载 UCGUI 3.90a 的完整包。
3.把 Config 和 GUI 这 2 个文件夹复制到 MDK 工程目录下。在 MDK 中把文件都添加进去, 并添加路径。这都是很基础的前期工作。
uCGUI简单移植
嵌入式图形用户界面uc/gui在nios II上的移植uc/gui是一个优秀的嵌入式图形用户界面,这几天的工作就是将它移植到nios II系统上。
前人也做了一些工作,不过大部分都是针对其他硬核处理器,针对nios II软核处理器的移植资料那简直是凤毛麟角。
在阅读了相关文档后,我决定自己亲自动手实践,这下面的很多过程都是自己摸索出来的,并通过了实验的验证。
这只是一个初步的移植,也许在以后的更复杂的应用中,还需要对其进行调整。
但对目前我的应用而言,应该足够了。
写这篇文章的目的一是由于自己记性不好,所以需要给自己留个备忘,免得以后忘的一干二净;二是给有需要的朋友提供一些参考,也好相互交流,共同进步。
请大家多提宝贵意见。
一、源码和文档下载/上有很多不同版本的源码下载,目前能下到的最新版本是3.98,不过还有一些组件不是很完整,但作基础开发已经够用了。
ucgui3.98源码下载地址:uC-GUI-V3-98.zip。
ucgui最新版用户手册下载地址:uC-GUI-user.rar。
开发软件:quartus II 6.0, Nios II IDE 6.0。
二、移植过程先来看看解压后都有些什么东西:如图,核心的东西包括Config和GUI两个文件夹,这里面是ucgui的所有源码和配置文件。
ConvertColor包含彩色转换函数,ConvertMono包含灰度到彩色转换的函数,Core包含核心程序,Font是字体文件,LCDDriver包含多种控制器驱动,Widget是窗口控件库,WM是窗口库,提供复杂的功能。
其他文件夹包含一些应用范例以及一些有用的工具,留待慢慢探索。
1、config文件的移植:Config文件夹是ucgui的配置文件夹,里面有3个文件:GUIConf.h:gui的基本属性配置文件,有很多开关可以配置,具体可以参考ucgui的用户手册,这里只需配置几个必要的参数如下:#ifndef GUICONF_H#define GUICONF_H#define GUI_OS (1) /* 支持操作系统,nios系统自带了ucosII,所以我们选择此项,使gui支持该操作系统*/#define GUI_SUPPORT_TOUCH (0) /* 支持触摸屏,由于暂时没有用触摸屏,所以关掉这个开关*/#define GUI_SUPPORT_MOUSE (0) /* 支持鼠标,暂时关闭*/#define GUI_SUPPORT_UNICODE (1) /* Unicode字符串支持*/#define GUI_DEFAULT_FONT &GUI_Font6x8/* 默认字体*/#define GUI_ALLOC_SIZE 12500/* WM和memery device分配的内存*/ #define GUI_WINSUPPORT 1 /* Window manager available */#define GUI_SUPPORT_MEMDEV 0 /* Memory devices available,由于下载到的源代码中缺少memery device组件的源码,所以关闭此项*/#define GUI_SUPPORT_AA 1 /* Anti aliasing available */#endif /* Avoid multiple inclusion */LCDConf.h:LCD控制器的硬件配置文件,这个文件与硬件直接相关,一般是根据你所使用的LCD的类型和所用的LCD控制器的类型来配置。
uCGUI(emWin)的应用与移植
uCGUI(emWin)的应用与移植uC/GUI(emWin)的应用与移植 2006-11-19 01:38当你开始使用emWin进行编程时,通常遵循以下的步骤:第1步:配置emWin第一步通常是通过修改头文件LCDConf.h来配置emWin。
LCDConf.h中的宏定义描述了LCD显示部分硬件特性;根据你的具体情况修改这些宏定义(例如显示屏的长、宽,每像素点用几位表示,LCD控制器的类型等参数)。
第2步:定义LCD的底层驱动函数底层函数包括对LCD(控制器)的初始化函数,LCD显示缓冲区的读写函数等,完成对LCD显示硬件的直接操作。
对于映射在系统存储器上的LCD,对显示缓冲区的操作仅需要在LCDConf.h中进行定义就可以了。
但对于采用I/O端口/缓冲区操作的LCD,就必须定义相应的接口函数了。
第3步:编译,链接和测试例子代码emWin对于单任务和多任务环境下的应用都提供了例子代码。
在编程之前,对这些例子代码进行编译、链接和测试,使你能够初步了解这些代码的使用。
第4步:修改例子程序对例子代码作少量的修改。
逐步添加一些额外的指令,例如显示不同大小的文字,显示多行等等,从而进一步理解代码的应用。
第5步:emWin的多任务应用,加入到你的操作系统中如果你的系统有可能多个任务同时对显示进行操作,这时就要用到GUITask.C文件中的GUI_MAXTASK和GUI_OS宏。
第6步:采用emWin编写你自己的应用到这一步你应该对怎样使用emWin有一个清楚的了解了。
考虑如何采用emWin提供的函数来构建你的应用,并通过阅读手册来获得各函数更详细的功能和使用上的信息。
emWin的移植移植是指对emWin进行配置和修改,使它能够在你的目标系统上运行。
参考第3.4节中的第一步和第二步,移植工作主要是针对配置头文件中的宏定义进行修改。
这些宏包括:1. LCD宏,定义了显示的尺寸和一些可选择的特性(例如镜像,等等)2.LCD控制器宏,定义了怎样对控制器进行操作。
emWin522(uCGUI)图形用户接口移植详细实例_STM32_2013_12_30
emWin 5.22 (uCGUI) 图形用户接口移植实例——STM32作者:Ach日期:2013年12月29日联系方式:ox000008@1.概要移植图形用户接口的好处是不言而喻的。
本文图文并茂地介绍了一个emWin 5.22(uCGUI)的移植实例。
文章具体分为emWin简介,硬件平台简介,开发环境及项目简介,移植过程以及总结几个部分。
2.emWin简介emWin是一种高效的而图形用户界面,是我们能够摆脱处理器和显示控制器而更专注于GUI的设计。
这里借用STemWin的一幅图来说明emWin的作用和结构。
它通过LCD及GUI的配置来驱动底层硬件,而应用程序又是通过调用emWin来实现各种GUI。
5.22版的emWin带有许多常用的显示控制器的驱动(在参考手册Display Driver一章中有详细介绍),因此为我们移植带来了诸多方便。
emWin的更详细的内容可参照它的参考手册。
图1. emWin在项目中的结构3.硬件平台简介笔者使用的是一块以STM32F103VET6为核心的ARM开发板,没有外部的SRAM及Flash。
显示屏为2.8”320*240的彩色液晶屏,屏的驱动芯片为ILI9341(emWin 5.22带有它的驱动)。
屏与CPU 的连接方式为该ARM核心所特有的FSMC_SRAM方式,访问LCD内容时操作就如同读写SRAM一样方便。
如果你想使用其它硬件平台来移植emWin,本文亦有一定的参考价值。
希望本文能助你成功移植emWin。
图2. 硬件平台4.开发环境简介笔者所使用的开发软件为MDK-ARM 4.70。
项目模板使用的是STemWin库中的(可从ST官方下载)。
图3. 项目截图如图,项目下面有3个文件夹,其中Appli存放的是应用层的程序,第二个文件夹就如文件名,存放了emWin5.22所有部件,第三个文件夹存放了一些STM32及其它的库。
具体见附件。
5.移植过程有了MDK-ARM以及STemWin库,整个移植过程应该比较简单。
ucGUI一般移植标准步骤
μc/GUI一般移植过程移植的版本为3.90a,主要包含的文件夹如下图所示,主要涉及到:1.Config:配置文件2.GUI:源代码3.GUI_X:操作系统接口函数GUI源代码文件:1)AntiAlias:9个C文件,主要用于抗锯齿的显示效果。
2)ConvertColor:彩色显示的色彩转换支持。
3)ConvertMono:(b/w)和灰度显示的色彩转换支持。
4)Core:核心文件,提供了GUI基本的功能。
5)Font:字库。
6)JPEG:图片操作函数。
7)LCDDriver:LCD驱动程序8)MenDev:Memory device支持。
这个东西可用在很多情况下,但最主要的功能是防止在项目重叠时,防止屏幕的闪烁。
9)Widget:窗体控件库。
10)WM:窗口管理库。
注意:JPEG、MenDev、Widget、WM都可以裁减掉,若要支持Widget(窗体控件),需要WM(窗口管理器)的支持;使用控件时,需要将相应的头文件包含进去,比如我们要使用按钮button,那么我们需要先包含button.h头文件,否则控件即使支持也不可用!一、Config文件夹配置文件修改1.LCDConfig.h#define LCD_XSIZE(240)//X-resolution of LCD,Logical coor.#define LCD_YSIZE(320)//Y-resolution of LCD,Logical coor.#define LCD_BITSPERPIXEL(16)//总线宽度#define LCD_FIXEDPALETTE(565)//TFT格式#define LCD_CONTROLLER(9325)//控制器型号(-1即可)#define LCD_SWAP_RB(1)//是否红蓝交换注意:LCD_SWAP_RB会影响到颜色的正确性,倘若发现颜色是反向的,那么不如改变LCD_SWAP_RB的值。
stm32之UCGUI3.90a移植教程-裸奔-不带触摸版本_V1.0
uCGUI3.90a移植教程声明:本教程是作者学习uCGUI过程中的笔记,最后整理出来,献给初学者,旨在带领初学者入门uCGUI,仅供学习之用,不得用于商业。
如需转载,请注明出处。
作者:Stone_up时间:2013-08-01版本:V1.0说明平台: stm32f103zet6 TFTLCD型号: 2.8寸9341控制器ucgui源码: 3.90a版本触屏:不带触屏(后续更新)操作系统:不支持移植教程一、准备工作:(一)源码:准备3.90版本的UCGUI源码注:如果需要跑GUIDEMO,那么还需准备GUIDEMO源码。
(二)LCD底层驱动:准备LCD屏的底层驱动,接口函数如下:1、设置坐标点;static void lcd_set_cursor(u16 xpos, u16 ypos);2、在指定点画指定颜色的点;void lcd_set_point(u16 xpos, u16 ypos, u16 color);3、读取某个点的颜色值;u16 lcd_get_point(u16 x, u16 y);4、在指定区域填充颜色(开窗口的方式,速度更快);void lcd_window_fill(u16 sx, u16 sy, u16 ex, u16 ey, u16 color);5、LCD屏初始化(主要是出厂初始化代码);void ili9341_initialize(void);注:这里列出了和UCGUI的接口函数,这些函数的具体实现需要根据自己的LCD屏具体实现这些函数。
二、移植过程(一)把UCGUI源码copy到自己的工程中,UCGUI文件夹下面,方便管理;(二)添加UCGUI源码到工程中,放在对应的组下面,方便管理,如图:(三)添加头文件路径,如图:(四)打开GUI_Config文件夹,编辑GUIConf.h文件,内容如下:#define GUI_OS (0)#define GUI_SUPPORT_TOUCH (0)#define GUI_SUPPORT_UNICODE (1)#define GUI_DEFAULT_FONT &GUI_Font6x8#define GUI_ALLOC_SIZE 40*1024#define GUI_WINSUPPORT 0#define GUI_SUPPORT_MEMDEV 1#define GUI_SUPPORT_AA 1(五)打开GUI_Config文件夹,编辑LCDConf.h文件,内容如下:#define LCD_XSIZE (320)#define LCD_YSIZE (240)#define LCD_BITSPERPIXEL (16)#define LCD_CONTROLLER (-1)#define LCD_FIXEDPALETTE (565)#define LCD_SWAP_RB (1)#define LCD_INIT_CONTROLLER() ili9341_initialize();(六)打开GUI_LCDDriver文件夹,编辑LCDDummy.c文件,内容如下:1、先添加LCD驱动文件的头文件,以便下面函数调用;如:#include "tftlcd.h"2、确保#if (LCD_CONTROLLER == -1) \&& (!defined(WIN32) | defined(LCD_SIMCONTROLLER))中的LCD_CONTROLLER == -1 ,和LCDConf.h中的宏定义对应3、在void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) 函数最后一行添加如下语句:lcd_set_point(xPhys, yPhys, PixelIndex);4、在unsigned int LCD_L0_GetPixelIndex(int x, int y) 函数return语句之前添加如下语句:PixelIndex = lcd_get_point(x, y);5、现在回到main函数1)添加头文#include "GUI.h"#include "GUIDEMO.h"2)在main函数中先调用必要的初始化函数后,再调用GUI_Init(); 函数,这个函数会调用LCD屏的初始化函数3)为了测试UCGUI是否初始化成功,我们先调用几个函数试试,在GUI_Init();下面接着调用如下函数:GUI_SetBkColor(GUI_BLACK);GUI_SetColor(GUI_RED);GUI_Clear();GUI_SetFont(&GUI_Font24_1);GUI_DispStringAt("- - uCGUI disp Function sample - -",4,10);// 延时3s,方便观看结果delay_ms(1000);delay_ms(1000);delay_ms(1000);看看是否把LCD刷成黑色,是否显示红色字符串4)然后再while循环中调用GUIDEMO_main(); 函数,开始运行GUIDEMO(七)定时器中断配置,给UCGUI系统一个时钟(个人观点,仅供参考),否则GUIDEMO程序无法运行1、在这里用定时器2,所以需要配置定时器和NVIC中断,配置函数大家就自己做了,只是这里的定时器配置成2KHz的频率,如果想要界面变化快点,那么提高频率即可;然后我们进入定时器2的中断函数,首先在stm32f10x_it.c 文件中加入外部变量声明extern volatile int OS_TimeMS; 然后加入定时器2中断函数,如下:void TIM2_IRQHandler(void){if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET ){TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);OS_TimeMS++;if(OS_TimeMS%20==0){//GUI_TOUCH_Exec(); // 不带触摸不需要这条语句}} }后记作者新浪博客:/s/blog_9763553701018h2h.html技术讨论QQ:2898295180如有bug,恳请指出,欢迎各位网友一起讨论,一起进步,祝大家学业有成。
STM32自学笔记之uCGUI移植总结
uCUI移植总结做了两个星期终于把gui搞通了,现将移植方法总结如下,仅供学习交流之用。
2014/8/23一、uCGUI移植步骤1、uCGUI及TFT驱动文件准备(1)将TFT驱动文件ili9320.h、ili9320.c 及其字体文件ili9320_font.h 复制至keil 工程模板的文件夹中;(2) 准备好uCGUI源文件(本例使用的版本3.90a),将START 文件夹下的GUI 文件夹全部复制到keil 工程模板的文件夹中;再将START 文件夹下的Config 文件夹复制至GUI 文件夹下;最后将Sample 文件夹下GUI_X 中的GUI_X.c 复制到Config 文件夹中。
最终文件结构如图1-1所示:图1-12、添加文件至工程,文件目录结构组如图2-2示:图2-1在添加文件时应注意uCGUI下除了gui_config 下需要添加所有的.h 头文件外其余所有均不需要添加头文件;图2-23、GUI配置(1)G UIConf.h配置:#define GUI_OS (0) /*编译多任务支持#define GUI_SUPPORT_TOUCH (0) /* 触屏支持*/#define GUI_SUPPORT_UNICODE (1) /*支持ASCII/UNICODE码*/ #define GUI_DEFAULT_FONT &GUI_Font6x8 /*初始化字体大小*/#define GUI_ALLOC_SIZE 5*1024 /*开辟动态空间大小*/图3-1注意:动态空间受芯片容量大小制约,不可开辟过大,否则报错图3-2(2) LCD 相关文件配置:LCDConfig.h 的配置#define LCD_XSIZE (320)#define LCD_YSIZE (240) /*x,y方向像素设置*/#define LCD_BITSPERPIXEL (16) /*像素位数*/#define LCD_CONTROLLER 9320 /*LCD驱动器型号*/图3-3继续修改第110行#define LCD_INIT_CONTROLLER() ili9320_Initializtion()并将其后的语句注释掉。
STM32如何移植uCGUI,看这里!
STM32 如何移植uCGUI,看这里!
第一部分:在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,配置文件;。
ucGUI移植
ucGUI移植步骤准备工作下载ucGUI源码,本例是3.90a地址:??????假设:ucGUI源码路径:/home/sam/Desktop/UCGUI390a/编译工具:arm-linux-gcc v3.4.5PC:ubuntu16.04单板:jz2440操作系统:无开始移植1./home/sam/Desktop/UCGUI390a/Start/GUI/下的所有东西加入你的工程。
2./home/sam/Desktop/UCGUI390a/Sample下的GUIDemo文件夹加入你的工程(可选,如果你要看ucGUI的炫酷demo的话)。
3./home/sam/Desktop/UCGUI390a/Start/下的Config文件夹加入你的工程。
4./home/sam/Desktop/UCGUI390a/Sample/下的GUI_X文件夹下只保留GUI_X.c这一个文件,然后加入你的工程。
最后整个文件结构是这样的(请忽视那个Makefile):5.你的工程中的LCDDriver文件夹下只保留LCDDummy.c文件,并向其添加LCD驱动的支持:a.LCD_L0_SetPixelIndex函数添加画点函数。
b.LCD_L0_GetPixelIndex函数添加读点函数。
c.LCD_L0_Init函数添加LCD初始化函数。
6.你的工程中的GUI_X.c添加时间获取函数,不难,具体做法略过。
实现思路是用一个硬件定时器每1ms带动一个变量加1,这个变量给到GUI_X.c读取。
7.你的工程中的Config文件夹下的h文件都是一些配置文件,大体是LCD屏幕的尺寸、是否支持操作系统、是否支持触摸屏、内存分配空间大小等,不难理解,略过。
8.ucGUI的头文件搜索路径有:●./Config/●./Core/●./GUIDemo/●./Widget/●./WM/其他●带操作系统移植,改GUI_X.c这个文件就行了。
主要是需要用OS提供当前时间,创建信号量等操作,具体可以参考ucGUI源码下的GUI_X目录。
ucgui触摸屏移植
F A R E A 在UCGUI中应用触摸屏的简单步骤 (1)修改config文件中的宏定义#define GUI_SUPPORT_TOUCH (1) 使系统支持触摸屏。
(2)编写好触摸屏的AD转换驱动程序。
(3)中断响应触摸事件,对一次触摸事件要分屏按下和释放两个中断过程,并在释放中断中调用GUI_TOUCH_Exec()。
(4)修改GUI_TOUCH_Exec()函数,在此函数中调用触摸屏的AD转换程序,读取转换结果。
注:完成上述步骤,已可以运行触摸屏调试程序,运行时通过显示屏或串口显示触摸屏触摸点的AD转换值。
分别触摸屏的四个端角,并记录下来。
(5)参考上述记录的数据修改config文件夹的GUITouchconf.h文件中的宏定义#define GUI_TOUCH_AD_LEFT 、#define GUI_TOUCH_AD_RIGHT、#define GUI_TOUCH_AD_TOP 、#define GUI_TOUCH_AD_BOTTOM 。
(6)GUI_TOUCH_Exec()中转换触摸坐标值并调用GUI_TOUCH_StoreState()存储坐标。
(7)修改GUI_TOUCH_StoreState(),存储当前触摸状态。
第 1/1页FOREHUI。
STM32移植UCGUI3.90笔记
STM32移植UCGUI3.90笔记在MDK环境下,终于将3.90版本的UCGUI移植到STM32下了,在网上看到的都是例程代码,很少看到有关于在STM32下移植UCGUI的教程方法,为了方便大家,特写此移植方法,大家可以借鉴(有错误之处,望大家指点出来共同讨论!)移植步骤:第一步:首先,得把你的TFT底层驱动写好,既在裸机下,可以正常显示。
第二步:加入UCGUI程序包。
第三步:配置LCDConf.h GUIConf.h GUITouchConf.h(由于我的液晶不带触摸功能,此配置在此不讲。
)配置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 */第四步:最关键的一步。
uCGUI如何移植到S3C44B0X
பைடு நூலகம் 三、预备知识
1. uCGUI 的体系结构:
uCGUI 包含三个总的文件夹:ApplicaTIon,Config,GUI.其中:
Ⅰ ApplicaTIon 是应用程序的文件夹,它中间包含主函数文件,其它
资源文件。
Ⅱ Config 是 GUI 的配置文件夹,它包含三个文件:
LCD 控制器的其它设置。 Ⅲ GUI 是 uCGUI 的实现部分,它是 GUI 最重要的组成部分,其中 包含八九个文件夹。 ★ ConvertColor 是彩色颜色转换文件夹,它里面包含 24 位色各种颜 色之间的转换的函数。 ★ ConvertMono 是灰度颜色转换文件夹,它里面包含 24 位色单色, 四级灰度,16 级灰度和用户自定义颜色之间转换的函数。 ★ Core 是 GUI 的核心,GUI 多数的处理函数都在这个文件夹里面。 ★ Font 是 GUI 的字体文件夹,我们可以通过对它里面文件的增减来 增删字体。 ★ LCDDriver 是 GUI 的底层接口部分我们所移植的部分就应该在这 个文件夹。
★
GUICONF.H 是 uCGUI 的配置文件,负责配置 GUI 的对
OS,window manager,DMA,触摸屏,Unicode 码的支持。以及设置默认字体和
各种控件的默认颜色等。
★ GUITouchConf.h 负责配置触摸屏。
★ LCDConf.h 负责配置 LCD 显示器,如分辨率,颜色位数,以及
uCGUI 如何移植到 S3C44B0X
一、实验目的 1. 初步掌握 uCGUI 底层硬件驱动函数; 2. 掌握将 uCGUI 移植到 ARM S3C44BOX 上的方法和步骤。 二、实验内容 移植 uCGUI 到 ARM 处理器 S3C44BOX 上,并编写 Hello World 程 序,在 Micetek 44B0 实验平台的 LCD 上显示 Hello World!字符串,在 LCD 显示平面坐标(20,20)处,显示一个小于 10000 的整数,该整数不断循环加 1,每次加 1 后立即更新显示,从而反应出显示输出的速度。
UCGUI移植教程
UCGUI在STM32上移植教程1 说明l 开发板芯片型号STM32F103VET6l 板载液晶型号ILI9341l 所需准备资料UCGUI3.90源码源码l 一个工程模板一个工程模板为了节约时间,此处所用模板为野火M3工程模板(3.5.0)制作时间---2013-08-07 By NUAA---Kylin2 移植过程讲解2.1 首先打开工工程模板,页面如下,这个模板工程很简单2.2 在工程模板中新建两个文件夹2.2.1 命名为GUI与Mylib2.2.2 在GUI文件夹下添加以下内容l 上述图片为UCGUI3.90源码中的一些文件夹源码中的一些文件夹l 进入UCGUI3.90源码文件夹/Start,将Config文件夹原封不动的拷过来文件夹原封不动的拷过来l 进入UCGUI3.90源码文件夹/Start/GUI文件夹,将其中所有文件夹拷过来文件夹,将其中所有文件夹拷过来l 在GUI文件夹下新建GUI_X文件夹,进入UCGUI3.90源码文件夹/ Sample/ GUI_X文件夹中,如果带操作系统应该拷贝GUI_X_uCOS.c,如果不带操作系统拷贝GUI_X.c,在这里我们将将GUI_X.c拷贝到新建GUI_X文件夹。
文件夹。
2.2.3 各文件夹说明1) An Alias :9个C 文件,主要用于抗锯齿的显示效果。
文件,主要用于抗锯齿的显示效果。
2) ConvertColor :彩色显示的色彩转换支持。
:彩色显示的色彩转换支持。
3) ConvertMono :(b/w )和灰度显示的色彩转换支持。
)和灰度显示的色彩转换支持。
4) Core :核心文件,提供了GUI 基本的功能。
基本的功能。
5) Font :字库。
:字库。
6) JPEG :图片操作函数。
:图片操作函数。
7) LCDDriver :LCD 驱动程序驱动程序8) MenDev :Memorydevice 支持。
这个东西可用在很多情况下,这个东西可用在很多情况下,但最主要的功能是防止在但最主要的功能是防止在项目重叠时,防止屏幕的闪烁。
ucGUI--STM32--移植经验总结
单片机交流QQ群:166578859电子邮箱:jitao_yang@ 如果没有找到ucGUI没有提供你所使用的LCD驱动,看完本文章,定有大收获。
本教程是将ucGUI移植到STM32单片机。
LCD驱动器为HX8347。
为了教程有更大的通用性,LCD驱动程序未采用ucGUI官方提供。
编译环境为5.4。
本教程可作为其它单片机、LCD、编译环境的参考。
不足之处,敬请指出QQ:309223638单片机交流QQ群:166578859电子邮箱:jitao_yang@1解压“ucGUI-V3-90a----非常好用.rar”这个版本的优点:需要改动的地方少;编译时不会由于在Linux环境下编辑源代码,然后又拿回IAR环境编译造成大量“Warning[Pa050]:……”;LCD底层驱动获取方便,不依赖于ucGUI官方驱动。
顺次打开“uCGUI-V3-90a→UCGUI390a→Start”。
将Start文件夹下的Config和GUI 文件夹复制的自己所建立工程文件夹。
然后打开IAR,在Workspace中添加Config和GUI文件夹内容。
添加完后,如下图所示。
其中“FWLib”是我的工程中所需要的,属于多余项。
然后右击工程,打开Options,选择左侧的“C/C++Compiler”。
然后在右侧选择Preprocessor。
在“Additional include directories”下填写工程中Config和GUI文件夹路径。
Ex:$PROJ_DIR$\..\gui$PROJ_DIR$\..\gui\AntiAlias$PROJ_DIR$\..\gui\ConvertColor单片机交流QQ群:166578859电子邮箱:jitao_yang@ $PROJ_DIR$\..\gui\COnvertMono$PROJ_DIR$\..\gui\core$PROJ_DIR$\..\gui\Font$PROJ_DIR$\..\gui\JPEG$PROJ_DIR$\..\gui\LCDDriver$PROJ_DIR$\..\gui\MemDev$PROJ_DIR$\..\gui\MultiLayer$PROJ_DIR$\..\gui\Touch$PROJ_DIR$\..\gui\Widget$PROJ_DIR$\..\gui\WM$PROJ_DIR$\..\Config截图2配置GUIConf.hPS:一下配置,配置为“1”,启用;配置为“0”,不启用#define GUI_OS(0)/*是否加载操作系统*/#define GUI_SUPPORT_TOUCH(0)/*是否启用触屏支持*/#define GUI_SUPPORT_UNICODE(1)/*是否启用混合型ASCII/UNICODE编码*/ #define GUI_DEFAULT_FONT&GUI_Font8x16/*字体大小配置,参见手册*/ #define GUI_ALLOC_SIZE500/*应用于GUI的动态内存字节配置,不建议低于500;也不要配置太高,导致内存溢出*//***********************************************************************Configuration of available packages*/#define GUI_WINSUPPORT0/*窗口管理数据包支持*/#define GUI_SUPPORT_MEMDEV0/*存储设备支持*/#define GUI_SUPPORT_AA1/*抗锯齿。
UCGUI移植教程
UCGUI移植教程
1. 环境搭建:首先,需要准备开发板和相应的编译工具链。
可以选择使用适合的开发环境,例如Keil、IAR或者GCC等。
2.移植UCGUI的底层驱动:UCGUI的底层驱动负责和硬件进行通信,并提供一系列函数接口给上层应用。
通常需要编写底层驱动的源代码,并将其与UCGUI的库文件链接。
3.配置移植环境:UCGUI提供了一个配置文件,该文件包含了各种编译选项和参数设置,可以根据具体的硬件平台进行修改。
通过修改这些配置文件,可以让UCGUI适应不同的平台。
4.移植字体和图像资源:UCGUI支持多种字体和图像格式,但并不包含实际的字体和图像资源。
因此,需要将所需的字体和图像资源转换成UCGUI支持的格式,并将其添加到应用程序中。
5.界面设计和调试:UCGUI提供了一套界面设计工具,通常可以在PC 机上进行界面设计和调试。
可以使用该工具创建界面,并将其转换成C代码,然后添加到应用程序中进行测试和调试。
6.运行UCGUI应用程序:最后,将编写的应用程序与UCGUI的库文件进行链接,生成可执行文件。
将该可执行文件烧写至开发板并运行,即可看到UCGUI的界面效果。
以上是UCGUI的移植过程的基本步骤,具体的移植过程可能会因不同的硬件平台而有所不同。
在进行移植时,可以参考UCGUI提供的官方文档和示例代码,也可以参考其他人的移植经验和教程。
需要注意的是,UCGUI的移植过程可能会遇到一些问题,例如显示效果不符合预期、界面响应速度慢等。
这时候可以通过调试和优化来解决这些问题,例如检查驱动程序的正确性、优化界面渲染算法等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
UCGUI在STM32上移植教程
1说明
●开发板芯片型号STM32F103VET6
●板载液晶型号ILI9341
●所需准备资料UCGUI3.90源码
●一个工程模板
为了节约时间,此处所用模板为野火M3工程模板(3.5.0)
制作时间---2013-08-07 By NUAA---Kylin 2移植过程讲解
2.1首先打开工工程模板,页面如下,这个模板工程很简单
2.2在工程模板中新建两个文件夹
2.2.1命名为GUI与Mylib
2.2.2在GUI文件夹下添加以下内容
●上述图片为UCGUI3.90源码中的一些文件夹
●进入UCGUI3.90源码文件夹/Start,将Config文件夹原封不动的拷过来
●进入UCGUI3.90源码文件夹/Start/GUI文件夹,将其中所有文件夹拷过来
●在GUI文件夹下新建GUI_X文件夹,进入UCGUI3.90源码文件夹/ Sample/ GUI_X文件夹
中,如果带操作系统应该拷贝GUI_X_uCOS.c,如果不带操作系统拷贝GUI_X.c,在这里我们将将GUI_X.c拷贝到新建GUI_X文件夹。
2.2.3各文件夹说明
1)AntiAlias:9个C文件,主要用于抗锯齿的显示效果。
2)ConvertColor:彩色显示的色彩转换支持。
3)ConvertMono:(b/w)和灰度显示的色彩转换支持。
4)Core:核心文件,提供了GUI基本的功能。
5)Font:字库。
6)JPEG:图片操作函数。
7)LCDDriver:LCD驱动程序
8)MenDev:Memorydevice 支持。
这个东西可用在很多情况下,但最主要的功能是防止在
项目重叠时,防止屏幕的闪烁。
9)Widget:窗体控件库。
10)WM:窗口管理库。
11)Config:配置文件。
12)GUI:源代码。
13)GUI_X:操作系统接口函数。
2.3添加组及源文件
2.3.1将GUI文件夹下的所有文件夹添加到GROUP
右键工程工程项目名选择manage components将这些组全部添加上如图
2.3.2然后除了LCDDriver以及Font不Add Files
其他的都将对应文件夹下的内容添加进来
原因如下:
因为不同液晶需要不同的驱动,字体的话也是自行选择。
完成后如下图所示
2.3.3添加头文件路径
2.3.4完成以上操作之后开始编译
因编译时间较长,编译过程中将Config组下的GUIConf.h改成如下图所示,初步移植,这些功能可以先关掉,修改内容如图
另外将Config组下的GUITouchConf.h改成如下图所示
其他部分删掉
将Config组下的LCDConf.h改成如下图所示
2.3.5编译完发现存在很多错误如下图所示,不过还好错误都是一些未定义的
2.3.6错误解决
首先看第一个错误,缺少字体文件,所以右键组Font将Font文件夹下的Font6x8.c添加进组
其他未定义的内容有:
●LCD_L0_SetLUTEntry
●LCD_L0_SetOrg
●LCD_L0_SetPixelIndex
●LCD_L0_DrawBitmap
●LCD_L0_DrawHLine
●LCD_L0_FillRect
●LCD_L0_Init
●LCD_L0_On
●LCD_L0_XorPixel
●LCD_L0_DrawVLine
●LCD_L0_GetPixelIndex
解决方法:
在GUI/LCDDriver/目录下新建一个LCD_GUI.c文件,并添加到组LCDDriver当中,由于这些错误都是未定义的,所以我们新建这样一个文件进行定义
点击菜单栏Edit选择find in files找到函数声明的位置,会发现这些定义都在LCD_protected.h 当中,将他们拷贝出来,放入LCD_GUI.c文件当中
●int LCD_L0_Init (void){}//要有返回值,不然编译报错可以写return 0;
●void LCD_L0_SetLUTEntry (U8 Pos, LCD_COLOR color){}
●void LCD_L0_SetOrg (int x, int y){}
●void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex){}
●void LCD_L0_DrawBitmap (int x0, int y0, int xsize, int ysize, int BitsPerPixel, int
BytesPerLine, const U8 GUI_UNI_PTR * pData, int Diff, const LCD_PIXELINDEX* pTrans){}
●void LCD_L0_DrawHLine (int x0, int y0, int x1){}
●void LCD_L0_FillRect (int x0, int y0, int x1, int y1){}
●void LCD_L0_On (void){}
●void LCD_L0_XorPixel (int x, int y){}
●void LCD_L0_DrawVLine (int x, int y0, int y1){}
●unsigned int LCD_L0_GetPixelIndex (int x, int y){}
2.3.7液晶驱动程序
由于不同液晶的驱动程序不一样,所以直接拷贝对应液晶的驱动程序即可
这里我直接拷贝野火教程中自带的液晶驱动程序bsp_ili9341_lcd.h,bsp_ili9341_lcd.c到LCDDriver文件夹的当中并添加到组LCDDriver当中
并在LCD_GUI.c文件中添加下列头文件
#include "LCD_Private.h"
#include "GUI_Private.h"
#include "bsp_ili9341_lcd.h"
完成这些任务后就离成功不远了
2.4Mylib文件夹内容添加
2.4.1添加自己以前编好的底层函数
如我这边有添加如下函数,其实刚开始移植加不加都无所谓
2.4.2新建文件夹FSMC
另外在Mylib再新建下一个文件夹FSMC进行配置,不过已经配置好了,在附件可添加函数当中,拷贝过来即可,并将内容添加到组Mylib当中
(FSMC说明:FSMC(Flexible Static Memory Controller,可变静态存储控制器)是STM32系列中内部集成256 KB以上FlaSh,后缀为xC、xD和xE的高存储密度微控制器特有的存储控制机制。
之所以称为“可变”,是由于通过对特殊功能寄存器的设置,FSMC能够根据不同的外部存储器类型,发出相应的数据/地址/控制信号类型以匹配信号的速度,从而使得STM32
系列微控制器不仅能够应用各种不同类型、不同速度的外部静态存储器,而且能够在不增加外部器件的情况下同时扩展多种不同类型的静态存储器,满足系统设计对存储容量、产品体积以及成本的综合要求。
)
最后组视图如下:
在main函数当中添加头文件说明
#include"GUI.h"
#include"FSMC.h"
#include"LCD_Protected.h"
这个时候编译不会再出现错误,不过具体的功能未能实现
2.5函数功能添加
在bsp_ili9341_lcd.c文件中查找相应的函数加入到LCD_GUI.c当中,下面举两个例子,其他的自行添加,如下方截图
Main函数测试。