STemWin5.22移植笔记
网上关于emwin的资料很少,我在移植的时候查了很多资料,对我一个感觉是好乱,有的代码改动的太多,这会让像我这种菜鸟无从下手,并且来源很乱,这让我决心写下这个笔记,来让新手快速入门emwin,高手当然飘过哦,这只限于我这种菜鸟罢了。
emWin是segger公司出的一款图形化界面,非常好看,大家所熟悉的ucGUI也是这个公司开发的,ucGUI是XP的,而emWin是win7哦!而移植也要比ucGUI简单的多,没有ucGUI那么麻烦。好废话少说,如正题。
1、获取库文件
首先,emWin库来源有两个,一个是MDK(KEIL)软件目录下的,另外一个是ST公司的emWin,这里我们用第二个,因为MDK目录下的emWin最新版本对于大家不是好获得(MDK5.0才是5.22,MDK4.7下是5.16的),而ST公司的那个好下载。http://www.st.com/web/en/catalog/tools/PF259225# 这个是下载地址哦,目前最新的是5.22的版本,打开页面,点击下面的Download,即可下载。
解压缩下载的压缩包,打开文件夹,我们看到
Libraries :里面就有我们需要的STemWin库
Project:这个是ST的工程文件,以官方的eval板子建的工程
Utilities: 这个是文件系统和eval板子的硬件驱动程序
我们打开Libraries文件夹,看到StemWinLibrary522了,先莫激动,这个我们先到这里。
2、库文件加到工程里
首先,我们借用原子的触摸程序(战舰的哦),先将前面找到的库文件夹复制到工程文件夹下, 注意:工程里的lcd.c和lcd.h改为ili93xx.c和ili93xx.h后重新加入到工程里,LCD_Init()也改为LCDx_Init()
下面的程序由ili93xx.h中剪切到ili93xx.c中,至于为什么做以上工作,移植过ucGUI的再知道不过了,这里就不多说了,不知道的可以百度哦。
typedef struct
{
u16
LCD_REG;
u16
LCD_RAM;
} LCD_TypeDef;
#define LCD_BASE ((u32)(0x6C000000 | 0x000007FE))
#define LCD ((LCD_TypeDef *) LCD_BASE)
如图:
接下来就是拿出你的剪刀了,首先把主程序里的触摸都剪掉,剩下下面的就行啦!
int main(void)
{
u8
i=0;
delay_init();
NVIC_Configuration();
uart_init(9600);
LED_Init();
LC。Dx_Init();
KEY_Init();
POINT_COLOR=RED;
while(1)
{
i++;
if(i==20)
{
i=0;
LED0=!LED0;
}delay_ms(20);
}
}
接着就是把文件加到工程你去那,下图是工程截图:
红框中间的三个文件路径:STemWinLibrary522\Config
GUI_X.c 的路径 : STemWinLibrary522\OS
接下来就是emWin的库啦,哈哈,打开Lib文件夹,看到那么多的文件,是不是晕了,我们仔细看看,ST给M0 M3 M4的都分配了库,还很了编译软件和有无系统的,简直是分的很好,显然我们用STemWin522_CM3_Keil.lib 这个库,好了,工程就到此就弄好了。
3、修改程序,启动emWin
接下来的工作就麻烦点喽,大家淡定点,其实也就一会儿的功夫喽!
首先动GUIConf.c中的GUI_NUMBYTES 为1024*50,50可以小点,不要太大,太大编译器会编译会错误的,
接下来是LCDConf_FlexColor_Template.c 这个文件,先将我们的ili93xx.h头文件包含进来,接下来加入以下两行程序,至于后面的地址为什么会这样,这是LCD显示里的哦
#define LCD_REG_ADDRESS
*(__IO uint16_t *)(0x6C000000)
#define LCD_DATA_ADDRESS *(__IO uint16_t *)(0x6C000800)
再就是下面的几个程序
static void LcdWriteReg(U16 Data) {
//
... TBD by user
LCD_REG_ADDRESS=Data;
}
static void LcdWriteData(U16 Data) {
//
... TBD by user
LCD_DATA_ADDRESS=Data;
}
static void LcdWriteDataMultiple(U16 *
pData, int NumItems) {
while (NumItems--) {
// ... TBD by user
LCD_DATA_ADDRESS=*pData++;
}
}
static void LcdReadDataMultiple(U16 *
pData, int NumItems) {
*pData = LCD_DATA_ADDRESS;
while
(NumItems--) {
// ... TBD by user
*pData++=LCD_DATA_ADDRESS;
}
}
此时重要的函数来喽void LCD_X_Config(void)
Config.Orientation
= GUI_SWAP_XY | GUI_MIRROR_Y;
这句是显示方向的,默认的是这个,弄好后,下进去板子,看是否正常显示,不正常显示可以试试该这里哦。PS:9341的能行,但是6804的不行,看哪位能解决哦!
GUIDRV_FlexColor_SetFunc(pDevice,
&ortAPI, GUIDRV_FLEXCOLOR_F66709, GUIDRV_FLEXCOLOR_M16C0B16);
GUIDRV_FLEXCOLOR_F66709这个东西很重要,有很多可以选的,太多了就不列在这儿了。移植的时候我就栽在这里啦,这是对控制芯片的支持,详细的请看最新手册5.22的(P991),也有中文的5.12,不过5.22支持的很多.
最后就是main函数喽
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,
ENABLE);
GUI_Init();
GUI_DispString("Hello
STemWin!");
记住这句一定要加上RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,
ENABLE); 不知道是为什么,大家加上就行喽,哈哈,现在编译把程序下到板子里去哦,哈哈 是不是成功显示了。 来张照片。哈哈,先歇会儿,后续再写上demo的和触屏的。
哈哈,来喽,大家再关注哦!demo和触屏的献上啦
4、加入demo,让emWin炫起来
首先,工程文件加入demo的文件,如下图
加入头文件gui_demo.h 然后再主函数里加入GUIDEMO_Main(); 好,编译程序,下进去,惊喜吗?看到经典的开始画面了,但是没有动,右下脚没有像别人的视频里的滚动啊!哈哈,莫急,因为我们还没有启动emWin的心跳哦!
有的是用systick,但是我没有实验成功,而是用定时器用的,其实都是一样,在HARDWARE里加入gui_time.c和gui_time.h文件,具体源码见工程喽,其实就是循环调用OS_TimeMS++;让emWin跳动起来。别忘了,主函数要调用定时器的初始化哦!我们再编译,程序跑起,哈哈,是不是动了。
欸,但是还有个问题,怎么就是一个画面,不往下去了呢?这是我们还没有开启demos的开关了,打开GUIDEMO.h文件,配置如下图,记住后面每个项目的开关要关掉很多的,不然会有错误的。我开了8个,到黑圈那里就好了。
再跑起程序,哈哈,这回就真的动了。高兴啊,见到win7风格的画面,我为以后的界面充满了信息。
5、启动touch,人机界面更美好
这是我们移植的最后一步啦,我们先看中文手册上是怎么说的(P765),见下图
那我们就按照这个步骤来喽。首先是硬件程序,由于我们用的5.22版本没有关于touch的C文件,我便从5.16那儿拷过来了GUI_X_Touch_Analog.c,把这个文件加入到StemWin5.22组里,因为直接就用的原子的触摸了,我们就直接调用TP_Read_XY2(&x,&y);这个函数,把他放进GUI_TOUCH_X_MeasureX(void)和GUI_TOUCH_X_MeasureY(void)这两个函数里,其实最后由这个函数GUI_TOUCH_Exec()循环调用,来一直读AD的值。哦,说到这儿,把GUI_TOUCH_Exec()这个函数也要放进前一步建的gui_time.c文件里,具体见源码喽!这就把前两步弄完了。
第三步没搞过,直接第四步吧。用示例确定校准值??迷惑,哪里的示例,怎么确定,哈哈,听我一步步说来。这里的值就是取得A/D转换器的最小值和最大值。emWin需要用这些值来把测量结果转换为以像素表示的触摸位。这4个值为:
emWin的示例文件夹中有一个小程序,可用来获取触控面板的这些值。该程序位于文件夹Sample\Tutorial下,程序名称为TOUCH_Sample.c。在硬件上运行该示例。其输出应类似于下侧的屏幕截图。
接下来我们在LCDConf_FlexColor_Template.c文件中加入上面提到的四个值
#define TOUCH_AD_TOP 221
#define TOUCH_AD_BOTTOM 3900
#define TOUCH_AD_LEFT 160
#define TOUCH_AD_RIGHT 3883
后面的数字只是临时写的,然后我们再新建gui_touch.c文件,这就是TOUCH_Sample.c文件的程序,我们拷贝过来到gui_touch.c中,如下图所示
然后下载程序,界面如下图
这是确定左上角的值,记住,一定要触摸,蓝色的X就是TOUCH_AD_LEFT的值,Y就是TOUCH_AD_TOP的值,然后下一张
同样触摸右下角,看到十字会移动到右下角,这是蓝色X的值为TOUCH_AD_RIGHT,Y值为TOUCH_AD_BOTTOM,这样,前面提到的四个值就已经确定了,同时改掉LCDConf_FlexColor_Template.c里的那四个值。
最后一步啦,哈哈,见下图,在LCD_X_Config函数里调用GUI_TOUCH_Calibrate函数,这样,我们的触屏移植就弄完了。
弄了好久了,寒假就开始了,到现在触屏终于可以啦,哈哈 ,发这个帖子也祝贺自己一下喽,哈哈,大神们指点意见哦!
附件有:
1、5.22英文手册和5.12的中文手册,2、前面的basic工程和后面的demo+touch的工程,3、pdf格式的移植笔记,4、emWin5.16-MDK和emWin5.22-MDK是MDK安装目录下的emWin库,分别是5.16和5.22的,5、SeggerEval_WIN32_MSVC_MinGW_GUI_V522是VC6.0可以仿真的库。
|