OpenEdv-开源电子网

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

关于刷TFT阻塞CPU的问题

[复制链接]

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
发表于 2014-8-22 11:20:40 | 显示全部楼层 |阅读模式
5金钱

1、硬件环境:
f407,主频168M,外扩SRAM做缓存驱动3.5寸480*320屏(驱动芯片:ILI9481)

2、过程:
先将需要显示的内容在SRAM中刷完,然后再一次性全部刷新在TFT上。
在TFT和SRAM的FSMC都配置在最快且显示正常的情况下,试过两种方式刷屏:
A、直接用for循环来刷新液晶,就是将外部缓存直接当作一个大数组,然后一步步扔进TFT就行

B、用DMA,只需要指定SRAM起始地址和TFT地址即可,不需要CPU一步步刷。
但是,由于DMA的M2M方式加上FIFO需要至少两次才能刷完整屏,
为了避免数据显示错位,需要硬等待第一次DMA完成后再完成第二次。

3、问题:
实测以上AB两种方式刷屏的最快频率是25ms。
那么就是说这个25ms是硬消耗CPU的,不能用来做其他事情。这样对整个系统实时性有一定影响,
希望大家给点意见.....

最佳答案

查看完整内容[请看2#楼]

跑os就可以去干其他事情了.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-8-22 11:20:41 | 显示全部楼层
跑os就可以去干其他事情了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

2177

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3321
金钱
3321
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-8-22 11:20:41 | 显示全部楼层
回复【8楼】KC_CEC:
---------------------------------
关于GUI方面我也不是太懂,但是如果是整屏改,我不建议用407,不如换F429+SDRAM。刷屏不是407的强项。
另外你可以参考下ucgui,用很少的RAM也可以实现流畅的界面。
或是参考下战舰综合实验的例子,通过外扩SRAM的形式实现流畅画面
回复

使用道具 举报

4

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2012-12-19
在线时间
0 小时
发表于 2014-8-22 12:16:06 | 显示全部楼层
40帧还可以。如果对实时性有影响说明不适合用屏幕
目前在玩STM32,BBB,RPi
回复

使用道具 举报

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
 楼主| 发表于 2014-8-22 12:31:40 | 显示全部楼层
想到了一个笨办法,就是在SRAM内部开两个缓存。C和D
两个交替给TFT刷屏,正在刷屏的一个缓存数据是不会改变的。
比如:
现在正在用C缓存刷液晶(DMA方式,发送一个命令即可),
然后其他任务同时在向D缓存写入这些任务所改变的显示。

当C缓存刷完一屏后,开始调用D缓存刷屏。与此同时,C
缓存需要将D缓存的数据完全读回来一次,在此基础上CPU
再来刷新C缓存。
依次交替下去.....

此方法可好?
回复

使用道具 举报

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
 楼主| 发表于 2014-8-22 12:38:06 | 显示全部楼层
想了想好像有点鸡肋,一个缓存就300k,两个就600多K了。
回复

使用道具 举报

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
 楼主| 发表于 2014-8-26 09:38:18 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
不管用哪种方式,如果是单缓存的话都得等待一屏完全刷完。
 不然刷了一半,CPU去改变了缓存内容,再去刷另一半的时候显示就会出问题
回复

使用道具 举报

3

主题

2177

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3321
金钱
3321
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-9-5 17:50:59 | 显示全部楼层
回复【6楼】KC_CEC:
---------------------------------
不用等吧,DMA中断里面加个标志位,刷完屏了置位即可。DMA传输期间CPU可以干其他事情。
另外可以从算法解决,找出两帧之间的差别,直接修改对应点即可。
回复

使用道具 举报

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
 楼主| 发表于 2014-9-6 09:26:31 | 显示全部楼层
回复【7楼】ricefat:
---------------------------------
如果知道在刷这屏的时候在上屏的基础上改变了哪里,那就好办了。
最开始我想的是将屏幕分成很多块,那一块刷新了就更新那一块的数据。
可是现在做的这个东西,几乎覆盖所有块的内容都会刷新的。

不知道您能不能提供一下思路?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 23:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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