ucgui移植stm32f4的步骤和出现的问题及解决方法

2019-07-20 08:22发布

一、移植步骤目的:将ucgui源码移植到STM32开发板ucgui源码:3.98版本开发板:STM32F407ZGT 注意:1.源码的版本和开发板的型号可以不一样,移植方法都是一样的,这只是我用的版本做的实验。但是一定要保证ucgui源码一定要正确,否则不可能成功,我就吃了这个亏。2.我是直接使用正点原子的开发版和其LCD的源码,但是使用其源码需要做一定的修改,我会先讲移植,后面再讲怎么改的。 步骤:1.准备好硬件开发平台(我使用的是STM32f407系列的CPU)、ucGUI源码(我使用的是3.98版本的)、完整的KEIL工程,主要包含:lcd_driver.clcd_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 文件下的GUIConfig这两个文件夹到自己的工程模板,如下图;file:///C:UsersADMINI~1AppDataLocalTempksohtmlwpsDF77.tmp.jpg (2)复制源码/Sample/GUI_X文件夹下的GUI_X.c 文件,粘贴到工程模板下的Config里;(3)打开事先准备好的KEIL工程,添加分组。如下图file:///C:UsersADMINI~1AppDataLocalTempksohtmlwpsDF97.tmp.jpg (4)添加文件,Config这个组添加所有的.c.h文件,其余的文件只添加.c文件file:///C:UsersADMINI~1AppDataLocalTempksohtmlwpsDF98.tmp.jpg (5)最后要在c/c++里添加路径。 (6)修改:Config / GUIConf.h文件:file:///C:UsersADMINI~1AppDataLocalTempksohtmlwpsDF99.tmp.jpg 其余部分不用动。 (7)修改Config / LCDConf.h file:///C:UsersADMINI~1AppDataLocalTempksohtmlwpsDF9A.tmp.jpg 注:第12行是设置屏的大小,我是4.3寸屏(分辨率是480*800),所以我设置为480800这是我修改之后的源码,大家看看是不是声明下面少了许多函数啊,没错,我删掉了,原因很简单,我的底层驱动IC程序是厂家提供的,而且GUI源码也没有我的这部分驱动程序。所以大家弄得时候也要一并删除,只留下红 {MOD}代码部分。 (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:UsersADMINI~1AppDataLocalTempksohtmlwpsDFAB.tmp.jpg 找到unsigned int LCD_L0_GetPixelIndex(int x, int y) 删除该函数里面所有程序,添加:return LCD_ReadPoint(x, y);//读点file:///C:UsersADMINI~1AppDataLocalTempksohtmlwpsDFAC.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);                //设置背景为蓝 {MOD}        GUI_SetColor(GUI_RED);                //设置字体颜 {MOD}为红 {MOD}        GUI_Clear();         GUI_DispString("Hello Word");        //显示字符Hello Word}至此,移植结束,烧到开发板中会显示蓝 {MOD}背景,红 {MOD}字体的”Hello Word”。 二、我出现的问题我也是第一次玩ucgui移植,在移植过程中,我出现过很多问题,现在来说一说。1.移植之前的模板部分要搞好。正点原子的程序模板有一个文件名为CORE,源码里面也有一个叫core,所以先要改一下名字避免重名,我就把程序模板中的CORE改为CORER2.原本初始化函数名LCD_Init(),现在改为TFT_Init() 3.由于在GUI源码里有文件叫LCD.cLCD.h,而原本lcd的驱动程序lcd.c,lcd.h,为了避免搞错,现在将驱动程序名改为lcd_driver.clcd_driver.h 4.最后一个问题,使用 UCGUI自带的 LCD_L0_SetPixelIndex(x, y0, LCD_COLORINDEX); 语句,提示错误error: #134: expected a field name原因:工程提供的驱动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:UsersADMINI~1AppDataLocalTempksohtmlwpsDFAD.tmp.jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。