据说很多人说emWin这个家伙界面很漂亮,所以移植来玩玩,呵呵,小有成绩,大神们见笑了。。。
1、移植前如果你的LCD底层驱动什么的是“lcd.c和lcd.h”这样编写的,请改为其他的名字,比如什么的ili93xx、lcd_tft等名字,至于原因,自己思考吧
相关截图我是参考自带的参考手册英文版的(STemWinLibrary522\Documentation文件夹下的文档),有误的地方还请批评指正。
2、下载官网上的那个STemWin5.22的例程下来,具体可以官网搜索下载http://www.st.com/web/en/catalog/tools/PF259225#
3、拷贝文件到你的工程里面(前提是所建的工程液晶部分调试通过才行),呵呵
4、解压压缩包,进入“...\stemwin\STemWin_Library_V1.1.2\Libraries”这个文件夹,你会看到下图中的东东
没错,就是这个家伙了,将它拷贝到你的工程里,我在工程里面建立了一个EMWIN的文件夹进行存放,大家想怎么放怎么放哈
5、将STemWinLibrary522\Config文件夹中的GUIConf.c、GUIConf.h、LCDConf_FlexColor_Template.c添加进工程里,这步相信用过MDK或者Keil C51的都知道怎么操作的哈
6、选择lib库了,根据编译器类型ST的工程师已经分类好了,自己根据你的编译软件和芯片类型进行选择即可,我的MCU是STM32F103VET6的,MDK编译,所以我选择了STemWinLibrary522\Lib文件夹中的STemWin522_CM3_Keil.lib这个。添加进工程之后的样子
黄色框框是我改后的LCD底层初始化函数的文件名字,大家就参考即可,红色框框就是增加STemWin的工程文件了。同样的头文件路径添加,自己看着办哈
7、开始你的剪刀手了,修改代码,哈哈
A、在工程中打开“GUIConf.c”文件,找到GUI_NUMBYTES这个宏定义,默认的数值是0x200000,将它改小一点,我改成了1024*50,其他值就视情况而定,具体干嘛的请看说明。
B、接下来的void GUI_X_Config(void)这个函数,主要是设置内存分配、字体等,视情况修改。
C、“GUIConf.h”文件里面主要定义是否支持OS、缺省字体大小等等。
8、“LCDConf_FlexColor_Template.c”这个文件改写。
A、增加你的LCD底层驱动函数头文件,具体用到LCD接口的初始化函数不想添加也行,在这个文件中自己编写一下也可以的。
B、接下来改写LCD显示分辨率,视屏幕大小而定,因为我用的就是这个,所以保留不用修改,跳过
#define XSIZE_PHYS 240 // To be adapted to x-screen size
#define YSIZE_PHYS 320 // To be adapted to y-screen size
C、增加定义LCD寄存器、RAM操作地址(假如用FSMC控制,不同的块地址不一样),用其他控制方式的自己想想怎么搞哈
#define LCD_BASE (uint32_t)(0x60000000 | 0x0001fffe) //基地址
#define LCD_REG_ADDRESS (*(volatile U16*)LCD_BASE) //寄存器地址
#define LCD_DATA_ADDRESS (*(volatile U16*)(LCD_BASE + 2)) //RAM地址
D、填写操作函数内容,具体下面几个函数体
static void LcdWriteReg(U16 Data) //写寄存器
static void LcdWriteData(U16 Data) //写数据
static void LcdWriteDataMultiple(U16 * pData, int NumItems) //写入多组数据
static void LcdReadDataMultiple(U16 * pData, int NumItems) //读取多组数据
E、LCD底层初始化函数,在下面函数里面填上,具体位置不用说了吧,呵呵
int LCD_X_DisplayDriver()
F、void LCD_X_Config(void)这个函数,根据你使用的液晶控制器型号而定,具体宏定义请看数据手册的相关介绍
_1、下面这个函数设置LCD控制器型号、颜色格式等
pDevice = GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_565, 0, 0);
_2、接下来的这个Config.Orientation = GUI_SWAP_XY | GUI_MIRROR_Y;不需要的话可以将它注释掉(视你LCD初始化的时候对应寄存器的设置决定)。
设置了LCD的显示方向什么的,类似于LCD数据手册中的字符显示方向设置。参考下图
_3、GUIDRV_FlexColor_SetFunc(pDevice, &ortAPI, GUIDRV_FLEXCOLOR_F66709, GUIDRV_FLEXCOLOR_M16C0B16);
这个函数设置了LCD控制器的数据宽度什么的,其中形参GUIDRV_FLEXCOLOR_F66709,驱动器型号,参考下图定义
形参GUIDRV_FLEXCOLOR_M16C0B16设定了LCD数据总线宽度,颜色参数等,参考下图
G、接着在这个函数int LCD_X_DisplayDriver()里面添加你提供的液晶接口的初始化函数调用,具体增加位置请看函数中的说明,呵
9、接下来就开始main函数文件的修改了
A、添加头文件#include "GUI.h",集合了相关的API函数
B、接着在void main()中打开CRC时钟,RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);具体为什么想不明白,可能其中用到STM32的CRC计算功能吧
C、接着初始化emwin了,调用GUI_Init();函数,完了之后,可以调用GUI里面提供的API函数进行你的相关操作了,我就写了下面两句,其他的视兴趣而增加,呵呵
GUI_DispStringAt("Hello World!", 30, 200);
GUI_DispStringAt("Hello emWin!", 30, 216);
完成了点击编译,改错即可了,下载到板子上,结果就是下图这样,至于为什么你的LCD初始化函数里面设置的背景色是白色或者其他颜色,而这个显示是黑色的呢?这个问题大家就看着想清楚即可,呵呵
10、完成了这个就可以增加demo功能了。哈哈
11、将STemWin_Library_V1.1.2\Project\STM3210E-EVAL\Standalone中的Demo文件夹拷贝到工程中来,这里面我的MCU是STM32F103VET6的,不带操作系统的,所以我这里选择了STM3210E-EVAL\Standalone这个路径下的,至于带操作系统的,自己选择即可哈
12、在main函数文件中添加#include "GUIDEMO.h"头文件,接着在函数中增加SysTick_Config(SystemCoreClock / 1000);这个函数,我是利用这个SysTick定时器来做GUI的心跳的,所以加了这句,至于用定时器的方式的,请另行修改;接着增加demo的演示GUIDEMO_Main();这个函数。
13、在guidemo.h文件中找到下图这个家伙,这里是demo的开关哦,我这里打开了7个(将后面括号里的0 --> 1 就打开了,相反就关闭了,这个多此一说,哈哈),其他的自行demo,呵呵
14、在stm32f10x_it.c中断汇总文件中编写中断服务函数。
增加extern __IO int32_t OS_TimeMS;
编写SysTick_Handler中断服务函数,因为我用了这个做心跳,其他的自行处理
void SysTick_Handler(void)
{
OS_TimeMS++;
}
15、然后点击保存,再编译
红色框框里面,生成的代码还是有点大的,具体视你打开的demo多少有关估计。
触摸功能就暂时没加上,有空再说,呵呵
哈哈,至此就完成了STemWin5.22的移植了。高兴一下下,嘿嘿,心情无比激动,下载到板子上运行,哈哈看到界面了,爽
高兴之下就拍了个视频,有点大,1080P的,400多兆,看啥时候传上来给大伙们看看,呵呵
战舰板子的测试工程没弄,这个稍后奉上,我是用我自己的这个最小系统板子测试的http://www.openedv.com/posts/list/26648.htm
论坛上“745021926”这个坛友手上有我的这个板子,可以直接下载工程上去测试,呵呵
视屏分享:http://www.youku.com/playlist_show/id_22111265.html
|