你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

请教STM32外挂SDRAM的读写冲突问题  

[复制链接]
tovax 提问时间:2018-2-28 11:53 /
阅读主题, 点击返回1楼
收藏 1 评论24 发布时间:2018-2-28 11:53
24个回答
tovax 回答时间:2018-3-10 14:15:49
C:\Users\Administrator\Desktop\STM32F4xx.jpg
hjj12 回答时间:2018-3-14 11:09:21
估计是SDRAM的ReadBurst配置不对导致的。我也碰到过该问题,显示屏是800*600分辨率的,只要对SDRAM进行操作时,就会闪屏,操作数据量越大,闪得越严重。

把ReadBurst配置为FMC_SDRAM_RBURST_ENABLE就解决了。(以下是我用的是ST32Cube生成的代码)

  hsdram1.Init.SDBank = FMC_SDRAM_BANK2;
  hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9;
  hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13;
  hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16;
  hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
  hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3;
  hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
  hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_3;
  hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE;
  hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1;

别外,LTDC需要实时的从SDRAM读取显存数据发送到RGB接口,以800*600的16位色屏为例,每秒读取的数据量高达28MB,读取间隔远小于1us,所以用信号量互斥是不实现的。

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

tovax 回答时间:2018-3-15 19:32:38
hjj1984 发表于 2018-3-14 11:09
估计是SDRAM的ReadBurst配置不对导致的。我也碰到过该问题,显示屏是800*600分辨率的,只要对SDRAM进行操作 ...

谢谢您的回复!
我现在的配置也是这样的,read burst是使能的。
请教一下,我一直还没有使用DMA2D,会不会跟这个有关系?
DMA2D的意思是不是这样的:LTDC在初始化的时候设定了显存的地址(ltdc_buffer),DMA2D的源地址为另外一块与显存大小一样的存储区域(dma2d_buffer),DMA2D负责把dma2d_buffer中的数据传输到ltdc_buffer中,写数据的话是往dma2d_buffer中写的。请问我的理解对不?
您说的read burst问题我再排查一遍,网上也有跟您说的差不多的,说是把burst length由8改为4。都是集中在了read busrt相关的这部分,应该是很重要的一个配置。
(昨天把fmc相关的配置,从头到尾一个一个的确认了一下,目前还没发现什么问题,所以才回头考虑是不是DMA2D没有使能导致的,您说的问题点我会再去想想,再次感谢!)
tovax 回答时间:2018-3-16 19:08:22
应该可以确定是FMC总线带宽冲突的问题,因为不单是往显存写数据会出问题,只要往SDRAM其他地址写入数据同样会出问题。
tovax 回答时间:2018-3-16 20:47:38

点评

大家提供了一些思路,楼主再试试?还是不能解决吗  发表于 2018-3-17 08:37
tovax 回答时间:2018-3-17 08:52:26
tovax 发表于 2018-3-16 20:47
http://bbs.21ic.com/forum.php?mod=viewthread&tid=1236494
http://bbs.21ic.com/icview-916406-1-2.html
...

是的,我遇到的这个问题在网上找到很多类似的帖子,要么是FMC read burst的长度问题,要么是没有结果的僵尸贴。FMC的配置我排查好多遍了,read burst也修改测试过,还是不行。
感觉这个算是个很普通的案例:以SDRAM作为显存,往SDRAM里写入数据,LTDC自动读取后刷新LCD。现在是单独显示都没问题,一旦写入数据就会花屏,数据写完之后就显示正常了。
请问有没有类似的案例代码,给参考一下呗,谢谢大家!
埃斯提爱慕 回答时间:2018-3-21 11:28:55
提示: 作者被禁止或删除 内容自动屏蔽
tovax 回答时间:2018-3-21 15:55:31
dsjsjf 发表于 2018-3-21 11:28
多个任务对同一个资源(SDRAM)的操作,需要用到互斥信号量

谢谢您的回复!
问题找到了:FMC读写数据这两个函数的问题
显示格式是RGB888的,于是在SDRAM里像素是24位的,与32位的AHB接口之间存在一个转换过程,来来回回的读写造成了“AHB总线冲突”,现在改成ARGB8888格式了,alpha填充0xFF就好了,这样读写像素的速度就提高了若干倍,目前显示"hello, world"和"毫秒表"都是没有问题的,目前是这样的状况,测试过程中发现问题的话我再回来补充。
再次感谢各位这些天的耐心交流!

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3 结贴奖励

查看全部评分

12

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版