emWin5.22在STM32上移植
(PS:此文档适用于TFT液晶屏使用FSMC方式进行数据传输的例程,其它的仅起参考作用)
STemWin是什么这里就不介绍了,大家看图吧
怎么样,炫吧,哈哈
不扯太多,直入主题吧!
首先这次移植需要的材料:
STemWin5.22->链接:http://pan.baidu.com/s/1o6sqxCm密码:9y76
STemWin5.12用户手册->链接:http://pan.baidu.com/s/1mgta0I0密码:49n4
这两份资料是我共享到百度云的,当然也可以去官网下载(建议不去,太慢了,我下的时候几十K每秒,不懂是不是我网速的原因)。
STemWin5.22官网下载链接:
资料下好之后,那么接下来我们进行移植。
首先我们要有一块开发板、TFT液晶屏。相信有开发板的基本都带有例程,那么我们从中随便选一份TFT液晶屏的例程出来(要
保证这份程序能驱动你的液晶屏让屏能正常显示,因为有些可能是板子和屏是分开买的,板子配套的例程不适合屏)。然后看一下
TFT液晶屏驱动函数所在文件是不是“LCD.C”和“LCD.h”(不区分大小写),如果不是下面这步可不管,如果是的话就修改文件名,
修改成什么无所谓(我的修改成ILI93xx.C和ILI93xx.H),只要不是“LCD.C”、“LCD.H”即可(这一步比较重要,因为STemWin
的库中有一个“LCD.h”的头文件)。这一步完成之后接下来我们开始把STemWin5.22加入工程项目中。
首先我们在下好的emWin资料中的以下目录下
“emWin\stemwin\STemWin_Library_V1.1.2\Libraries”会找到一个名为“STemWinLibrary522”的文件夹:
把这个文件夹复制到我们的工程目录下,然后在工程项目组中为其新建一个分组,如下:
如图中所示,把这四个文件添加进来,他们所在路径分别为: 1、 GUI_X.C -> “STemWinLibrary522\OS”
2、 GUIConf.c和LCDConf_FlexColor_Template.c->“STemWinLibrary522\Config”
3、 STemWin522_CM3_Keil.lib -> “STemWinLibrary522\Lib”
4、
接着把“STemWinLibrary522”中所有的头文件路径包含进去。以上几步完成之后接下来就开始进行部分的程序修改了。
首先我们点开“GUIConf.C”,会在里面看到这样一个宏:
” #define GUI_NUMBYTES 0x200000”
把“0x200000”改为“1024*50”即可(这个宏定义服务于在函数中向系统申请一个静态空间 aMemory ,接着调用 emWin的库函数GUI_ALLOC_AssignMemory 把该空间分配给 emWin。还有“1024*50”并不是定值,我们也可以改成“1024*40”或其它,视情
况而定,但一般建议设置成小于“1024*50”)。然后在“GUIConf.C”中就没有需要修改的了。
接着我们点开“LCDConf_FlexColor_Template.c”,在这个 .C 文件中我们先把TFT液晶驱动的头文件添加进来(如我的是#include “ILI93xx.h”)。接下来我们会看到里面有这样的四个函数void LcdWriteReg(U16 Data)、voidLcdWriteData(U16 Data)、void LcdWriteDataMultiple(U16 * pData, int NumItems)、voidLcdReadDataMultiple(U16 * pData, int NumItems) 然后像下面那样分别添加一句语句:
static void LcdWriteReg(U16 Data)
{
// ... TBD by user
ILI93xx_REG = Data;
}
static void LcdWriteData(U16 Data)
{
// ... TBD by user
ILI93xx_RAM = Data;
}
static void LcdWriteDataMultiple(U16 * pData, int NumItems)
{
while (NumItems--)
{
// ... TBD by user
ILI93xx_RAM = *pData++;
}
}
static void LcdReadDataMultiple(U16 * pData, int NumItems)
{
while (NumItems--)
{
// ... TBD by user
*pData++ = ILI93xx_RAM;
}
}
注意,上面新添加的ILI9341_REG 、ILI9341_RAM是根据我的TFT驱动文件中确定的,在我的驱动文件中它们俩
都是一个宏,原型为:
#define ILI93xx_REG *(__IO uint16_t *)(0x6C000000)
#define ILI93xx_RAM *(__IO uint16_t *)(0x6C000002)
ILI9341_REG 、ILI9341_RAM这两个值大家移植的时候要根据自己驱动文件中相应的宏进行修改。
上面这步完成之后我们再来看这个函数:
void LCD_X_Config(void)
{
GUI_DEVICE * pDevice;
CONFIG_FLEXCOLOR Config = {0};
GUI_PORT_API PortAPI = {0};
pDevice = GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_565, 0, 0);
LCD_SetSizeEx (0, XSIZE_PHYS , YSIZE_PHYS);
LCD_SetVSizeEx(0, VXSIZE_PHYS, VYSIZE_PHYS);
Config.Orientation = GUI_SWAP_XY | GUI_MIRROR_Y; /*这里是进行屏幕显示方向设置,如果这一句注释掉的话,那么你
原来初始化TFT的时候屏的什么方向就是什么方向。PS:如果屏幕显示出现显示反转或者镜像情况,可通过GUI_MIRROR_X、GUI_MIRROR_Y
以及GUI_SWAP_XY 等不同组合进行调整,如GUI_MIRROR_X | GUI_MIRROR_Y 。GUI_MIRROR_Y 等参数的详细介绍请参看用户手册*/
GUIDRV_FlexColor_Config(pDevice, &Config);
PortAPI.pfWrite16_A0 = LcdWriteReg;
PortAPI.pfWrite16_A1 = LcdWriteData;
PortAPI.pfWriteM16_A1 = LcdWriteDataMultiple;
PortAPI.pfReadM16_A1 = LcdReadDataMultiple;
GUIDRV_FlexColor_SetFunc(pDevice,&PortAPI,GUIDRV_FLEXCOLOR_F66708, GUIDRV_FLEXCOLOR_M16C0B16); /*这一步
我们需要修改的是GUIDRV_FLEXCOLOR_F66708这个参数。GUIDRV_FLEXCOLOR_F66708 这个参数的修改要根据你的TFT屏所使用的
驱动芯片,如我的TFT使用的驱动芯片是“ILI9325”,所以是GUIDRV_FLEXCOLOR_F66708。如果你的是“ILI9341”,那么就改成
GUIDRV_FLEXCOLOR_F66709 如果是其它型号的驱动芯片则需要查询emWin5.22的用户手册然后进行修改。emWin5.22用户手册
可在“STemWinLibrary522”文件夹中的“STemWinLibrary522\Documentation”目录下找到,该手册是一份PDF文档,打开之后
点开查找功能,输入“GUIDRV_FLEXCOLOR_F66709”便可找到,一般在1002页,具体看下图。*/
}
这一步很重要,很多人移植不成功都是在这一步没做好。
上面的步骤完成之后我们再往下看会找到这样一个函数
int LCD_X_DisplayDriver(unsigned LayerIndex,unsigned Cmd, void * pData)。在这里我们仅需在
case LCD_X_INITCONTROLLER: 项中加入我们TFT液晶的初始化函数即可;如我的是这样:
int LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void * pData)
{
int r;
(void) LayerIndex;
(void) pData;
switch (Cmd)
{
case LCD_X_INITCONTROLLER: {
LCDx_Init(); //添加TFT的初始化函数
return 0;
}
default:
r = -1;
}
return r;
}
以上步骤完成之后接下来就简单多了,emWin在运行过程中有时会调用延时之类的函数,为了实现精确定时,我们还
需要为emWin开一路定时器,这里我们选用StsTick。也即需要我们在mian()函数中加入SysTick_Config(SystemCoreClock /1000);
来初始化SysTick定时器,而在“stm32f10x_it.c”文件中,我们需要进行这样的修改:
extern __IO int32_t OS_TimeMS; //OS_Time 已在GUI_X.C中声明。
void SysTick_Handler(void)
{
OS_TimeMS ++;
}
这些工作完成后我们再回到main()中,在main()中我们需要添加
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC,ENABLE); 函数,注意如果不添加将无法使用emWin.
然后进行GUI初始化,记得先包含“GUI.h”。如我的程序是这样子的:
#include "stm32f10x.h"
#include "GUI.h"
int main(void)
{
SysTick_Config(72000);//定时1Ms
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);
GUI_Init();
GUI_DispString("Hello emWin!");
}
程序编译通过之后下载到板子上,移植成功的话会在左上角显示文本“Hello emWin!”。
本帖最后由 dj狂人 于 2015-5-19 22:09 编辑