飞控的遥控器打算自己做,这样全局都能掌握,可以通过遥控器对飞控的参数和飞行模式进行修改,而买遥控器是做不到这样的哈。。以后做图传的时候,屏幕还可以实时现实摄像头拍回来的画面,挺好的哈。。
做遥控我们选的是原子的战舰开发板,开发板附带小霸王那种遥控器,可以用这个来控制飞控哈,回忆童年有木有。。。板子还带一个ADXL345的加速度传感器,那还可以用开发板的姿态控制飞控的姿态。。哈。。应该挺好玩。。。
第一步我们打算先写一个GUI的界面,UI这东西就让我头疼哈。额。。打算第一版就没什么UI,就把要显示的数据往屏幕上堆就好了。。。以前在学校的时候针对原子开发板自己移植过UCGUI3.90a,并且做了一个ucos+ucgui+fatfs的干净模版工程。。打算直接用。。但是发现有个叫emwin的,看了下效果好很多,就像windows98到windowsxp的效果,本来就对UI界面烦心,这个效果好这么多,果断要用。。看了下,其实就是ucgui,额。。其实ucgui就是emwin。。。
先上个视频:
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
移植主要有这么几个文件需要处理,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的下面的文件夹肯定不陌生。
图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的定于如下,要实现汉字的功能,我们就需要实现这个结构体的制定函数的功能。
1 struct GUI_FONT { 2 GUI_DISPCHAR * pfDispChar; 3 GUI_GETCHARDISTX * pfGetCharDistX; 4 GUI_GETFONTINFO * pfGetFontInfo; 5 GUI_ISINFONT * pfIsInFont; 6 GUI_GETCHARINFO * pfGetCharInfo; 7 const tGUI_ENC_APIList* pafEncode; 8 U8 YSize; 9 U8 YDist; 10 U8 XMag; 11 U8 YMag; 12 union { 13 const void GUI_UNI_PTR * pFontData; 14 const GUI_FONT_MONO GUI_UNI_PTR * pMono; 15 const GUI_FONT_PROP GUI_UNI_PTR * pProp; 16 const GUI_FONT_PROP_EXT GUI_UNI_PTR * pPropExt; 17 } p; 18 U8 Baseline; 19 U8 LHeight; /* Height of a small lower case character (a,x) */ 20 U8 CHeight; /* Height of a small upper case character (A,X) */ 21 };
我们看下我们汉字字体的定义:
1 GUI_CONST_STORAGE GUI_CHARINFO GUI_FontHZ24_CharInfo[2] = 2 { 3 { 12, 12, 2, (void *)"0:/SYSTEM/FONT/ASC12x24.bin"}, 4 { 24, 24, 3, (void *)"0:/SYSTEM/FONT/HZ24x24.bin"}, 5 }; 6 GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ24_PropHZ= { 7 0xA1A1, 8 0xFEFE, 9 &GUI_FontHZ24_CharInfo[1], 10 (void *)0, 11 }; 12 GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ24_PropASC= { 13 0x0000, 14 0x007F, 15 &GUI_FontHZ24_CharInfo[0], 16 (void GUI_CONST_STORAGE *)&GUI_FontHZ24_PropHZ, 17 }; 18 GUI_CONST_STORAGE GUI_FONT GUI_FontHZ24 = 19 { 20 GUI_FONTTYPE_PROP_HZ, 21 24, 22 24, 23 1, 24 1, 25 (void GUI_CONST_STORAGE *)&GUI_FontHZ24_PropASC 26 };
GUI_FontHZ24里面通过指向GUI_FontHZ24_Prop(GUI_FONT里面的GUI_FONT_PROP是个链表结构哈) ASC ASCII码字库,再通过GUI_FontHZ24_Prop里面的GUI_FontHZ24_PropHZ指向对应的汉字字库。
然后我们在看看对应 GUI_FONT 里面
1 GUI_DISPCHAR * pfDispChar; 2 GUI_GETCHARDISTX * pfGetCharDistX; 3 GUI_GETFONTINFO * pfGetFontInfo; 4 GUI_ISINFONT * pfIsInFont; 5 GUI_GETCHARINFO * pfGetCharInfo; 6 const tGUI_ENC_APIList* pafEncode;
GUI_FONTTYPE_PROP_HZ,
GUI_FONTTYPE_PROP_HZ为
1 #define GUI_FONTTYPE_PROP_HZ 2 GUIPROP_X_DispChar, 3 GUIPROP_X_GetCharDistX, 4 GUIMONO_GetFontInfo, 5 GUIMONO_IsInFont, 6 (GUI_GETCHARINFO *)0, 7 (tGUI_ENC_APIList*)0
如果你看了http://bbs.armfly.com/read.php?tid=1604,就直到这里面的GUIPROP_X_DispChar和 GUIPROP_X_GetCharDistX是在GUICharPEx.c实现的,这个也是具体读取汉字字库的地方,这里我们通过fatfa读取SD卡里面的字库。如果还需要添加其他字体,只需要实现对应的GUI_FONT结构体就可以了。。。。。