再次体验一次STemWin的移植过程,具体代码来自这个帖子的“战舰开发板emWin5.22 + ucosii + touch”
GUI代码: STemWin5.22
移植平台:原子哥的探索者F4
显示屏: 原子哥的4.3电容触摸屏
一、拷贝相关文件组建工程,在这里直接使用了原子哥探索者综合实验的屏幕驱动代码,触摸驱动代码等等,详细可以到这里下载http://openedv.com/posts/list/13912.htm
二、组建工程的文件夹目录如下
三、打开MDK新建工程(我使用的是5.14版本),新建的工程目录如下
红色框框就是这次增加的文件,对比之前的就是这里不同,因为用的4.3电容触摸屏驱动IC在STemWin里面没有带,所以增加这个自定义驱动文件
绿色框框的和前面帖子一样
粉色框框的代码文件涉及到了液晶驱动,触摸驱动等等
注意了,这次使用的M4内核的芯片,还带了操作系统,所以LIB文件选择这个“STemWin522_CM4_OS_Keil.lib”
四、老规矩,开始代码的增加与修改
4.1、修改LCDConf_FlexColor_Template.c文件,这次用的是自定义驱动的方式,所以这里要改变一下,具体在这个函数
[mw_shl_code=c,true]/*********************************************************************
*
* LCD_X_Config
*
* Function description:
* Called during the initialization process in order to set up the
* display driver configuration.
*
*/
void LCD_X_Config(void) {
//
//创建显示驱动器
//
GUI_DEVICE_CreateAndLink(&GUIDRV_Template_API, GUICC_M565, 0, 0);
//
//设置坐标
//
LCD_SetSizeEx(0, lcddev.width, lcddev.height);
LCD_SetVSizeEx(0, lcddev.width, lcddev.height);
//
//设置触摸相关参数
//
if (lcddev.id == 0x5510)
{
if (lcddev.dir == 1) //横屏
{
GUI_TOUCH_Calibrate(GUI_COORD_X, 0, 800, 0, 800-1);
GUI_TOUCH_Calibrate(GUI_COORD_Y, 0, 480, 0, 480-1);
}
else //竖屏
{
GUI_TOUCH_Calibrate(GUI_COORD_X, 0, 480, 0, 480-1);
GUI_TOUCH_Calibrate(GUI_COORD_Y, 0, 800, 0, 800-1);
}
}
}[/mw_shl_code]
4.2、修改GUIDRV_Template.c文件,首先添加外部驱动头文件,定义FSMC操作地址(探索者用它来驱动屏幕的),然后在下图这个函数红色框框处增加打点函数
在下图这个函数红色框框处增加读点函数
完成上面的步骤,编译一下发现报警
报错说找不到“LCDConf.h”这个文件,这时我们创建这个文件保存在..\STemWin522_M4\EMWIN目录下,这个文件是个空文件即可,再次编译,发现没报错了
4.3、触摸函数修改,因为原子哥的驱动,我们省去了很多调试的麻烦了,直接使用,具体修改如下两个函数
[mw_shl_code=c,true]/**
*****************************************************************************
* @Name : GUI获取X轴值
*
* @Brief : none
*
* @Input : none
*
* @Output : none
*
* @Return : X轴数值
*****************************************************************************
**/
int GUI_TOUCH_X_MeasureX(void)
{
tp_dev.scan(0); //扫描触摸屏
return tp_dev.x[0]; //返回X坐标值
}
/**
*****************************************************************************
* @Name : GUI获取Y轴值
*
* @Brief : none
*
* @Input : none
*
* @Output : none
*
* @Return : Y轴数值
*****************************************************************************
**/
int GUI_TOUCH_X_MeasureY(void)
{
tp_dev.scan(0); //扫描触摸屏
return tp_dev.y[0]; //返回Y坐标值
}[/mw_shl_code]
对,就搞成这样
4.4、操作系统的支持,这个请参考帖子http://www.openedv.com/posts/list/36299.htm
五、操作系统ucOSII移植M4内核,这个文件来自帖子http://www.openedv.com/posts/list/33492.htm
5.1、修改os_cpu_a.asm文件,这里面和M3的没什么区别,主要是M4内核增加了硬件浮点数运算单元,这个就很有用了,提高了浮点数的运算速度了
上面两图中红色框框位置就是增加了对浮点数支持的汇编代码,好折腾啊
5.2、修改os_cpu_c.c文件,主要也是增加对浮点数的入栈和出栈,找到这个函数OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt)
上面两图红色框框中都采用了宏定义开关的方式加入代码的,只有开启了M4的硬件浮点数功能才使用以上代码,否则不使用,打开硬件浮点数功能在system_stm32f4xx.c文件中,找到void SystemInit(void)这个函数,开头就已经说了
上图按照红色 --> 绿色 --> 蓝色的顺序加入即可
5.3、以上代码修改完成之后,编译改错
六、编写main函数,定义任务相关参数,这我开启了如下的任务
[mw_shl_code=c,true]void LED0_Task(void * pdata);
void EmWin_DEMO_Task(void * pdata);
void Start_Task(void* pdata);
void Touch_Task(void* pdata);[/mw_shl_code]
总共4个任务
七、接下来就是编译改错步骤了,直到没有错误,直接下载板子运行验证。
八、下载后发现刷屏很慢,又在网上疯狂查找一番之后,发现STemWin这厮可以再次优化的,好吧,再来,修改一下代码,具体在GUIDRV_Template.c文件中几个函数修改
8.1、修改static void _FillRect(GUI_DEVICE * pDevice, int x0, int y0, int x1, int y1)函数
直接使用外部液晶驱动的块填充函数
8.2、修改static void _DrawBitLine16BPP(GUI_DEVICE * pDevice, int x, int y, U16 const GUI_UNI_PTR * p, int xsize)函数
直接对寄存器操作
8.3、优化前后STemWin自带High Speed刷屏对比
A、没有优化前,跑出来的成绩大概是537000
B、优化了块填充函数后,跑出来的成绩大概是12347000
C、优化了16BPP函数后,跑出来的成绩大概是12456000(只 出现了一次这么高的,后面没这么高了,晕)
由以上数据可以看出,优化前比较糟糕,优化之后有了很大的提升,后面两个成绩差不多,跑了一下,好像后面_DrawBitLine16BPP()函数优化和不优化没什么却别,是不是我的方法不对还是怎么样,好像不明显,有时候效果还差,望高手指点一二了。
触摸驱动要更新一下,本附件有时候触摸会卡住,用这家伙最新更新的驱动即可解决http://www.openedv.com/posts/list/43643.htm就自己动手了,我就不修改了,呵呵 |