一、移植步骤
目的:将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: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
注:第1
、2行是设置屏的大小,我是4.3寸屏(分辨率是480*800),所以我设置为480和800。这是我修改之后的源码,大家看看是不是声明下面少了许多函数啊,没错,我删掉了,原因很简单,我的底层驱动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改为CORER。
2.原本
初始化函数名为LCD_Init(),
现在改为TFT_Init()。 3.由于在GUI
源码里有文件叫LCD.c和LCD.h,而原本lcd的驱动程序是lcd.c,lcd.h
,为了避免搞错,现在将驱动程序名改为lcd_driver.c和lcd_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
一周热门 更多>