最近一段时间在学习ucos+emWin移植,有关ucos移植的资料无论是论坛还是书籍都可以找到,但emWin就不同了,在各个论坛混迹了一个多月总算是把emWin移植到自己的开发板上,下面就把我的移植过程分享给大家:
第一步,准备移植文件。
要想在自己开发板上裸机跑emWin,需要以下程序:开发板相关硬件驱动,emWin程序。
相关硬件驱动我是在原子大哥战舰开发板配套的程序基础上改写的,至于emWin网上可以下载。
Software文件夹中主要是一些GUI开发会用到的小工具,移植不用管它。
OS中的GUI_X..c文件我们会用到
Lib中是emWin的核心文件,选取配套库文件即可
Inc中是emWin核心程序的头文件,需要整个文件的加载
Doc文件不用管,文档。
Config文件是移植需要自己动手更改的配置文件,我们会用到其中的一些文件。
至于与硬件相关的驱动程序,我改写了原子程序源码中的LCD驱动程序,原始的LCD驱动程序可以兼容不同驱动芯片型号,改写中我把那些兼容性代码都去掉了,并且更改了文件名称,在使用自己的LCD驱动程序时建议大家不要直接用lcd.c/.h来命名程序文件,程序中也请不要出现LCD名称的变量,编译会出错。
更改如下:
主要红框,不要直接写LCD
第二步,建工程加载文件
红框中加载了LCD与LED程序,LED程序用于指示程序正常运行。
绿框中是GUI的配置文件,这三个文件都可以在Config文件夹中找到
粉框中是系统文件,玩过原子板子的同志们都懂得的。
蓝框是库文件,分别在Lib文件夹和OS文件夹中找到。
第三步,改写配置文件
这一步是移植的关键,主要针对gui_config分组文件进行改写,LCD驱动程序的改写上文已经提到了,这里不再赘述。
GUIConf.h文件:
主要是一些配置参数,这个根据情况改写就行,我没改。
GUIConf.c文件:
就加了一句这个:#define
GUI_NUMBYTES (1024*40),别的也没改。
LCDConf_FlexColor_template.c文件:
这个改动比较多,
首先,加载头文件:
在这个文件中,会有一些针对LCD硬件的基本操作,比如向寄存器里写数啊什么的,所以有很多人在这个文件中定义了LCD的寄存器,但自己做过LCD驱动的同志都应该已经在驱动程序里定义了寄存器,所以我直接包含了头文件用于调用。

这个结构体就是我们定义的寄存器地址了,这也是为啥我把LCD改成了LCD0.。。。。
接下来,自行填写local
function
其实就是上文提到的一些基本操作,往寄存器里写数啊什么的。。。。这在LCD驱动了也是写过的。
很简单哈,
再接下来是LCD_X_Config函数,这个改动很小,只有两处,一个是方向,我把它注释掉了,得到竖屏,加上就是横屏
还有一处是看论坛上一位先驱做的,但不知道为啥那么改,姑且改了吧
最后的LCD_X_DisplayDriver程序,因为我想用自己的初始化程序(据说emWin是提供兼容性很好的驱动程序的,但我没有深入研究)所以在case后边添加了初始化程序
好了,配置文件就改好了。
最后一步,主程序。
其实主程序没什么可说的,只是提醒工程中要加载好所以头文件,在调用GUI_Init()文件之前请务必一定要开启CRC时钟,为啥我也不知道,但是不开就是不行。
编译后可能会出现#include “LCDConf.h”的错误,我直接注释掉了。。。。然后整个世界都安静了。
供上源码。
基本移植emWin点亮LCD之后,今天加上触摸屏的移植操作。
首先先来介绍下需要准备的程序:
1、Touch基本驱动程序,这个我用的原子大哥自带的,进行了删减修改。
2、触摸板与emWin程序的接口程序,这个需要自己编写,不过很简单。
3、时钟程序,这个程序需要提供给GUI时钟,利用系统时钟中断做的,参照原子大哥delay程序改写。
4、touch校准程序,这个可以在emWin的仿真程序中获得,该程序位于文件夹Sample\Tutorial下,程序名称为TOUCH_Sample.c。
下面就来和大家详细说说移植过程:
首先,将touch基本驱动程序加载到工程中:
这里没有加载有关IIC的程序是因为把touch程序中有关校准的程序都删掉了,所以没有加载,详见源码。
接着我们新建一个C文件并加载到工程中,用来编写与GUI的接口函数:

这个文件主要是GUI运行时需要调用的,里面包含四个函数:

这四个函数主要是用来测量出X、Y轴的模拟电压数据并交由emWin的上层来处理触摸输入,我们需要根据触摸屏驱动器来编写,所以我根据原子大哥的驱动直接调用了TP_Read_XY2(,)函数,并返回测试数据。前两个函数可以空着,只要后两个返回数据就可以了,这四个函数是由GUI_TOUCH_Exec()函数依次调用的。
这四个函数不用外加头文件声明函数,是因为在GUI.h中已经声明了,如图:
紧接着,我们进行时钟函数的编写,emWin运行时,会通过GUI_TOUCH_Exec()函数调用以上四个函数,来达到获取触摸数据的目的,而触摸数据需要定时更新,GUI_TOUCH_Exec()函数需要被定时调用,所以需要我们进行时钟函数的编写。
在时钟的选取上,看到论坛有人用定时器做,没有问题,但我选择的是用系统时钟中断来进行函数调用,这样做的原因主要是为了以后方便移植ucos-II操作系统,但是原子大哥的delay函数设计只有开启OS才会开启系统时钟中断,所以我们需要单独改写一下初始化程序和延时程序,等到以后移植操作系统后可以直接加在中断处理程序中。
初始化程序详见源码,这里贴出中断处理程序:

时钟函数中我设置每1ms中断一次,每10ms调用一次touch驱动函数。
最后我们需要调用emWin例程的touch校准函数

运行后发现按压触摸屏AD值有反应但是光标没有反应,这是因为我们在LCDConf_FlexColor_Template.c中少调用了两个函数导致无法进行校准。
这两个函数中TOUCH_AD_TOP,TOUCH_AD_BOTTOM,TOUCH_AD_LEFT,TOUCH_AD_RIGHT这四个值在上面定义了,

而这四个值的确认,我是在没有调用校准函数时(也就是运行GUI demo时光标没有反应的时候)按压左上角和右下角时得到x,y的AD值,左上角x为TOUCH_AD_LEFT,y为TOUCH_AD_TOP
右下角x为TOUCH_AD_RIGHT,y为TOUCH_AD_BOTTOM。确认四个值后加入这两个函数运行光标就可以动了,好了到此我完成了touch的驱动移植。
附上源码。
|