GUI代码:STemWin_V5.22
调试平台:战舰STM32_V2.1
显示屏:2.8寸电阻触摸屏
一、工程来自之前的触摸移植http://www.openedv.com/posts/list/35740.htm
二、在工程中添加ucosii文件夹(工程代码来自http://www.openedv.com/posts/list/33492.htm),创建一个“APP”文件夹
三、在MDK中添加文件目录
注意红色框框的库了,这次是带操作系统的,所以要换成这个库才行,至于不同的编译环境,对应选择即可
蓝色框框就是添加操作系统的文件和新建的“APP"文件夹了
四、老规矩,修改代码
1、在”GUIConf.h“文件中将宏定义GUI_OS设置成1打开支持OS功能,接着增加一个宏定义
#define GUI_MAX_TASK (5)
在”GUIConf.c“文件中,这个函数”GUI_X_Config()“最后地方添加这个函数
GUITASK_SetMaxTask(GUI_MAX_TASK);
具体见工程代码
也可以阅读自带的参考手册的第339 ~ 350页的内容,这里我就不贴了,大家自行阅读
2、创建文件”app.c“和”app.h“并编写内容,主要是操作系统建立任务相关的代码,详细见工程
3、有一点需要说明一下的,这个函数“GUI_TOUCH_Exec();”(我在“触摸移植的帖子”里面有说过它的作用,不知道的请移步)我建立了一个任务进行检测,详细也可以阅读自带参考手册第913页,有这么一段,看红色框框内容
4、Main函数修改了,增加触摸初始化函数tp_dev.init();详细见工程代码
5、在delay.c文件中“SysTick_Handler”函数增加内容变成如下,因为触摸校准的时候OS还没启动
[mw_shl_code=c,true]void SysTick_Handler(void)
{
/* 编写与SysTick定时器中断操作相关的API函数调用 */
OSIntEnter(); //ucos进入中断
OSTimeTick(); //调用ucos的时钟服务函数
OSIntExit(); //ucos退出中断
if(Touch_flag) //进入触摸校准模式,刷新坐标数据
{
GUI_TOUCH_Exec();
}
}[/mw_shl_code]
在触摸校准的时候调用“GUI_TOUCH_Exec();”这个函数进行刷新触摸坐标数据,详细见工程代码
6、注释掉“stm32f10x_it.c”中的“void SysTick_Handler(void)”函数,至于原因自己查看工程代码,呵呵
7、将文件“emWin_Touch.c”中函数体“void Touch_Adjust(void)”最后的一句“GUI_Delay(100);”改为“delay_ms(100);”,请看文件“emWin_OS.c”中函数“GUI_X_GetTime(void) ”的内容,因为操作系统还没跑起来,没改的话直接就进入硬件错误了。
五、编译改错了,下载到板子上,看到屏幕上的进度条怎么比之前触摸的工程跑的还慢???怎么回事呢,肯定有人会问的,大家看下这个函数int GUI_X_GetTime(void) 也许你会明白了
没错,这个和操作系统的心跳节拍有关的
最后,修正一个移植的bug
记得之前触摸移植帖子的这个图么?
我在“LCDConf_FlexColor_Template.c”移植的时候犯的一个错误,C最基本的错误,对比一下下面两个图片
A、存在阴影时的读取LCD函数
注意红色圈出来的地方,这是有阴影的读取LCD函数代码
B、修正这个bug时的读取LCD函数
注意红色框框的内容,这个是修正BUG之后的读取LCD函数代码,就是这个区别
下面讲解一下,举个例子:
int x,y;
int i=5;
x = i++;
y = i;
运行的结果是:x = 5, y = 6。怎么区分呢?后缀式的为“先引用后增值”。i--也是同样道理
int x,y;
int i=5;
x = ++i;
y = i;
运行的结果是:x = 6, y = 6。怎么区分呢?前缀式的为“先增值后引用”。--i也是同样道理
所以之前移植的就漏掉了一个数据没有读取进来,所以造成了这个错误,呵呵
|