OpenEdv-开源电子网

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

有人对F429的LTDC理解很透彻的吗,有几个问题求助

[复制链接]

29

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2016-12-29
在线时间
100 小时
发表于 2017-5-25 09:39:07 | 显示全部楼层 |阅读模式
5金钱
1. LTDC_Layer_InitStruct.LTDC_HorizontalStart = HBP+1;//30; 43
  LTDC_Layer_InitStruct.LTDC_HorizontalStop = (LCDX + HBP );
  LTDC_Layer_InitStruct.LTDC_VerticalStart = VBP+1;//4;
  LTDC_Layer_InitStruct.LTDC_VerticalStop = (LCDY + VBP ); //(272 + 12 - 1);
  LTDC_Layer_InitStruct.LTDC_PixelFormat = LTDC_Pixelformat_RGB565;   
  LTDC_Layer_InitStruct.LTDC_ConstantAlpha = 255;   
  LTDC_Layer_InitStruct.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_CA;   // LTDC_BlendingFactor1_CA
  LTDC_Layer_InitStruct.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_CA;  //LTDC_BlendingFactor2_CA
  LTDC_Layer_InitStruct.LTDC_DefaultColorBlue = 0x0000ff;        
  LTDC_Layer_InitStruct.LTDC_DefaultColorGreen = 0;      
  LTDC_Layer_InitStruct.LTDC_DefaultColorRed = 0;         
  LTDC_Layer_InitStruct.LTDC_DefaultColorAlpha = 0;          
  LTDC_Layer_InitStruct.LTDC_CFBLineLength = ((LCDX * 2) + 3);  
  LTDC_Layer_InitStruct.LTDC_CFBPitch = (LCDX * 2);                         
  LTDC_Layer_InitStruct.LTDC_CFBLineNumber = LCDY;                   
  LTDC_Layer_InitStruct.LTDC_CFBStartAdress = (uint32_t)&gImage_gg;   
  LTDC_LayerInit(LTDC_Layer1, &LTDC_Layer_InitStruct);  

  LTDC_LayerCmd(LTDC_Layer1, ENABLE);  
  LTDC_ReloadConfig(LTDC_IMReload);
这是配置layer的代码,LTDC_Layer_InitStruct.LTDC_CFBStartAdress = (uint32_t)&gImage_gg;     gImage_gg是用软件生成的一个c语言数组。为什么调用  LTDC_ReloadConfig(LTDC_IMReload);这一句图片就直接显示出来了?


2.用F4自带的驱动LCD  ,它的DMA2D 和 外挂的SDRAM的作用是什么?应该怎样使用MA2D和SDRAM?


3.我是直接读的SD卡的图片出来解码,把图片的一行数据读出来再解码放到一个数组里,  以前用SSD1963时带了LCD_WR_Data()这一个函数往里写数据就行 ,现在 这样解码额数据应该怎么往里写呢?


真心求懂的人帮忙解答,这个问题困扰一周了 。



最佳答案

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

个人理解,仅供参考: 1、LTDC_Layer_InitStruct.LTDC_CFBStartAdress是用于指定LTDC的显存起始地址,LTDC为按照配置定时的从这个显存里面取数据通过RGB接口写入屏幕,你现在把这个显存指向了你自己定义的图片数组里(uint32_t)&gImage_gg,自然会一直显示这个图片; 2、SDRAM的作用就是为了给LTDC提供一个显存空间的,当前你完全可以不用SDRAM,直接使用片内的RAM也可以,前提是你的RAM要大于屏幕要求的显存空间,我试过F429显 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2012-3-29
在线时间
18 小时
发表于 2017-5-25 09:39:08 | 显示全部楼层
个人理解,仅供参考:
1、LTDC_Layer_InitStruct.LTDC_CFBStartAdress是用于指定LTDC的显存起始地址,LTDC为按照配置定时的从这个显存里面取数据通过RGB接口写入屏幕,你现在把这个显存指向了你自己定义的图片数组里(uint32_t)&gImage_gg,自然会一直显示这个图片;

2、SDRAM的作用就是为了给LTDC提供一个显存空间的,当前你完全可以不用SDRAM,直接使用片内的RAM也可以,前提是你的RAM要大于屏幕要求的显存空间,我试过F429显示320x240xRGB565=150K是没有问题的;

3、DMA2D就是一个2D加速器,为了加快显示速度用的,把一些对显存的颜色填充、图像拷贝、图像颜色转换并拷贝等操作由硬件实现,这是一个可选的,如果不了解的话,完全可以不使用;

4、显示图片的问题,你原来LCD_WR_Data()是直接写入控制器对应坐标的吧,现在直接写到你定义的显存的指定位置就可以了,没有啥区别,就是直接操作显存,像这样逐点写入数据:

*(__IO uint16_t*) (m_u32FrameBuffer + (yPhys * LCD_PIXEL_WIDTH + xPhys) * 2) = PixelIndex;
其中:
m_u32FrameBuffer为显存起始地址;
xPhys、yPhys为对应像素点的坐标;
2为像素字节宽度,我用的是RGB565,所以是2字节;
PixelIndex为你需要写入像素点的颜色值;


归纳起来,LTDC总的使用流程就是:
step1:定义显存空间(片内RAM或片外SDRAM均可);
step2:配置LTDC时序、指定显存地址并使能LTDC;
step3:所有对屏幕的操作,直接对显存空间操作即可,LTDC控制器会自动的刷新显存到屏幕;
step4:如果对显示速度有更高的要求,使用DMA2D操作显存进行加速;
step5:如果不想自己写显示函数,直接移植图形库,调用图形库标准的API实现绘图操作,这样便于后续程序移植;
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2017-5-25 10:09:40 | 显示全部楼层
本帖最后由 zuozhongkai 于 2017-5-25 10:13 编辑

1、LTDC_ReloadConfig()这个函数怎么运行的你要去看他具体怎么实现的,操作了什么寄存器。只要你修改了显存中的数据那么LCD上就会立即显示出来,LTDC会不断的将显存(SDRAM)中的数据搬运到LCD上。
2、DMA2D是为了加速显示的一个东西,看名字就知道他就是个DMA。是专门用于LTDC的DMA,当然了,DAM2D也有很多其它的功能,比如颜色转换等等。至于SDRAM,那是用来做显存的!
3、你以前用SSD1963的时候这个芯片是自带显存的,现在F429的LTDC+SDRAM的功能就是SSD1963的功能!图片解码以后直接写到SDRAM中给LTDC分配的显存里面去,不会就看资料,看手册,看例程!

回复

使用道具 举报

29

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2016-12-29
在线时间
100 小时
 楼主| 发表于 2017-5-25 11:04:28 | 显示全部楼层
zuozhongkai 发表于 2017-5-25 10:09
1、LTDC_ReloadConfig()这个函数怎么运行的你要去看他具体怎么实现的,操作了什么寄存器。只要你修改了显存 ...

1.void LTDC_ReloadConfig(uint32_t LTDC_Reload)
{
  assert_param(IS_LTDC_RELOAD(LTDC_Reload));   
  LTDC->SRCR = (uint32_t)LTDC_Reload;
}这就是那个函数,SRCR说是 ltdc阴影重新加载配置寄存器,他的意思是不是配置完以后  LTDC_LayerInit(LTDC_Layer1, &LTDC_Layer_InitStruct);  初始化了他的参数、数据都就写到了SDRAM里了?

2.DMA2D是不是配置完成以后,只要需要显示,LTDC就一直使用了DMA2D了?

3.SDRAM给LTDC怎样分配的内存?uint8_t testValue[10086] __attribute__((at(SDRAM_BANK_ADDR)));像这样给它定一个绝对地址?  我看了原子哥的显示程序,也是写点的,我也试过例程里的那个地址往里写数据,在我的板子上修改使用,但是不成功。
回复

使用道具 举报

29

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2016-12-29
在线时间
100 小时
 楼主| 发表于 2017-5-26 16:33:25 | 显示全部楼层
zhaoshan413 发表于 2017-5-26 14:58
个人理解,仅供参考:
1、LTDC_Layer_InitStruct.LTDC_CFBStartAdress是用于指定LTDC的显存起始地址,LTDC ...

谢谢,你说的很详细。我晚上测试一下。

还有一个问题  。 我向SDRAM 的BANK2   写入数据(地址0XD0000000) ,然后再读出来,发现我写入的BUFFER比如是  BUFFER[1]=0X12345678   ,BUFFER[2] = 0X12345679 .....让它自加一,读出来发现数据有的丢失了,   有的是整个u32数据都没了 ,有的是丢失几位(读出来是这样的0X00005678)    。
回复

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2012-3-29
在线时间
18 小时
发表于 2017-5-26 19:42:59 | 显示全部楼层
孤独的流浪者 发表于 2017-5-26 16:33
谢谢,你说的很详细。我晚上测试一下。

还有一个问题  。 我向SDRAM 的BANK2   写入数据(地址0XD0000 ...

不用谢...

SDRAM读写数据丢失的问题,建议不要纠结,直接拷贝库里面的例程或开发板的例程,这些都是测试没有问题的,如果仅仅是使用,比葫芦画瓢直接使用即可。

按照你的描述有部分数据是正确的,应该初始化时序配置出问题的可能性比较小,建议检查所有的SDRAM片选和地址线配置的是否都正确,另外先使用字节访问方式访问验证是不是正确,使用半字和字方式访问注意地址变化是否正确...

祝你好运!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-18 01:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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