四轴飞行器1.6 emwin与ucgui的移植,汉字外挂字库移植和DEMO效果对比

时间:2022-07-01 15:51:07

飞控的遥控器打算自己做,这样全局都能掌握,可以通过遥控器对飞控的参数和飞行模式进行修改,而买遥控器是做不到这样的哈。。以后做图传的时候,屏幕还可以实时现实摄像头拍回来的画面,挺好的哈。。

做遥控我们选的是原子的战舰开发板,开发板附带小霸王那种遥控器,可以用这个来控制飞控哈,回忆童年有木有。。。板子还带一个ADXL345的加速度传感器,那还可以用开发板的姿态控制飞控的姿态。。哈。。应该挺好玩。。。

第一步我们打算先写一个GUI的界面,UI这东西就让我头疼哈。额。。打算第一版就没什么UI,就把要显示的数据往屏幕上堆就好了。。。以前在学校的时候针对原子开发板自己移植过UCGUI3.90a,并且做了一个ucos+ucgui+fatfs的干净模版工程。。打算直接用。。但是发现有个叫emwin的,看了下效果好很多,就像windows98到windowsxp的效果,本来就对UI界面烦心,这个效果好这么多,果断要用。。看了下,其实就是ucgui,额。。其实ucgui就是emwin。。。

先上个视频:

视频地址:http://v.youku.com/v_show/id_XNzY1NTYwMjA0.html

ucgui和emwin的移植是差不多的,只是emwin不开源,移植的过程有些地方稍微有点不同。。

先大致说下ucgui的移植,移植ucgui其实很容易,只要修改GUI\LCDDriver里面的LCDDummy.c文件,填写void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) 和unsigned int LCD_L0_GetPixelIndex(int x, int y) 函数就可以了,可以优化LCD_L0_FillRect来增加刷新速率。但是有个前提,就是屏幕的扫描方向需要和XY轴的增加方向一致。这样就可以直接填充颜色,而不需要更改XY的坐标值,可以批量修改,比一个一个点修改速度快很多。亲测STM32下6804的3.5屏可以快10倍左右。其实就是这么简单。。。

emwin的移植

我们用的stm32,可以用stemwin,不过下了stemwin,里面的源码不多,移植的时候还要到emwin里面去找,我们直接移植emwin好了,emwin改成stemwin是容易的,下面再说。。

下载emwin后,emwin可以不需要下载,在MDK里面是有的哈,在keil\arm\segger\emwin里面,5.0版本以上的MDK在keil\ARM\pack\keil\mdk=middleware\5.1.4\emwin里面

里面内容如下图1:

四轴飞行器1.6 emwin与ucgui的移植,汉字外挂字库移植和DEMO效果对比

图1

移植主要有这么几个文件需要处理,GUIConf、LCDConf、和GUIDRV_Template,如果需要添加系统支持和触摸,那就还需要移植两个文件GUI_X_uCOS和GUI_X_Touch_Analog。

GUIConf是GUI的配置文件,主要是初始化GUI的内存池,LCDConf里面主要就是LCD的初始化函数。GUIDRV_Template主要就是用来实现打点和画线的函数,需要注意一点,要使用GUIDRV_Template文件作为i我们驱动函数的文件,需要在LCDConf.C里面将#define DISPLAY_DRIVER GUIDRV_LIN_32改成#define DISPLAY_DRIVER 。

第一步需要将lib和include复制到我们的项目里面,lib是库文件include是头文件。。。

在我的GUI里面有如下几个文件,用过UCGUI的和移植过UCGUI的下面的文件夹肯定不陌生。

四轴飞行器1.6 emwin与ucgui的移植,汉字外挂字库移植和DEMO效果对比

图2

第二步就是移植底层代码。在我们的lcddriver里面,其实只要实现一个C文件,GUIDRV_Template.c,这个文件在图1的Sample\DisplayDriver文件夹里有。

GUIDRV_Template.c里面实现打点函数就可以了,然后需要优化,可以对画线,矩形填充等函数进行优化,会有明显的效果。

第三步,在LCDConf.c里面的LCD_X_DisplayDriver函数的LCD_X_INITCONTROLLER:下填写屏幕的初始化函数,顺便说下,触摸的初始化函数也可以放在这。

第四步,在GUIConf.c中,对GUI的内存池进行初始化,并且设置内存的大小,可以选择内部ram和外部的SRRAM,这里就看自己需要了。。

第五步,我们ucos系统,然后将GUI_X_uCOS添加到项目中,到此,就移植完了,emwin就可以跑了。。记得把库加到项目中。。

如果试用st的stemwin,只需要将库换成stemwin,通知在GUI初始化前开启CRC,执行RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);就可以。

触摸移植:

按照上面的三步,加入触摸屏的初始化函数进去,因为我们使用的是模拟芯片测touch的,和数字中断方式有点不同哈。。不过也很简单。。

第一步:在GUIConf里面设置宏定义,#define GUI_SUPPORT_TOUCH       (1)  开启触摸屏功能,在图1的\Sample\GUI_X中找到GUI_X_Touch_Analog.c文件夹,如果是使用数字式直接输出坐标的芯片,则要试用GUI_X_Touch_StoreState.c文件。。我们触摸屏输出的是模拟数据,所以采用GUI_X_Touch_Analog.c,在里面只需要实现

int GUI_TOUCH_X_MeasureX(void)和int GUI_TOUCH_X_MeasureY(void)函数,直接调用原子的TP_Read_XY2(&x,&y);就完成了,到此触摸屏也可以使用了。

外挂汉字库的移植

有点懒哈,本来打算用英文算了,以前ucgui里面也没有移植汉字库进去,今天想了想,还是弄进去吧,

可以直接参考这个http://bbs.armfly.com/read.php?tid=1604。。

这里只大致解释下汉字的实现原理。。

我们可以看到GUI_FONT的定于如下,要实现汉字的功能,我们就需要实现这个结构体的制定函数的功能。

 struct GUI_FONT {
GUI_DISPCHAR * pfDispChar;
GUI_GETCHARDISTX * pfGetCharDistX;
GUI_GETFONTINFO * pfGetFontInfo;
GUI_ISINFONT * pfIsInFont;
GUI_GETCHARINFO * pfGetCharInfo;
const tGUI_ENC_APIList* pafEncode;
U8 YSize;
U8 YDist;
U8 XMag;
U8 YMag;
union {
const void GUI_UNI_PTR * pFontData;
const GUI_FONT_MONO GUI_UNI_PTR * pMono;
const GUI_FONT_PROP GUI_UNI_PTR * pProp;
const GUI_FONT_PROP_EXT GUI_UNI_PTR * pPropExt;
} p;
U8 Baseline;
U8 LHeight; /* Height of a small lower case character (a,x) */
U8 CHeight; /* Height of a small upper case character (A,X) */
};

我们看下我们汉字字体的定义:

 GUI_CONST_STORAGE GUI_CHARINFO GUI_FontHZ24_CharInfo[] =
{
{ , , , (void *)"0:/SYSTEM/FONT/ASC12x24.bin"},
{ , , , (void *)"0:/SYSTEM/FONT/HZ24x24.bin"},
};
GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ24_PropHZ= {
0xA1A1,
0xFEFE,
&GUI_FontHZ24_CharInfo[],
(void *),
};
GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ24_PropASC= {
0x0000,
0x007F,
&GUI_FontHZ24_CharInfo[],
(void GUI_CONST_STORAGE *)&GUI_FontHZ24_PropHZ,
};
GUI_CONST_STORAGE GUI_FONT GUI_FontHZ24 =
{
GUI_FONTTYPE_PROP_HZ,
,
,
,
,
(void GUI_CONST_STORAGE *)&GUI_FontHZ24_PropASC
};
GUI_FontHZ24里面通过指向GUI_FontHZ24_Prop(GUI_FONT里面的GUI_FONT_PROP是个链表结构哈) ASC ASCII码字库,再通过GUI_FontHZ24_Prop里面的GUI_FontHZ24_PropHZ指向对应的汉字字库。
然后我们在看看对应 GUI_FONT 里面
 GUI_DISPCHAR * pfDispChar;
GUI_GETCHARDISTX * pfGetCharDistX;
GUI_GETFONTINFO * pfGetFontInfo;
GUI_ISINFONT * pfIsInFont;
GUI_GETCHARINFO * pfGetCharInfo;
const tGUI_ENC_APIList* pafEncode;
GUI_FONTTYPE_PROP_HZ,
GUI_FONTTYPE_PROP_HZ为
 #define GUI_FONTTYPE_PROP_HZ       \
GUIPROP_X_DispChar, \
GUIPROP_X_GetCharDistX, \
GUIMONO_GetFontInfo, \
GUIMONO_IsInFont, \
(GUI_GETCHARINFO *), \
(tGUI_ENC_APIList*)
如果你看了http://bbs.armfly.com/read.php?tid=1604,就直到这里面的GUIPROP_X_DispChar和 GUIPROP_X_GetCharDistX是在GUICharPEx.c实现的,这个也是具体读取汉字字库的地方,这里我们通过fatfa读取SD卡里面的字库。如果还需要添加其他字体,只需要实现对应的GUI_FONT结构体就可以了。。。。。