硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1736|回复: 8
收起左侧

[DMA2D] STM32H7有没有办法利用DMA2D刷屏FMC总线上的LCD

[复制链接]

2

主题

5

回帖

11

积分

新手上路

积分
11
发表于 2022-3-19 22:24:29 | 显示全部楼层 |阅读模式
使用的是STM32H750VBT6和一块480*320分辨率的屏幕,驱动方式是FMC,没有办法外拓SDRAM了。
但是刷一张RGB565格式的图需要320*480*2字节的内存,也就是300KB,JPEG硬解的解码源地址目标地址也需要占用内存,导致片内的RAM不够用。
于是想用DMA2D直接把JPEG硬解出来的YCrBr转换成RGB565后直接发送到LCD上,LCD的RS是放在A19上,LCD的数据地址就是0x60100000,按理说这个地址从0x60100000到0x601FFFFF都可以用来刷LCD的数据,有1M左右的空间不会改变LCD RS的状态,是足够的,但是我把DMA2D的目标地址换成LCD的数据地址后(启动DMA2D前也设置好LCD刷屏区域了),LCD显示是花屏的,所以来求助一下该怎么修改。
附两张刷比较小的图片的显示效果,正常显示的是DMA2D发送到数组里,然后用数组刷屏,花屏的是DMA2D直接刷到LCD上。


花屏

花屏

正常显示

正常显示
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2022-3-20 00:02:45 | 显示全部楼层
FMC驱动的什么屏,直接对这个屏开窗口模式,然后DMA2D就可以刷新。
回复

使用道具 举报

10

主题

92

回帖

122

积分

初级会员

积分
122
发表于 2022-3-20 10:25:01 | 显示全部楼层
还有这种玩法! 我也来试试看!
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2022-3-20 12:56:49 | 显示全部楼层
eric2013 发表于 2022-3-20 00:02
FMC驱动的什么屏,直接对这个屏开窗口模式,然后DMA2D就可以刷新。

是驱动的ILI9488
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2022-3-20 13:06:27 | 显示全部楼层
更新一下进展,DMA2D可以直接传图片给LCD显示了,但是一旦开启DMA2D的PFC转换就会出现撕裂现象,这里附一下效果图正常的效果的那张图,底下的花屏是因为没RAM给解码的缓冲了,定义小了造成的,DMA2D进行PFC转换后再后交给DMA2D传给LCD显示。
撕裂那张是DMA2D进行PFC转换的目标地址直接定义成LCD。

JPEG硬解出来的图片通过DMA2D转换到目标缓冲后再通过DMA2D发送给屏幕的效果

JPEG硬解出来的图片通过DMA2D转换到目标缓冲后再通过DMA2D发送给屏幕的效果

JPEG硬解出来的图片在DMA2D转换中直接发送给LCD的效果

JPEG硬解出来的图片在DMA2D转换中直接发送给LCD的效果

贴一下代码,两个函数唯一的区别就是有一个带了PFC转换,所以我怀疑是DMA2D如果开了PFC转换会在目标缓冲有其他操作,FMC就一IO,收到数据就传给LCD,结果就撕裂了
正常显示代码

正常显示

正常显示
显示撕裂代码

显示撕裂

显示撕裂

回复

使用道具 举报

10

主题

92

回帖

122

积分

初级会员

积分
122
发表于 2022-3-20 15:34:07 | 显示全部楼层
LH(0~7WRXPM2KN~J5}OHK@Q.png
3Y[DRZ})0Z)2}6[43}6G3C6.png
我也是使用类似方法, 不知道是不是模式不对.
现在可以显示, 简单的页面正常, 但是有重叠的地方会乱码.
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2022-3-21 10:28:30 | 显示全部楼层
`dc2018 发表于 2022-3-20 15:34
我也是使用类似方法, 不知道是不是模式不对.
现在可以显示, 简单的页面正常, 但是有重叠的地方会乱码. ...

你调用dma2d的方式不太对,NLR寄存器前16位也就是xSize是每行像素数,后16位也就是ySize是总共的行数,不能把数据塞给xSize的,放不下,只要FGOR和OOR这两个寄存器(存放偏移的寄存器)为0就不会影响FMC上LCD的显示效果
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2022-3-21 11:27:15 | 显示全部楼层
再更新一下,研究手册的时候发现SRAM1-SRAM3空间是连续的,有288KB,然后就尝试了一下把JPEG解码的数据放在这个区域,AXI SRAM上则开一个300KB的空间放刷屏数据,简单测试以后发现是够用的,320*480分辨率的图片解出来的YCrBr(貌似一般都是用的YCrBr4:2:0)应该不会超过288KB(注:没有严谨测试过),剩下的空间还有DTCM里的128KB+AXI SRM里剩的212KB+SRAM4里的64KB,还剩下404KB呢,解决了显示的大头后做其他应用也完全足够。
测试发现内存复制花费的时间非常少,主要时间全部都花费在FMC总线刷数据上了,一张320*480的图片解码花费2-3ms,刷数据花费7-8ms,FMC总线速度相对来说比较慢,因此就不纠结直接把数据刷到LCD屏幕上了。
当然DMA2D开启PFC转换如果把目标地址设置成LCD地址的话还是画面撕裂,这个问题没有解决,如果有解决办法的话请分享一下,非常感谢!
结贴!
回复

使用道具 举报

10

主题

18

回帖

48

积分

新手上路

积分
48
发表于 2022-3-29 21:40:57 | 显示全部楼层
本帖最后由 spear47 于 2022-3-29 22:48 编辑

对的我也发现有这个问题,如果DMA2D开着PFC直接把转化完的数据传给lcd就会乱码。。只有先缓存一下再把dma2调成RGB-RGB无PFC模式才能正常传给MCU屏显示。得多占几百kb的RAM,找不到更好办法唉
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-28 12:21 , Processed in 0.188351 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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