LPC1788 emWIN屏幕闪烁瞬间花屏问题解决方案

LPC1788的emWIN移植好以后发现,静态的画片显示效果良好,虽然上次选择USE MICROLIB后,效果好的多,但是一旦加上交互(比如触屏动作)或者画面切换时仍然会出现瞬间的闪屏和图片错位,虽然不影响使用,但是对用户体验来说还是有很大的影响的。怀疑是SDRAM速度跟不上的原因,但是别人移植的emWIN同样的时钟频率,同样的SDRAM都没有出现这种情况,心中甚是疑惑,搞了好久,问题都没有解决。

今天把EMC时钟调高后瞬间闪屏错位的现象完全消除。

原来的EMC时钟为CPU核心时钟的一半,现在改为和CPU时钟频率相同。CPU核心时钟为120MHz,所以原来EMC时钟为60MHz,现在为120MHz。看了下SDRAM的数据手册,最高支持频率可达:166MHz/CL3,133MHz/CL2,所以SDRAM 120MHz在规定的频率范围内。

emcclk

sdram_clk

LPC1788 emWIN移植笔记(二)–触摸屏驱动移植

昨天对emWIN的LCD驱动进行了移植,今天要对触摸屏驱动进行移植。

对emWIN编写触摸屏驱动很简单,方法也有很多。在这里只详细介绍其中一种方法。

对emWIN触屏驱动进行移植,只需要配置GUI_TOUCH_X_ActivateX(), GUI_TOUCH_X_ActivateY(),GUI_TOUCH_X_MeasureX(), GUI_TOUCH_X_MeasureY()四个函数即可。

可以根据自己的驱动编写方式进行配置,一般GUI_TOUCH_X_ActivateX(), GUI_TOUCH_X_ActivateY()可以为空,只需要在GUI_TOUCH_X_MeasureX(), GUI_TOUCH_X_MeasureY()函数中返回触摸屏X轴和Y轴物理测量值即可。

还有一个十分重要的函数GUI_TOUCH_Exec(),这个函数需要定期调用已更新触摸屏的输出值。这个函数会在执行期间调用GUI_TOUCH_X_ActivateX(), GUI_TOUCH_X_ActivateY(),GUI_TOUCH_X_MeasureX(), GUI_TOUCH_X_MeasureY()四个函数来获取触摸屏X轴和Y轴物理测量值,然后根据GUI_TOUCH_Calibrate()校准后的参数进行触摸坐标的物理值和逻辑值的转换。然会把坐标的逻辑值存储在emWIN系统中。所以在触摸屏初始化时,需要调用GUI_TOUCH_Calibrate()函数进行校准。

GUI_TOUCH_Exec()可以放在系统节拍定时器或者普通定时器的中断函数中,至少应每10ms调用一次,利用查询的方式对触摸坐标进行更新;也可以放在触摸屏的外部中中断函数中,及时的对触摸坐标进行更新。

根据NXP官方例程中已有的触屏驱动,只要对其修改即可。项目中HW_X_Config()对系统节拍时钟进行了初始化,并使能了中断,每1ms中断一次。

touch1 项目中是通过系统节拍SysTick对GUI_TOUCH_Exec()进行调用,GUI_TOUCH_Exec()在ExecTouch()函数中,所以修改ExecTouch()函数即可。ExecTouch()在LCDconf.c中。

touch2

ExecTouch()中只需要把_CheckUpdateTouch()函数改成自己获取X轴和Y轴物理值的驱动即可,同时删除_SSP_SendCmd(PWRDOWN);

touch4

由于在ExecTouch()函数中调用了获取X轴和Y轴物理值的驱动函数,并且存储在了全局变量_TouchX和_TouchY中,所以在GUI_TOUCH_X_MeasureX()和GUI_TOUCH_X_MeasureY()中只需要返回变量_TouchX和_TouchY的值即可。

下面只剩下最后一步,对触屏进行校准,以找到触屏坐标物理值和逻辑值的对应关系。

找到LCD_X_DisplayDriver中调用的_InitController函数,接触在移植LCD驱动时对_InitTouch()函数的注释,并对_InitTouch()函数进行修改。修改为

TOUCH_BOARD_800_480_AD_LEFT,TOUCH_BOARD_800_480_AD_RIGHT,TOUCH_BOARD_800_480_AD_TOP,TOUCH_BOARD_800_480_AD_BOTTOM值可以根据NXP_emWin522_BSP\Start\Sample\Tutorial目录下的TOUCH_Sample.c测得。

touch5

然后在主程序或者_InitTouch函数中加入触摸屏驱动初始化函数,这样emWIN的触摸屏驱动就移植完成了。

touch3 测试了一下,触屏正常。

touch6

LPC1788 emWIN移植笔记(一)–LCD驱动移植

最近在学习LPC1788的LCD控制器,做完基本的显示和触屏实验后,就想着学习一下emWIN。

于是,在NXP的网站LPCware.com上下载了emWIN的库和例程。可是例程和自己的板子不是配套的,需要对其修改后才可以使用。经过好几个小时的修改,例程终于在我的LPC1788开发板上跑起来了。期间遇到了一些问题,下面就记录一下移植步骤,以供大家参考。但是仍然存在这一些问题,还望大家指教。

 

一、修改emWIN配置文件

移植emWIN需要修改GUIconf.c和LCDconf.c两个配置文件即可(GUIconf.c例程中已经写好,这部份不修改也可)。

GUIconf.c主要为emWIN分配管理空间,这一部分主要是修改GUI_X_Config函数,如下图所示。

emWIN_GUICONF 在MDK中对GUI_X_Config()中起效的是

这句话会把_aMemory数组放在名为GUI_RAM的段中,zero_init属性表示不对这片区域初始化。这需要在分散加载文件中定位。

在LCDConf.c中也有类似的存储空间分配:

LCD_CONF

__align(8) 表示对齐方式,8字节对齐,要求首地址的最后三位为0。_aVRAM数组大小为何为FB_XSIZE * FB_YSIZE / (4 / PIXEL_WIDTH)] 自己可以根据屏幕分辨率和像素位深来计算一下。

GUI_RAM段和VRAM段都需要在分散加载文件中分配好存储区域,例程的分散加载文件(FLASH.sct)如下:

可以在.map文件中看到段对应的地址

mapGUI_RAM首地址 OXA0000000 VRAM首地址0xA0C00000(因为_aMemory大小为(1024 * 1024) * 12 MByte,故偏移量为0xC00000)

下面需要修改LCDconf.c

修改其中的LCD_X_Config和LCD_X_DisplayDriver函数调用的InitController函数(如下图)

emWIN_LCD

原函数:

修改后的函数:

 

#ifndef _WINDOWS

因为暂时还没有加入触摸屏,所以把_InitTouch();也注释掉了。

此外还需把

改为

(因为原程序是靠EEPROM来配置的)

至此配置文件已经修改好了。

二、修改项目的启动文件(startup_LPC177x_8x_Keil.s)

修改上面的程序为:

三、修改主程序文件(main.c)

上面的程序改为:

在主文件中加入自己的SDRAM驱动以及LCD驱动(LCD驱动也可以写在LCDconf.C中的LCD_X_DisplayDriver函数调用的_InitController()函数里)

LPC1788 官方emWIM例程的移植修改大致就是上面的步骤,具体细节需要根据编译出现的细节对一些函数进行删减,编译后下载就可以看到如下画面:

IMG_20140601_222231

如过想尝试SEGGER公司的例程,则需要在项目中移除已存在的上面所示的演示例程,添加SEGGER官方例程,在…\NXP_emWin522_BSP\Start\Application\SEGGERDEMO文件目录下:

sample1sample2 然后添加相应的头文件目录,在主程序中添加头文件GUIDEMO.h,重新编译即可。演示程序的开关在GUIDEMO.h中,可以选择演示哪个例程。

guidemo

 

IMG_20140601_194625IMG_20140601_194708

但是编译下载后,发现LCD显示的动画会出现错位闪屏的现象,在MDK上设置use MicroLIB后情况得到较大幅度好转,但是

问依然存在,不知如何解决。

以后,将会继续添加对触摸程序的移植。

IMG_20140601_221843

IMG_20140601_221851

 

Technorati 标签: ,