1、不开源的emwin其实很简单,我们可以从NXP的官方得到,加载到MDK的源文件目录如下:
2、按顺序,先移植
GUIConf.c文件,主要有以下代码:
#define GUI_NUMBYTES(1024 * 40) #define GUI_BLOCKSIZE (500)U32 static _aMemory[GUI_NUMBYTES / 4] __attribute__ ((section ("GUI_RAM"), zero_init));
void GUI_X_Config(void) {GUI_ALLOC_AssignMemory(_aMemory, GUI_NUMBYTES); GUI_ALLOC_SetAvBlockSize(GUI_BLOCKSIZE); GUI_SetDefaultFont(GUI_FONT_6X8); GUITASK_SetMaxTask(GUI_MAX_TASK); }
3、完成GUIConf.c文件后,接下来是
GUIConf.h文件,该文件主要完成一些配置宏的定义:
#define GUI_NUM_LAYERS16 // Maximum number of available layers #define GUI_OS(1) // Compile with multitasking support #define GUI_MAX_TASK(1) // Max. number of tasks that may call emWin #define GUI_SUPPORT_TOUCH(1) // Support a touch screen (req. win-manager) #define GUI_DEFAULT_FONT&GUI_Font6x8 #define GUI_SUPPORT_MOUSE1 // Support a mouse #define GUI_WINSUPPORT1 // Use window manager #define GUI_SUPPORT_MEMDEV0 // Memory device package available #define GUI_SUPPORT_DEVICES1 // Enable use of device pointers
4、上面两个文件都没什么,接下来的
LCDConf.c才是大块头,该文件内容稍多些,这里拿出重点说说。
#define XSIZE_PHYS 800#define YSIZE_PHYS 480#define COLOR_CONVERSIONGUICC_M8888 #define PIXEL_WIDTH4
__lcdInit(); __touchInit();
5、好了,其实经过上面几个步骤,你的GUI基本可以显示了,好像很简单的样子。是的,接下来加入操作系统相关函数,因为在操作系统的多任务同时操作GUI函数时,必然要考虑保护机制,其实也很简单,官方都有给出代码,稍作修改即可,重要的是要理解其用意。我这里用的是uCOS-II,如果你在某个地方找到一个
GUI_X_uCOS.c的文件,恭喜你,这个文件基本可以用的了,下面讲讲这个文件的原理。
intGUI_X_GetTime (void) {return ((int)OSTimeGet()); }
voidGUI_X_Delay (int period) {INT32U ticks;
ticks = (period * 1000) / OS_TICKS_PER_SEC; OSTimeDly((INT16U)ticks); }
staticOS_EVENT *DispSem; staticOS_EVENT *EventMbox; staticOS_EVENT *KeySem;
voidGUI_X_InitOS (void) {DispSem = OSSemCreate(1); EventMbox = OSMboxCreate((void *)0); }
voidGUI_X_Lock (void) {INT8U err;
OSSemPend(DispSem, 0, &err); }
voidGUI_X_Unlock (void) {OSSemPost(DispSem); }
U32GUI_X_GetTaskId (void) {return ((U32)(OSTCBCur->OSTCBPrio)); }
void GUI_X_WaitEvent (void) {INT8U err;
(void)OSMboxPend(EventMbox, 0, &err); }
void GUI_X_SignalEvent (void) {(void)OSMboxPost(EventMbox, (void *)1); }
6、好了,多任务也有了,现在就放心地在uCOS-II里面自由调用吧。但,好像事情还没结束,我们用的是触摸屏,不管是电容屏、电阻屏都好,道理都是一样的,在早期开源的版本中,我们可以直接在开源代码的
GUI_PID.C源文件里的
void GUI_PID_StoreState(const GUI_PID_STATE *pState)
函数里面增加,但在emwin里面,该方法已行不通,可以用以下的办法:
void TaskGUI(void *pvData)
{
GUI_PID_STATE State;
while(1) {
if (!(LPC_GPIO2->PIN & 1 << 10)) { // 有按键按下
if (__checkUpdateTouch()) {
State.Pressed = 1;
State.x = measureX;
State.y = measureY;
GUI_PID_StoreState(&State);
GUI_TOUCH_Exec(); // 刷新坐标
}
} else {
GUI_PID_GetState(&State);
State.Pressed = 0;
GUI_PID_StoreState(&State);
}
WM_Paint(0);
GUI_Delay(1);
} }
__checkUpdateTouch()
7、经过上面几步操作,emwin的移植其实已经结束了,这里面要增加一点:emwin默认没有中文字库,需要我们自行增加字库存。
extern const GUI_FONT GUI_FontHZ12;#define GUI_FONT_HZ12&GUI_FontHZ12
1、为何多任务时,GUI_MAX_TASK一定要宏定义成1,并且一定要在GUI_X_Config()函数里面调用GUITASK_SetMaxTask(GUI_MAX_TASK);
2、emwin的显存指向片外SDRAM有问题,如果指向片内的SRAM就没有问题,初步确定SDRAM的初始化有问题。