硬汉嵌入式论坛

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

[LTDC] LTDC+SDRAM+DMA2D外设使用问题

[复制链接]

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 3 天前 | 显示全部楼层 |阅读模式
在使用LDTC+SDRAM+DMA2D外设控制800*480的液晶电容触摸屏的时候,硬件电路上存在两块W9825G6KH。因为需要使用SDRAM用来给DMA2D外设使用,原开发板例程给两块W9825G6KH都进行了初始化,内存数据长度为32Bit,使用Bank2,sdram起始地址为0xD0000000,LTDC使用的内存起始地址为0xD2000000。
我只使用一块sdram的数据线,内存数据长度改为16Bit,液晶屏却无法正常显示,只能两块sdram的数据线(32Bit)都进行初始化才可以。


经测试,将LTDC使用的内存起始地址由0xD2000000改为0xD0000000就可以使用。
一块sdram的大小为8M,地址范围是:‭0xD0000000~D0800000,两块也就是‬‭0xD0000000~D1000000。地址远小于0xD2000000,为什么还能正常运行?
以下是我用deepseek询问的结果,我想请教一下各位大佬,情况是否属实?或者有无其他原因?这个地址回绕目前还是不太了解这个功能,是固有功能吗?
1.png

2.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116739
QQ
发表于 3 天前 | 显示全部楼层
回复的不对,不挨边。两个16bit合并是下面这种合并形式,实际就跟接一个32bit SDRAM是一样的,不可能多出空间来。
Deepseek第2个截图那个是FMC静态配置AD7606,SRAM等场景下内部地址偏移。


1123.png
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 3 天前 | 显示全部楼层
eric2013 发表于 2025-7-1 17:08
回复的不对,不挨边。两个16bit合并是下面这种合并形式,实际就跟接一个32bit SDRAM是一样的,不可能多出空 ...

感谢硬汉哥的纠正,我目前还不是很清楚为什么在32bit的情况下,0xD2000000作为起始地址是可以运行的。第一张截图的回复是对的吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116739
QQ
发表于 前天 08:09 | 显示全部楼层
lemou1211 发表于 2025-7-1 21:43
感谢硬汉哥的纠正,我目前还不是很清楚为什么在32bit的情况下,0xD2000000作为起始地址是可以运行的。第 ...

这个地址能用不正常,是不是仅测试了背景层,背景层不需要RAM空间。
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 前天 22:32 | 显示全部楼层
eric2013 发表于 2025-7-2 08:09
这个地址能用不正常,是不是仅测试了背景层,背景层不需要RAM空间。

我看的程序是两层都有用的,,、
#define LCD_FB_START_ADDRESS       ((uint32_t)0xD2000000)
LCD_LayerInit(0, LCD_FB_START_ADDRESS,ARGB8888);
void LCD_LayerInit(uint16_t LayerIndex, uint32_t FB_Address,uint32_t PixelFormat)
{     
  LTDC_LayerCfgTypeDef  layer_cfg;

  /* 层初始化 */
  layer_cfg.WindowX0 = 0;                                //窗口起始位置X坐标
  layer_cfg.WindowX1 = LCD_GetXSize();        //窗口结束位置X坐标
  layer_cfg.WindowY0 = 0;                                //窗口起始位置Y坐标
  layer_cfg.WindowY1 = LCD_GetYSize();  //窗口结束位置Y坐标
  layer_cfg.PixelFormat = PixelFormat;        //像素格式
  layer_cfg.FBStartAdress = FB_Address; //层显存首地址
  layer_cfg.Alpha = 255;                                //用于混合的透明度常量,范围(0—255)0为完全透明
  layer_cfg.Alpha0 = 0;                                        //默认透明度常量,范围(0—255)0为完全透明
  layer_cfg.Backcolor.Blue = 0;                        //层背景颜色蓝色分量
  layer_cfg.Backcolor.Green = 0;                //层背景颜色绿色分量
  layer_cfg.Backcolor.Red = 0;                        //层背景颜色红色分量
  layer_cfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;//层混合系数1
  layer_cfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;//层混合系数2
  layer_cfg.ImageWidth = LCD_GetXSize();//设置图像宽度
  layer_cfg.ImageHeight = LCD_GetYSize();//设置图像高度
  
  HAL_LTDC_ConfigLayer(&Ltdc_Handler, &layer_cfg, LayerIndex); //设置选中的层参数

  DrawProp[LayerIndex].BackColor = LCD_COLOR_WHITE;//设置层的字体颜色
  DrawProp[LayerIndex].pFont     = &LCD_DEFAULT_FONT;//设置层的字体类型
  DrawProp[LayerIndex].TextColor = LCD_COLOR_BLACK; //设置层的字体背景颜色
  
  __HAL_LTDC_RELOAD_CONFIG(&Ltdc_Handler);//重载层的配置参数
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116739
QQ
发表于 昨天 09:03 | 显示全部楼层
lemou1211 发表于 2025-7-2 22:32
我看的程序是两层都有用的,,、
#define LCD_FB_START_ADDRESS       ((uint32_t)0xD2000000)
LCD_La ...

感觉你的程序有问题。不能超范围使用,这个地址范围也没有重映射
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-4 11:19 , Processed in 0.290702 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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