emWin+touch移植到STM32战舰开发板

来源:互联网 发布:数据备份与维护 编辑:程序博客网 时间:2024/05/10 09:01

最近在做一个项目,硬件平台核心处理器STM32F103ZET6,该芯片功能很强大。

下面就把我移植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文件夹中找到 

粉框中是里面包含了产生1ms的定时器中断(由于获取触摸数据需要定时更
新),被定时调用GUI_TOUCH_Exec 函数

蓝框是库文件,分别在Lib文件夹和OS文件夹中找到。


第三步,改写配置文件

这一步是移植的关键,主要针对GUIConf.c、LCDConf_FlexColor_template.c文件进行改写,LCD驱动程序的改写上文已经提到了,这里不再赘述。

GUIConf.h文件:

主要是一些配置参数,这个根据情况改写就行,我没改。

GUIConf.c文件:

就改了一句这个:#define GUI_NUMBYTES  (1024*40),别的也没改。

LCDConf_FlexColor_template.c文件:

这个改动比较多,

首先,加载头文件:

在这个文件中,会有一些针对LCD硬件的基本操作,比如向寄存器里写数啊什么的,所以有很多人在这个文件中定义了LCD的寄存器,但自己做过LCD驱动的同志都应该已经在驱动程序里定义了寄存器,所以我直接包含了头文件用于调用。


这个结构体就是我们定义的寄存器地址了,如果这个地方不修改成LCD0,编译将出错

 

接下来,修改的是写命令函数与写数据函数


很简单哈,

再接下来是LCD_X_Config函数,这个改动很小,只有两处,一个是方向:竖屏、横屏。本实例采用横屏


Config.Orientation = GUI_SWAP_XY | GUI_MIRROR_X;//modify by lsw 横屏


还有一处是为适应ili9341触摸屏驱动芯片所做的修改


GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI, GUIDRV_FLEXCOLOR_F66709, GUIDRV_FLEXCOLOR_M16C0B16);


最后的LCD_X_DisplayDriver程序,因为我想用自己的初始化程序(据说emWin是提供兼容性很好的驱动程序的,但我没有深入研究)所以在case后边添加了初始化程序

好了,配置文件就改好了。

最后一步,主程序。

其实主程序没什么可说的,只是提醒工程中要加载好所以头文件,在调用GUI_Init()文件之前请务必一定要开启CRC时钟,emWin移植到STM32平台的验证信息。


RCC->AHBENR|=1<<6;
GUI_Init();


基本移植emWin点亮LCD之后,再加上触摸屏的移植操作。

首先先来介绍下需要准备的程序:

1、Touch基本驱动程序,这个我用的原子大哥自带的,进行了删减修改。

2、触摸板与emWin程序的接口程序,这个需要自己编写,不过很简单。

3、时钟程序,这个程序需要提供给GUI时钟,利用系统时钟中断做的,参照原子大哥delay程序改写。

4、touch校准程序,这个可以在emWin的仿真程序中获得,该程序位于文件夹Sample\Tutorial下,程序名称为TOUCH_Sample.c。

下面就来和大家详细说说移植过程:

首先,将touch.c、24cxx.c、myiic.c基本驱动程序加载到工程中:

接着我们新建一个C文件并加载到工程中,用来编写与GUI的接口函数:


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


这四个函数主要是用来测量出X、Y轴的模拟电压数据并交由emWin的上层来处理触摸输入,我们需要根据触摸屏驱动器来编写,所以我根据原子大哥的驱动直接调用了TP_Read_XY2(,)函数,并返回测试数据。前两个函数可以空着,只要后两个返回数据就可以了,这四个函数是由GUI_TOUCH_Exec()函数依次调用的。

这四个函数不用外加头文件声明函数,是因为在GUI.h中已经声明了,如图:

紧接着,我们进行时钟函数的编写,emWin运行时,会通过GUI_TOUCH_Exec()函数调用以上四个函数,来达到获取触摸数据的目的,而触摸数据需要定时更新,GUI_TOUCH_Exec()函数需要被定时调用,所以需要我们进行时钟函数的编写。

在时钟的选取上,我用TIM3定时器中断。

初始化程序详见源码,这里贴出中断处理程序:


时钟函数中我设置每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的驱动移植。
附上源码。


0 0
原创粉丝点击