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

2019-07-20 14:19发布

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()这一个函数往里写数据就行 ,现在 这样解码额数据应该怎么往里写呢?


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



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
zhaoshan413
1楼-- · 2019-07-20 18:07
个人理解,仅供参考:
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加速器,为了加快显示速度用的,把一些对显存的颜 {MOD}填充、图像拷贝、图像颜 {MOD}转换并拷贝等操作由硬件实现,这是一个可选的,如果不了解的话,完全可以不使用;

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

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


归纳起来,LTDC总的使用流程就是:
step1:定义显存空间(片内RAM或片外SDRAM均可);
step2:配置LTDC时序、指定显存地址并使能LTDC;
step3:所有对屏幕的操作,直接对显存空间操作即可,LTDC控制器会自动的刷新显存到屏幕;
step4:如果对显示速度有更高的要求,使用DMA2D操作显存进行加速;
step5:如果不想自己写显示函数,直接移植图形库,调用图形库标准的API实现绘图操作,这样便于后续程序移植;
taizonglai
2楼-- · 2019-07-20 18:09
 精彩回答 2  元偷偷看……
孤独的流浪者
3楼-- · 2019-07-20 20:21
 精彩回答 2  元偷偷看……
孤独的流浪者
4楼-- · 2019-07-20 23:11
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)    。
zhaoshan413
5楼-- · 2019-07-21 04:47
孤独的流浪者 发表于 2017-5-26 16:33
谢谢,你说的很详细。我晚上测试一下。

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

不用谢...

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

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

祝你好运!

一周热门 更多>