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

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

[复制链接]
tovax 提问时间:2018-2-28 11:53 /
阅读主题, 点击返回1楼
收藏 1 评论24 发布时间:2018-2-28 11:53
24个回答
tovax 回答时间:2018-3-6 10:05:55
maxtch 发表于 2018-3-5 16:58
如果是这样的话,那必须拿外挂 SDRAM 当 VRAM,就要考虑 DMA 互锁了。两边都是顺序访问的话,只要调度得当 ...

好的,谢谢您的回复。我再排查一下,有结果后回来给你回复!
tovax 回答时间:2018-3-8 21:05:10
        while (1) {
                vTaskDelay(1000);
                // GUI_DispStringAt("Hello, World!", 200, 200);
                lcdisplay_red();
                LTDC_LayerAddress(LTDC_Layer1, SDRAM_BANK1_ADDR + AT800480_WIDTH * AT800480_HEIGHT * 0);
                LTDC_LayerPosition(LTDC_Layer1, 0, 0);
                LTDC_ReloadConfig(LTDC_IMReload);
        }

以上是LCD任务的代码:
GUI_DispStringAt("Hello, World!", 200, 200); ===> ucgui往SDRAM写入字符串
lcdisplay_red(); ===> 往SDRAM写入半屏红色
两个写入函数任选其一,LCD显示就会跳动;
如果没有这两个写入函数的话,显示正常。
我猜想是,LTDC周期性的通过DMA从SDRAM读取数据后显示,一旦有写入动作而没有互斥处理的话,势必会出现时序上的冲突。
不知道这样分析是否正确,还请大家帮忙,谢谢了!
tovax 回答时间:2018-3-10 09:59:26
目前的测试结果是:在GUI_DispStringAt前把LTDC禁止掉,写入数据之后把LTDC使能,这样就没有了跳动,但是由于LTDC使能后重新加载显示数据,显示会有明显的闪动刷屏现象。
那么,我的问题可能是这样的,LTDC的使能和禁止应该不合理,不能用LTDC_Cmd(DISABLE);LTDC_Cmd(ENABLE);这样的语句来操作吧,只要能把DMA传输关掉,把FMC的接口干净的留给GUI来写入数据应该会有不错的效果。
现在还没找到合理的暂停LTDC数据传输的方法,还请各位多多交流。
tovax 回答时间:2018-3-10 13:08:32
跳动:红色背景色,但是间歇性的跳出部分绿色、蓝色
闪动:红色背景色,但是会像幕布那样刷屏,没有其他杂色
tovax 回答时间:2018-3-10 13:23:14
这样的情况是不是不该去禁止LTDC,而是禁止对应的显示层呢?
tovax 回答时间:2018-3-10 14:15:49
C:\Users\Administrator\Desktop\STM32F4xx.jpg
hjj1984 回答时间: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其他地址写入数据同样会出问题。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版