OpenEdv-开源电子网

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

给大家贡献一个STMF103的TFT+GDRAN+DMA不闪屏的方案

[复制链接]

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
发表于 2014-7-5 09:59:47 | 显示全部楼层 |阅读模式
一直在潜水,这次就贡献给大家一个基于STM32F103的不闪屏的方案,有需要的就拿去吧。硬件都是用的原子的战舰,所以有战舰可以直接拿来用了,不过我用的3.5寸的屏哦。
硬件:
1、带DMA和FSMC接口的单片机,这里用的是STM32F103ZE
2、SRAM芯片,这里用的是IS62WV51216(用了300kb,320*480*2=307200字节)
3、3.5寸的液晶屏,这里用的是5310
4、需要几个按键

软件:
1、用了3.0的库
2、用了FreeRTOS(当然裸奔也是可以的)
3、部分修改了原子的程序来用的,例如LCD.c删的只剩5310的驱动了,key.c实现单按松开有效,支持连续长按
4、提供了个还算完整的基本绘图需要的函数吧

硬件很简单,没有使用LCD驱动芯片,也不需要LCD控制器,就可以实现一个高速不闪屏,也是相当实惠的。屏幕刷新是以点更新为只准的,效率不高,原因对我的项目来说这个速度已经很好了,如果优化下可以更快,不过速度太快用户体验也不是很好。还有一个虽然我里面用的颜色是黑白的,但是事实上是用的u16的色哦,自己改成彩色也是可以的。

先上张图看看效果(学生党没有好手机,拍摄效果就这样了):





左右键可以移动垂直的(叫坐标线?),然后下面显示与正玄波相交点的数值。

注:第一次发帖文笔不好勿喷,这个也是我最近手上的一个项目里截取出来的,因为当时开始做的时候也问过原子哥、得到过很多人的帮助,所以在这里就完整的奉献给大家了。最近在坐等毕业证,心情焦躁的很啊,发帖赚赚人气,最后快毕业了有看中的求带走啊!!!

附上程序

3.0库+FrerRtos+GDRAN+DMA.zip

14.78 MB, 下载次数: 12121

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
 楼主| 发表于 2014-7-5 10:03:38 | 显示全部楼层
再附两张板子
其实,最这次的板子的布局不是很满意,看看下次再改版吧



回复 支持 反对

使用道具 举报

31

主题

269

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2012-5-18
在线时间
6 小时
发表于 2014-7-5 10:13:10 | 显示全部楼层
谢谢分享,赞。
谁来买我的火柴.....
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2014-7-5 14:03:49 | 显示全部楼层
好东西,多谢分享
坚持学习!就能成功!
回复 支持 反对

使用道具 举报

230

主题

1950

帖子

10

精华

论坛元老

Rank: 8Rank: 8

积分
4562
金钱
4562
注册时间
2010-12-14
在线时间
32 小时
发表于 2014-7-5 14:06:06 | 显示全部楼层
谢谢楼主无私奉献。谢谢
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!QQ:389063473Email:389063473@qq.com
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
 楼主| 发表于 2014-7-5 20:03:42 | 显示全部楼层
这样的贴就这么沉了?这样的刷屏方式恐怕是103,甚至是不用LCD控制器、LCD驱动IC最快的方案了吧,还免费提供了款实时操作系统模板+自写GUI,如果做项目我不信谁敢直接用FSMC刷屏,又慢又闪。。。。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-5 21:18:50 | 显示全部楼层
当然不会沉了,呵呵.
cool....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

89

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2014-3-11
在线时间
5 小时
发表于 2014-7-5 22:15:34 | 显示全部楼层
楼主威武~~
回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
发表于 2014-7-5 23:52:53 | 显示全部楼层
很好,感谢分享!
互联网,智能设备爱好者,欢迎讨论任何有意思的想法。
回复 支持 反对

使用道具 举报

1

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2014-7-1
在线时间
0 小时
发表于 2014-7-7 10:58:30 | 显示全部楼层
回复【2楼】solo:
---------------------------------
cool!,楼主很厉害,谢谢分享,酷贴一定要顶
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
 楼主| 发表于 2014-7-7 11:08:50 | 显示全部楼层
回复【10楼】taiwentaotwt:
---------------------------------
厉害个毛啊,都快成无业游民了。。。
回复 支持 反对

使用道具 举报

1

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2014-7-1
在线时间
0 小时
发表于 2014-7-8 10:13:07 | 显示全部楼层
回复【11楼】solo:
---------------------------------
至于这么惨吗
回复 支持 反对

使用道具 举报

7

主题

123

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2014-3-5
在线时间
3 小时
发表于 2014-7-8 10:49:18 | 显示全部楼层
楼主加油!楼主做的真好!
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
 楼主| 发表于 2014-7-8 11:11:14 | 显示全部楼层
回复【12楼】taiwentaotwt:
---------------------------------
嗯 也差不多
回复 支持 反对

使用道具 举报

9

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
226
金钱
226
注册时间
2014-4-3
在线时间
18 小时
发表于 2014-7-8 11:43:53 | 显示全部楼层
楼主做得不错,厉害。
回复 支持 反对

使用道具 举报

20

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2012-7-26
在线时间
0 小时
发表于 2014-7-9 16:28:28 | 显示全部楼层
设计得很好
赞~~~
开发板商城 www.eeboard.com/shop
回复 支持 反对

使用道具 举报

15

主题

114

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-7-1
在线时间
28 小时
发表于 2014-8-14 16:02:57 | 显示全部楼层
上操作系统了啊?可是我只是裸跑,没有学过操作系统啊!
回复 支持 反对

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2014-8-14 16:18:55 | 显示全部楼层
方案在哪儿呢,没看到,不会是常规的显存缓存吧?
于20150522停用该账号:http://www.microstar.club
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
 楼主| 发表于 2014-8-14 17:34:51 | 显示全部楼层
本帖最后由 solo 于 2016-1-12 13:39 编辑

回复【18楼】styleno1:
---------------------------------
方案如题,用的SRAM做缓存,DMA送数据,测试硬件及代码如附件。帖子上应该写得很清楚。。。
回复 支持 反对

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2014-8-15 10:05:01 | 显示全部楼层
回复【19楼】solo:
---------------------------------
确实,标题里写得很清楚,不该直接看正文的。谢谢分享
于20150522停用该账号:http://www.microstar.club
回复 支持 反对

使用道具 举报

6

主题

123

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1281
金钱
1281
注册时间
2012-5-27
在线时间
200 小时
发表于 2014-8-15 11:25:35 | 显示全部楼层
明白楼主的意思了 
楼主是通过外接的SRAM开辟了一段显存 然后对于在程序中循环调用DMA传输 来实现数据从显存到屏幕 这时候对于STM32来说就不用每次都对液晶屏发送设置坐标啊一系列的指令 所以提高了效率  操作起来也方便
正如5楼说的 确实是目前103 不用LCD控制器 外接驱动IC的最快的方案
回复 支持 反对

使用道具 举报

10

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2013-12-3
在线时间
0 小时
发表于 2014-8-15 15:30:38 | 显示全部楼层
大抵是这样,追求速度就得要消耗内存。
不用谢了……
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
 楼主| 发表于 2014-8-15 18:33:14 | 显示全部楼层
回复【21楼】STM32F103:
---------------------------------
嗯,对的。
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
 楼主| 发表于 2014-8-15 18:51:04 | 显示全部楼层
回复【22楼】eling13:
---------------------------------
追求速度肯定是要消耗内存的,在哪里也是如此,LCD驱动芯片自带内存,加之有的单片机自带LCD控制器,也仅仅是驱动方式灵活了些,控制方便了些,显存依旧是必须的。试问你买笔记本的时候,必定关注的一个问题不就有集显和独显的大小嘛,所以追求高速的显示做显存是最好的选择。DMA是高速高效传送大数据不错的选择,但是集成在103里却占用了CPU的时钟总线,所以DMA的使用不是无限制的,有时不当的操作会让你的CPU运行龟速。这里LCD驱动器芯片就解决了这个问题,它是CPU外的芯片不占用CPU的资源(或者说很少),加之它能处理一些CPU执行效率比较低的功能,例如LCD驱动芯片中的一些画图功能。还有一点不得不说,LCD驱动器(包括集成在单片机里的)它能够切换不能位色的显示方式,例如我做的那个界面只用了黑白两色却占用这16位色的资源,其实只需要8位就完全可以实现,那么需要的内存相应的也会减少一半。如果想做视频还是请考虑图像加速器。
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
 楼主| 发表于 2014-8-15 18:52:59 | 显示全部楼层
回复【17楼】zengan007:
---------------------------------
不上操作系统也是可以的,把自己需要的部分提取出来就可以了
回复 支持 反对

使用道具 举报

10

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2013-12-3
在线时间
0 小时
发表于 2014-8-19 09:24:39 | 显示全部楼层
回复【24楼】solo:
---------------------------------
哈哈,好几天没上了,就看见你给我回复了这么长的。你说得很对,据说DMA开启了,1ms内有1/3的时间是分给DMA的,不知道是不是,
所以处理不好的话也是有问题!
不用谢了……
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2014-7-28
在线时间
0 小时
发表于 2014-8-19 11:44:17 | 显示全部楼层
不错!  RGB接口的高分屏能不能这样做: 用一个CPLD或者FPGA负责对LCD控制 MCU往RAM里面写数据,只有收到命令以后才把RAM里面更新的数据刷到LCD上,这个怎么样?
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
 楼主| 发表于 2014-8-23 15:11:21 | 显示全部楼层
回复【27楼】Gasno:
---------------------------------
CPLD、FPGA没玩过,不过这样的话跟用一个LCD驱动器没什么区别,剩下的就看性价比和实用性了
回复 支持 反对

使用道具 举报

15

主题

114

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-7-1
在线时间
28 小时
发表于 2014-9-29 17:24:15 | 显示全部楼层
八神,我怎么没有看到你把与图片相关的数据写入到SRAM中去呢?然后也没有看到你显示图片的代码!  没有学过FreeRTOS和UCGUI !
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
 楼主| 发表于 2014-10-1 16:50:45 | 显示全部楼层
u16 *GDRAM = (u16*)(0x68000000);
把刷屏的数组直接定义到外部SRAM里,其他的就和平时定义到单片机内部一样使用。详情查阅FSMC资料。
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
 楼主| 发表于 2014-10-1 16:51:11 | 显示全部楼层
回复【29楼】zengan007:
---------------------------------
u16 *GDRAM = (u16*)(0x68000000); 
把刷屏的数组直接定义到外部SRAM里,其他的就和平时定义到单片机内部一样使用。详情查阅FSMC资料。
回复 支持 反对

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2014-10-2 12:53:11 | 显示全部楼层
还能说啥呢   顶起呀
回复 支持 反对

使用道具 举报

15

主题

114

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-7-1
在线时间
28 小时
发表于 2014-10-17 11:36:28 | 显示全部楼层
楼主,稍微看懂了一点你的代码,依然没有看到你是如何让将图片信息数据写入到SRAM中去的(不会是用UCGUI操作的吧?),只看到了你将SRAM的数据通过DMA传到液晶屏。我想实现的效果就是要将已有的BMP格式的图片刷到液晶屏上去,不知道改你的程序能不能实现。
回复 支持 反对

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1815
金钱
1815
注册时间
2011-10-9
在线时间
230 小时
发表于 2014-10-17 13:21:08 | 显示全部楼层
大概是这个样子

在 Sram 建立一个 显存  要修改啥东西 修改显存,然后直接把整个显存 dma 到屏幕上 对屏幕进行刷新
回复 支持 反对

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
发表于 2014-10-17 13:46:12 | 显示全部楼层
不错 33楼正解
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

14

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2011-10-16
在线时间
31 小时
发表于 2014-12-15 22:10:14 | 显示全部楼层
刚刚测试了这个程序,不闪屏是因为你没切换显示的颜色,如果在你的 static void fun_3_deal(u16 shift)函数里切换显示颜色,屏幕可是闪的厉害哦!
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
 楼主| 发表于 2014-12-16 08:27:39 | 显示全部楼层
回复【36楼】okyihu:
---------------------------------
首先刷屏的方式是每次送一屏,也就是液晶上有一个点变化,整屏数据都要送到LCD的RAM里,让它更新一次。颜色是u16的,也就是说65532色,刷的本身就是彩色。里面有一点要注意,工程里刷屏用的是线程后台自己送数据,而且刷屏的线程优先级最低,刷屏的时候要注意线程的优先级抢占与保护。这个只提供了一个简单的测试,而且我相信我优化的一定不如原子的好(战舰的综合里程也用的这种方式),从原理上来讲是不会出现明显闪屏的,如果代码优化的好的话。不知道你是如何测试的?
回复 支持 反对

使用道具 举报

14

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2011-10-16
在线时间
31 小时
发表于 2014-12-16 09:35:41 | 显示全部楼层
回复【37楼】solo:
---------------------------------
你好!
我是这样测试的,你不是有这个函数吗 static void fun_3_deal(u16 shift),这个函数里又调用了 LCD_Fill(0,60,420,260,BLACK); 我每次把这个函数赋值不同的颜色值(BLUE,RED...)等等,下载到我买的战舰开发板上,发现切换颜色的时候是明显的有闪烁。 
  其实你看看战舰开发板上自带的 LCD实验的效果就知道了,这个实验它每次对LCD填充单一的颜色值,都不用从外部RAM里取数据去填充,它的实际效果都会有闪烁感,更何况你的还要从外部RAM取数据去填充。
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
 楼主| 发表于 2014-12-16 14:36:38 | 显示全部楼层
回复【38楼】okyihu:
---------------------------------
贴代码。战舰的综合例程是不闪的,左右拖拉的效果也优化的很好。
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
发表于 2015-2-6 13:06:34 | 显示全部楼层
回复【39楼】solo:
---------------------------------
LCD_DMA_Enable 函数不建议死等,写成状态机方式,在死等期间CPU就可以处理其他事情。
但是这样就会有个弊端,在一次状态没有轮询完成时,不允许再向缓存更新数据,否则会出现断面效果。
为了避免这种情况,也可以考虑DoubleBuffer,但是DoubleBuffer在仅仅更新一部分的情况下仍然会带来一些问题。
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
 楼主| 发表于 2015-2-7 08:18:35 | 显示全部楼层
回复【40楼】KC_CEC:
---------------------------------
DMA本身速度就很快了,中断后的弊端你也懂的。
回复 支持 反对

使用道具 举报

3

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
538
金钱
538
注册时间
2012-7-19
在线时间
63 小时
发表于 2015-2-7 12:00:09 | 显示全部楼层
回复【41楼】solo:
---------------------------------
你的做法已经明白了,网上有人已经搞过了,其实就是用dma传输,从外部sram读取数据再发送到fsmc连接的lcd,这个还是很不错的,相当于一个lcd控制器了

而且根据总线矩阵的特点,这样的做法不会拖慢cpu正常在内部flash和内部sram运行的,原因是各自跑的总线是独立的,不会因为竞争导致仲裁


不过f2的dma+fsmc却有个巨大的缺陷,f2的dma主从机不能都是fsmc,无法完成上述功能;f4的dma控制器和f2好像是一样的,因此也有同样的缺陷
回复 支持 反对

使用道具 举报

23

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
金钱
307
注册时间
2015-2-19
在线时间
32 小时
发表于 2015-8-27 22:05:52 | 显示全部楼层
MARK,有时间学习一下
回复 支持 反对

使用道具 举报

9

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2011-7-11
在线时间
49 小时
发表于 2015-8-27 22:54:39 | 显示全部楼层
好,学习了~~~
回复 支持 反对

使用道具 举报

7

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2015-2-19
在线时间
0 小时
发表于 2015-11-28 23:01:20 | 显示全部楼层
谢谢分享 楼主用心啦
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2016-4-21
在线时间
70 小时
发表于 2016-4-21 01:39:08 | 显示全部楼层
谢谢分享!!!!
回复 支持 反对

使用道具 举报

5

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2016-9-8
在线时间
39 小时
发表于 2016-9-19 14:47:56 | 显示全部楼层
正在为刷屏太慢苦恼,感谢楼主
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-29 06:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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