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

请教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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版