UCGUI移植教程

合集下载

基于STM32的uCGUI移植手册

基于STM32的uCGUI移植手册
芯嵌 stm32

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移植详细设计及总结序本文档阐述了将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移植

移植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移植解析(新手入门)

基于STM32的UCGUI移植解析(新手入门)
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之触摸屏之前的三篇文章分别介绍了如何在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移植过程

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简单移植

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)的应用与移植

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控制器宏,定义了怎样对控制器进行操作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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函数测试。

相关文档
最新文档