分享:uCGUI移植战舰STM32详解。

2019-12-21 12:14发布

首先自己建立一个MDK工程,在此放上我自己工程,方便大家直接在此进行修改。
工程框架.png (38.83 KB, 下载次数: 5) 下载附件 MDK工程框架 2015-8-4 11:00 上传
ucguiDemoCode.zip (936.35 KB, 下载次数: 129) 2015-8-4 11:33 上传 点击文件名下载附件
MDK工程模版
ucguiDemoCode.zip (2.12 MB, 下载次数: 188) 2015-8-4 15:13 上传 点击文件名下载附件
移植成功

bsp为底层驱动层,内部所有的函数均以bsp(Board Support Package)前缀开头,工程中添加了uC/OS但是实际并没有使用,为uCGUI建立了一些空的文件,方便直接添加.c.h文件。
准备uCGUI源码,我是用的是uCGUI3.90a版本。
ucgui3.90a.zip (9.49 MB, 下载次数: 209) 2015-8-4 11:10 上传 点击文件名下载附件
uCGUI源码

移植开始。。。。。。。。。。。。。。。。。。。
1.将BSP文件夹下面的LCD文件夹修改名字为ILI9341,将lcd.c修改为ili9341.c,lcd.h修改为ili9341.h,因为在 uCGUI/GUI/Core 下已经存在lcd.c和lcd.h了。文件名字可以随便起,因为我的液晶控制器为ILI9341。。。
2.修改工程,移除bsp下lcd.c重新添加ili9341.c,修改后编译会有几个错误,都是因为头文件包含的原因 将#include"lcd.h"改成#include "ili9341.h“或者将#include "lcd/lcd.h"  改为#include " ili9341/ili9341.h"即可编译通过
最好将ili9341.h中的预处理指令的名字也改成 ILI9341.
3.将 ili9341.h文件中宏定义(#define LCD  ((LCD_TypeDef *) LCD_BASE) )中的LCD修改为ILI9340,因为LCD这个名字uCGUI也有用到,否则会冲突,你会发现莫名的100多个错误,呜呜,不多说了,我闲哭会。
4.接下来将源码文件夹下  /Sample/GUI_X 和 /Start/Config,/Start/GUI复制到工程文件夹UCGUI下。按照名字将GUI_X,GUI/(除了JPEG),Config下的.c.h添加到工程中
   工程    uCGUI/Config下添加3个.h配置文件
             uCGUI/GUI_X下只添加GUI_X.c
             uCGUI/GUI/LCDDriver下只添加LCDDummy.c
             其余的则将对应文件夹下的.c文件全部添加到工程中
   添加完毕后,点击魔术棒 包含路径。
5.编译,发现会有19个错误,莫慌
6.打开  uCGUI/Config下GUIConf.h进行配置,主要是一些功能开关,暂时全部关闭,等需要时在打开即可
           #define GUI_OS                              (0)
           #define GUI_SUPPORT_TOUCH         (0)  
           #define GUI_SUPPORT_UNICODE       (0)

           #define GUI_DEFAULT_FONT          &GUI_Font6x8
          //#define GUI_ALLOC_SIZE             12500  
          #define GUI_ALLOC_SIZE                40*1024
          #define GUI_WINSUPPORT                0  
          #define GUI_SUPPORT_MEMDEV        0  
          #define GUI_SUPPORT_AA                0  
7.打开 uCGUI/Config下LCDCon.f根据自己的液晶尺寸以及控制器等具体信息进行配置(对源文件的无用函数和#define命令都删了,修改后如下,最下面的两行需要自己手动添加)
           首先在该文加下包含 #inclide“ili9341.h”因为要使用到液晶初始化函数。
          #define LCD_XSIZE      (240)
          #define LCD_YSIZE      (320)  

          //#define LCD_BITSPERPIXEL  (8)
         #define LCD_BITSPERPIXEL     (16)
         #define LCD_CONTROLLER      (-1) /*液晶控制器型号,-1=LCDDummy.c   -2=LCDNull.c  也可以设置成你自己的控制器型号如果你确定uCGUI支持的话例如设置为 9320是可以的。*/
         #define LCD_SWAP_RB           (1)  /*RED BLUE反 {MOD}交换*/
         #define LCD_INIT_CONTROLLER() bsp_lcd_init(); /*液晶初始化*/
8.打开 uCGUI/GUI/LCDDriver下的LCDDummy.c文件进行修改
         #if (LCD_CONTROLLER == -1)
              && (!defined(WIN32) | defined(LCD_SIMCONTROLLER))
        修改为   #if (LCD_CONTROLLER == -1)    即把第2行和那和反斜杠删了就好,这样就可以进行编译了
9.点击编译。。。。。bang  bang  bang  bang----》编译通过 无错误无警告,But 并没有什么卵用 还需要添加几个函数
10.打开 uCGUI/GUI/LCDDriver下LCDDummy.c找到函数  LCD_L0_FillRect(),LCD_L0_GetPixelIndex(),LCD_L0_SetPixelIndex()修改后函数如下:(包含头文件#include "ili9341/ili9341.h")
void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)
{
  /* Convert logical into physical coordinates (Dep. on LCDConf.h) */
  #if LCD_SWAP_XY | LCD_MIRROR_X| LCD_MIRROR_Y
    int xPhys = LOG2PHYS_X(x, y);
    int yPhys = LOG2PHYS_Y(x, y);
  #else
    #define xPhys x
    #define yPhys y
  #endif
  /* Write into hardware ... Adapt to your system */
  {
    bsp_lcd_fastDrawPoint( x,y,PixelIndex );
  }
}
unsigned int LCD_L0_GetPixelIndex(int x, int y) {
  LCD_PIXELINDEX PixelIndex;
  /* Convert logical into physical coordinates (Dep. on LCDConf.h) */
  #if LCD_SWAP_XY | LCD_MIRROR_X| LCD_MIRROR_Y
    int xPhys = LOG2PHYS_X(x, y);
    int yPhys = LOG2PHYS_Y(x, y);
  #else
    #define xPhys x
    #define yPhys y
  #endif
  /* Read from hardware ... Adapt to your system */
  {
    PixelIndex = bsp_lcd_readPoint( x,y );/* ... */
  }
  return PixelIndex;
}
void LCD_L0_FillRect(int x0, int y0, int x1, int y1)
{
    bsp_lcd_fill( x0,y0,x1,y1,LCD_COLORINDEX );
}
11.这回是真的完事了,好像也不是那么麻烦哈,编译通过 ,main.h中包含 #include "gui.h" 编写程序测试移植结果
12.main.c中有个简单的测试程序,需要的话下载后测试即可,此处补贴出程序了(测试程序是从别的帖子复制的,我叫小偷,谢谢)        
此帖仅是我本人移植时个人见解,可能有不足之处请谅解,透光石借鉴了很多网上及本论坛网友的帖子,感谢有助于我完成本帖的那些大牛们。
带触摸屏的学习Ing,等功成在来水帖。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
Me、小丁丁
1楼-- · 2019-12-21 15:14
本帖最后由 Me、小丁丁 于 2015-8-19 15:03 编辑

继续上面的工程,添加触摸屏。

首先说明,上面的移植工程并不够完善,如果程序中调用了 GUI_Delay()函数则会发现,程序将卡死在这个函数中,因为GUI_Delay()延时函数,是利用变量OS_TimeMS来进行延时的,而此变量我们并没有做任何操作,其值初始化为0后,没有跟随系统时间递增。

解决法案:(我使用的是定时器3中断)

使用系统滴答定时器或普通定时器均可,设置中断时间为1ms,例:
在工程中添加两个库文件,用于定时器(stm32f10x_tim.c和misc.c),同时在头文件stm32f10x_conf.h 中将该两个文件的头文件的注释去掉

extern volatile int OS_TimeMS;
void TIM3_IRQHandler(void)
{                                                                  
        if(TIM3->SR&0X0001)
        {
                OS_TimeMS+=1;
        }                                   
        TIM3->SR&=~(1<<0);   
}

此时工程已经完善,开始添加触摸屏。

1.将战舰的触摸屏实验 HARDWARE 文件夹下TOUCH和24CXX文件夹赋值到该工程的BSP文件夹下(24CXX文件夹不是必须的,但是如果没有移植过来,就需要修改触摸屏初始化函数)为了方便,我将24CXX也赋值过来了
2.将24cxx.c touch.c myiic.c 添加到工程,编译,出现的错误或警告都是头文件包含问题和函数未定义(因为修改了之前ili9341.c中定义的函数名字)问题,一一找到修改,直到编译成功即可。需要注意一下的是touch.c中的头文件包含指令
#include"lcd.h",因为工程中已经存在该头文件,所以并没有出现错误或警告提示,但是此时应修改为#include "ili9341/ili9341.h"
3.将 GUIConf.h中的#define GUI_SUPPORT_TOUCH  (0)  修改为#define GUI_SUPPORT_TOUCH  (1)    支持触摸屏,编译出现4个未定义函数
4.在工程中添加 GUI_X_Touch.c 文件 编译通过,该文件中共四个函数第一个 第二个不用管,第三个第四个需要修改,先添加头文件#include "touch/touch.h"。
5.修改函数  int  GUI_TOUCH_X_MeasureX(void)  如下:(注意:网上有资料说该函数返回的是坐标值,经测试是不正确的,该函返回的是AD的值,并不是坐标值)
extern u8 CMD_RDX;
int  GUI_TOUCH_X_MeasureX(void)
{
        u16 x=TP_Read_AD( CMD_RDX );
        return x;
}
6.修改函数 int  GUI_TOUCH_X_MeasureY(void)  如下:(返回AD值)
extern u8 CMD_RDY;
int  GUI_TOUCH_X_MeasureY(void)
{
        /*u16 x,y;
        x=y=0;
        TP_Read_XY2( &x,&y );
        return y;*/
        u16 y=TP_Read_AD( CMD_RDY );
        return y;
}
7.开一个10ms中断的定时器,不断查询触摸屏的状态,我使用的是定时器4.

/*
**10ms中断
*/
void TIM4_IRQHandler(void)
{                                                                  
        if(TIM4->SR&0X0001)
        {
                GUI_TOUCH_Exec();           
        }                                   
        TIM4->SR&=~(1<<0);
}
8.配置 GUITouchConf.h文件,总共有7个宏定义(自添加2个)
/*此四个需要实际测量*/
#define GUI_TOUCH_AD_LEFT   305   
#define GUI_TOUCH_AD_RIGHT  3826   
#define GUI_TOUCH_AD_TOP         293
#define GUI_TOUCH_AD_BOTTOM 3726

/*此三个不断组合实验即可*/
#define GUI_TOUCH_SWAP_XY    0
#define GUI_TOUCH_MIRROR_X   0
#define GUI_TOUCH_MIRROR_Y   0

此处是我使用的参数(战舰V2.1 竖屏),跟我开发板一样的小伙伴可以直接使用此参数试试。

9.如果发现上述参数配置不正确,即指针停留液晶左上角不动,莫慌!!!在  UCGUI3.90a/Sample/GUI文件夹下有一TOUCH_Sample.c文件,专门用于此参数的测量(前四个参数),将该文件内容复制到main函数中稍作修改即可。程序运行后点击触摸屏左上角(GUI_TOUCH_AD_LEFT=X,GUI_TOUCH_AD_TOP=Y),点击触摸屏右下角(GUI_TOUCH_AD_RIGHT=X,GUI_TOUCH_AD_BOTTOM=Y)(第一次测量时可能由于此四个数据与真是数据相差巨大,指针并不会跟随触屏移动,不用管,只要将数据测量写入即可,再次测量就会发现指针会跟随触屏移动了)
此外
我已经将参数测量程序和触摸屏移植成功后测试程序均写入main.c文件中,通过预处理指令进行选择运行那个程序。
10.移植完毕,谢谢支持。

/*建议:GUI_Delay的延时使用系统滴答定时器,GUI_Exec();是界面刷新函数,界面复杂时非常耗时,最好不要放在中断里面。*/
ucguiDemoCode.zip (2.86 MB, 下载次数: 105) 2015-8-19 15:01 上传 点击文件名下载附件
此工程为完整的工程,main.c中通过条件编译可以选择main函数累启动不同的触摸屏测试程序。
Me、小丁丁
2楼-- · 2019-12-21 20:18
 精彩回答 2  元偷偷看……
Excellence
3楼-- · 2019-12-21 21:13
N_EMBED
4楼-- · 2019-12-22 00:39
很详细的心得体会。
luohui5003
5楼-- · 2019-12-22 02:45
收藏了!!!
hy317
6楼-- · 2019-12-22 04:21
正好用到这个驱动,谢谢

一周热门 更多>