一、移植步骤 目的:将ucgui源码移植到STM32开发板 ucgui源码:3.98版本 开发板:STM32F407ZGT 注意: 1.源码的版本和开发板的型号可以不一样,移植方法都是一样的,这只是我用的版本做的实验。但是一定要保证ucgui源码一定要正确,否则不可能成功,我就吃了这个亏。 2.我是直接使用正点原子的开发版和其LCD的源码,但是使用其源码需要做一定的修改,我会先讲移植,后面再讲怎么改的。 步骤: 1.准备好硬件开发平台(我使用的是STM32f407系列的CPU)、ucGUI源码(我使用的是3.98 版本的)、完整的KEIL工程,主要包含:lcd_driver.c和lcd_driver.h文件(笔者的TFT驱动)。 关于上面这个.c .h,里面主要包含下面三个移植用到的函数: void TFT_Init(void); //初始化 void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color); //快速画点 u16 LCD_ReadPoint(u16 x,u16 y); //读点 2.从GUI源码里复制代码,进行工程搭建 (1)复制 源码/Start 文件下的GUI和Config这两个文件夹到自己的工程模板,如下图; file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDF77.tmp.jpg (2)复制源码/Sample/GUI_X文件夹下的GUI_X.c 文件,粘贴到工程模板下的Config里; (3)打开事先准备好的KEIL工程,添加分组。如下图 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDF97.tmp.jpg (4)添加文件,Config这个组添加所有的.c和.h文件,其余的文件只添加.c文件 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDF98.tmp.jpg (5)最后要在c/c++里添加路径。 (6)修改:Config / GUIConf.h文件: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDF99.tmp.jpg 其余部分不用动。 (7)修改Config / LCDConf.h file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDF9A.tmp.jpg 注:第1、2行是设置屏的大小,我是4.3寸屏(分辨率是480*800),所以我设置为480和800。 这是我修改之后的源码,大家看看是不是声明下面少了许多函数啊,没错,我删掉了,原因很简单,我的底层驱动IC程序是厂家提供的,而且GUI源码也没有我的这部分驱动程序。所以大家弄得时候也要一并删除,只留下红色代码部分。 (8)修改:LCDDriver / LCDTemplate.c文件(有的源码是LCDDummy.c)。 添加头文件#include "lcd_driver.h"; 找到void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) 删除该函数里面所有程序, 添加:LCD_Fast_DrawPoint(x, y, PixelIndex);//快速画点 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDFAB.tmp.jpg 找到unsigned int LCD_L0_GetPixelIndex(int x, int y) 删除该函数里面所有程序, 添加:return LCD_ReadPoint(x, y);//读点 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDFAC.tmp.jpg (9)修改主函数,添加#include”GUI.h”//头文件包含; int main(void) { delay_init(168); //初始化延时函数 uart_init(115200); //初始化串口波特率为115200 LED_Init(); //初始化LED TFT_Init(); //初始化LCD FSMC接口 GUI_Init(); //GUI初始化 GUI_SetBkColor(GUI_BLUE); //设置背景为蓝色 GUI_SetColor(GUI_RED); //设置字体颜色为红色 GUI_Clear(); GUI_DispString("Hello Word"); //显示字符Hello Word } 至此,移植结束,烧到开发板中会显示蓝色背景,红色字体的”Hello Word”。 二、我出现的问题 我也是第一次玩ucgui移植,在移植过程中,我出现过很多问题,现在来说一说。 1.移植之前的模板部分要搞好。正点原子的程序模板有一个文件名为CORE,源码里面也有一个叫core,所以先要改一下名字避免重名,我就把程序模板中的CORE改为CORER。 2.原本初始化函数名为LCD_Init(),现在改为TFT_Init()。 3.由于在GUI源码里有文件叫LCD.c和LCD.h,而原本lcd的驱动程序是lcd.c,lcd.h,为了避免搞错,现在将驱动程序名改为lcd_driver.c和lcd_driver.h。 4.最后一个问题, 原因: 工程提供的驱动中Lcd_driver.h中的第110行:#define LCD ((LCD_TypeDef *) LCD_BASE) LCD->LCD_RAM = LCD_COLORINDEX; UCGUI的源码中:#define LCD_COLORINDEX GUI_Context.LCD.aColorIndex16[1] 结论:从上面的展开的语句中发现 前后都使用了 LCD,由于头文件中定义一个 LCD 的字符定义,而UCGUI中也定义 LCD 为一个 union 导致命名定义冲突。 解决方法:将 #define LCD ((LCD_TypeDef *) LCD_BASE) 改为#define LCDSS ((LCD_TypeDef *) LCD_BASE),然后凡是用到了这个结构体的地方都改一下名字,(93,100,107,115,130,136,385,426,2717,2749,2766这些行都要改)。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsDFAD.tmp.jpg
|