OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10192|回复: 31

大家玩STemWin这么Hight,我也来一个F4的移植,带ucOSII的

[复制链接]

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-5-17 00:45:39 | 显示全部楼层 |阅读模式
再次体验一次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就自己动手了,我就不修改了,呵呵

STemWin522_M4.rar

21.41 MB, 下载次数: 2342

现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
925
金钱
925
注册时间
2012-2-27
在线时间
393 小时
发表于 2015-5-17 00:53:10 | 显示全部楼层
给力,代码也发一下嘛
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2015-5-17 01:03:56 | 显示全部楼层
回复【2楼】k-ad:
---------------------------------
刚才修改去了,网速慢,代码已经上传,谢谢!
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

17

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
925
金钱
925
注册时间
2012-2-27
在线时间
393 小时
发表于 2015-5-17 09:39:44 | 显示全部楼层
我想说你是神人
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2015-5-17 10:08:06 | 显示全部楼层
回复【4楼】k-ad:
---------------------------------
自个儿玩玩的,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-5-17 11:18:04 | 显示全部楼层
牛......
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2015-5-17 12:31:27 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
军哥,你这话这么讲就不合理了,相对你来说,那还差的远呢,应该是我对你说       牛。。。
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-5-17 23:24:24 | 显示全部楼层
回复【7楼】八度空间:
---------------------------------
别把我吹那么高啊,不好的。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2015-5-18 21:04:00 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
原子哥公认的大牛之人物,不用吹,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

1

主题

16

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2015-6-29
在线时间
1 小时
发表于 2015-8-22 09:50:17 | 显示全部楼层
不用库文件自带LCD驱动,请问,LCD的初始化函数放在那里了,没找到啊   谢谢
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2015-8-22 13:54:58 | 显示全部楼层
回复【10楼】放手一搏zrh:
---------------------------------
放main函数里面啊
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

1

主题

16

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2015-6-29
在线时间
1 小时
发表于 2015-8-22 19:56:34 | 显示全部楼层
回复【11楼】八度空间:
---------------------------------
恩   谢谢指点呀  已经移植成功了
回复 支持 反对

使用道具 举报

1

主题

16

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2015-6-29
在线时间
1 小时
发表于 2015-8-22 19:58:05 | 显示全部楼层

    demo已经跑起来了    
回复 支持 反对

使用道具 举报

1

主题

16

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2015-6-29
在线时间
1 小时
发表于 2015-8-22 20:18:34 | 显示全部楼层
回复【11楼】八度空间:
---------------------------------
不过还有个问题请教一下,我这个没有用读点函数怎么也行,这个函数的作用到底是干什么的。可以不要么???
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2015-8-22 22:16:17 | 显示全部楼层
回复【14楼】放手一搏zrh:
---------------------------------
你用到触摸的话,没有读点函数怪现象,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

1

主题

16

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2015-6-29
在线时间
1 小时
发表于 2015-8-22 22:27:03 | 显示全部楼层
回复【15楼】八度空间:
---------------------------------
奥  原来如此,暂时没有移植触摸   呵呵
回复 支持 反对

使用道具 举报

5

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-1-15
在线时间
25 小时
发表于 2015-10-27 17:30:32 | 显示全部楼层
我把驱动里的 没用的东西都删了,  稳定在 17750000.  偶尔会 高 c下。


回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2015-10-27 20:21:06 | 显示全部楼层
回复【17楼】bbssuiji:
---------------------------------
你的是探索者开发板?
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

5

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-1-15
在线时间
25 小时
发表于 2015-10-27 21:52:30 | 显示全部楼层
回复【18楼】八度空间:
---------------------------------
是的, F4探索者。  就是把TFT屏的驱动函数中的判断 全部去掉, 只使用5510的驱动。
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2015-10-27 22:27:38 | 显示全部楼层
回复【19楼】bbssuiji:
---------------------------------
初始化那里么?如果是那里,只是调用一次即可,判断不判断无所谓
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

5

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-1-15
在线时间
25 小时
发表于 2015-10-28 08:59:32 | 显示全部楼层
回复【20楼】八度空间:
---------------------------------
所有的呀。

//?ì??????
//x,y:×?±ê
//color:????
void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color)
{    

LCD_WR_REG(lcddev.setxcmd);LCD_WR_DATA(x>>8);  
LCD_WR_REG(lcddev.setxcmd+1);LCD_WR_DATA(x&0XFF);   
LCD_WR_REG(lcddev.setycmd);LCD_WR_DATA(y>>8);  
LCD_WR_REG(lcddev.setycmd+1);LCD_WR_DATA(y&0XFF); 
 
LCD_CTRL->LCD_REG=lcddev.wramcmd; 
LCD_CTRL->LCD_RAM=color; 
}  


void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color)
{          
u16 i,j;
u16 xlen=0;

xlen=ex-sx+1;  
for(i=sy;i<=ey;i++)
{
LCD_SetCursor(sx,i);       //?è????±ê???? 
LCD_WriteRAM_Prepare();      //????????GRAM   
for(j=0;j<xlen;j++)LCD_CTRL->LCD_RAM=color; //????????      
}  
}  


这俩应该很重要。
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2015-10-28 17:47:07 | 显示全部楼层
回复【21楼】bbssuiji:
---------------------------------
恩,是,速度快就靠它了
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

5

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-1-15
在线时间
25 小时
发表于 2015-10-29 23:21:24 | 显示全部楼层
发现你的 移植和原子的移植 都有一个BUG,  就是 获取 像素的颜色这个 函数  _GetPixelIndex() 不会 被GUI库所 调用,   

比如 设置模式为异或模式,GUI_SetDrawMode(GUI_DM_XOR);     此时 画图时  应该先 读取位置的颜色, 再做异或处理,  发现画出的图片不正常, 后来仿真发现  _GetPixelIndex() 这个函数 根本就不会 进来。   

感觉非常奇怪。 原子哥的程序  在这个地方也是表现的不正常。

专门又移植了一下,UCGUI, 在你的程序基础上,  发现表现正常。 

帮忙找下 原因了, 找了一个下午加一个晚上了, 还是不知道哪里的问题。
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2015-10-30 08:15:28 | 显示全部楼层
回复【23楼】bbssuiji:
---------------------------------
没有专门研究这个函数,如果用emWin自带的驱动,直接移植读取寄存器的函数,这个就是完全是可以读取点的颜色的,使用外部的打点和读点函数就没仔细研究了
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

5

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-1-15
在线时间
25 小时
发表于 2015-10-30 09:08:18 | 显示全部楼层
回复【24楼】八度空间:
---------------------------------
OK   3Q!
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2015-10-31 01:46:11 | 显示全部楼层
回复【25楼】bbssuiji:
---------------------------------
读点不一定每时每刻都在读取,不排除读取一定区域的保存起来,方便操作,提升速度
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

5

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-1-15
在线时间
25 小时
发表于 2015-10-31 09:06:31 | 显示全部楼层
回复【26楼】八度空间:
---------------------------------
我已经找到原因了,  
是优化的原因, 其实只 修改 打点函数和读点函数, 其他的函数都不要动, 
这样子, emwin的功能就能实现了,
 但是 速度 超慢, 每个点抖得设置坐标,然后写颜色。
画一条直线, 有几个点, 就得调用多少次 打点函数。 慢的 简直 惨不忍睹。

填充矩形的优化程序 没有判断 画图模式和打字模式, 直接就是填充了, 所以 速度飞起, 但是 异或画图模式会失败的。
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2015-10-31 13:29:16 | 显示全部楼层
回复【27楼】bbssuiji:
---------------------------------
异或要读取点的颜色在打点的
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

6

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
203
金钱
203
注册时间
2013-8-15
在线时间
44 小时
发表于 2018-5-21 09:14:32 | 显示全部楼层
求个帮助。
我现在要做一个多层窗口的显示,我想步骤是:先做一个背景window,它是第一层,然后其他的窗口作为第二层,显示在第一层之上。第二层的窗口有多个,且所有的第二层全部是透明窗口,并在第二层窗口里显示数值,绘制按钮等控件。Framewin的Dialog因为有标题栏和边沿栏,所以我不打算用它。

因为刚用emwin不久,所以不知道如何架构,也不知道我的这个想法是不是能实现。在这里向各位诚挚求助。
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2018-5-21 21:45:20 | 显示全部楼层
xyzjacky 发表于 2018-5-21 09:14
求个帮助。
我现在要做一个多层窗口的显示,我想步骤是:先做一个背景window,它是第一层,然后其他的窗口 ...

貌似有点复杂
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

6

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
203
金钱
203
注册时间
2013-8-15
在线时间
44 小时
发表于 2018-5-22 09:41:07 | 显示全部楼层
本帖最后由 八度空间 于 2018-6-2 12:23 编辑

就是说,我想在桌面窗口里显示静态图片,其他的窗口作为桌面窗口的子窗口、孙窗口(桌面窗口是默认就有的),这些子孙窗口是透明窗口。另外这些子孙窗口我是想用window的,而不是Framewin的。


桌面窗口

桌面窗口

这里再分享一个我做好的STemWin的demo代码的运行效果的视频。
本人用的设备的MCU:STM32F103RET6,ILI9341驱动的2.8寸TFT屏,接口是SPI的。
这些底层的准备工作我都做得差不多了,但就是不知道如何去架构我想要得东西(桌面窗口里显示静态图片)







回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2018-6-2 12:23:51 | 显示全部楼层
xyzjacky 发表于 2018-5-22 09:41
就是说,我想在桌面窗口里显示静态图片,其他的窗口作为桌面窗口的子窗口、孙窗口(桌面窗口是默认就有的) ...

也就相当是开机桌面有一个窗体(父窗口),这个窗体关闭不了的,其他打开的窗口(子窗口)就是在这个窗口上进行是吧,这样理解没错吧
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 09:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表