硬汉嵌入式论坛

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

[LTDC] LTDC显示有白线

[复制链接]

4

主题

8

回帖

20

积分

新手上路

积分
20
发表于 2026-5-28 10:00:26 | 显示全部楼层 |阅读模式
SDRAM开辟了三个全屏显存,在LVGL渲染好之后用MDMA搬运到SDRAM,现在的问题是会有白色的长度大小不固定的线条出现消失
如图

用GDB在调试的时候读内存导出数据
然后导入7yuv看到的是正常的,所以SDRAM里的数据是正常的
然后我又测CPU直接刷纯色

//    while(1)
//    {
//        for(uint32_t i = 0; i < LCD_W * LCD_H; i++)
//        {
//            user_buf = 0xFFFF0000;// ARGB8888格式的黑色
//        }
//        HAL_LTDC_SetAddress_NoReload(&hltdc, (uint32_t) user_buf, LTDC_LAYER_1);
//        HAL_LTDC_Reload(&hltdc, LTDC_RELOAD_VERTICAL_BLANKING);
//        HAL_Delay(400);
//        for(uint32_t i = 0; i < LCD_W * LCD_H; i++)
//        {
//            fill_buf = 0xFF00FF00;// ARGB8888格式的黑色
//        }
//        HAL_LTDC_SetAddress_NoReload(&hltdc, (uint32_t) fill_buf, LTDC_LAYER_1);
//        HAL_LTDC_Reload(&hltdc, LTDC_RELOAD_VERTICAL_BLANKING);
//        HAL_Delay(400);
//        for(uint32_t i = 0; i < LCD_W * LCD_H; i++)
//        {
//            free_buf = 0xFF0000FF;// ARGB8888格式的黑色
//        }
//        HAL_LTDC_SetAddress_NoReload(&hltdc, (uint32_t) free_buf, LTDC_LAYER_1);
//        HAL_LTDC_Reload(&hltdc, LTDC_RELOAD_VERTICAL_BLANKING);
//        HAL_Delay(400);
//    }






这里看的又没问题

那大概率就是LTDC和MDMA抢总线了

    // 定义 AXI 基地址 (从手册 Memory Map 中获取)
#define AXI_BASE_ADDRESS 0x51000000

// 定义 LTDC (INI6) 的读写 QoS 寄存器偏移地址
// 参考手册 “AXI interconnect register map” 章节
#define AXI_INI6_WRITE_QOS_OFFSET 0x0810 // 写 QoS 寄存器
#define AXI_INI6_READ_QOS_OFFSET  0x0910 // 读 QoS 寄存器
// 计算寄存器绝对地址
#define AXI_INI6_WRITE_QOS_ADDR (AXI_BASE_ADDRESS + AXI_INI6_WRITE_QOS_OFFSET)
#define AXI_INI6_READ_QOS_ADDR  (AXI_BASE_ADDRESS + AXI_INI6_READ_QOS_OFFSET)

// 将 LTDC 的读写 QoS 值都设置为最高 (15)
// QoS 字段通常位于寄存器的低 4 位 (bits 0:3),通过写 0xF 来设置
*(volatile uint32_t *)AXI_INI6_WRITE_QOS_ADDR = 0xF; // 设置写 QoS = 15
*(volatile uint32_t *)AXI_INI6_READ_QOS_ADDR  = 0xF; // 设置读 QoS = 15


我这里把LTDC的优先级提高,还是不行

那可能是MDMA突发长度太长

hmdma_mdma_channel0_sw_0.Init.BufferTransferLength = 32;

我这里降低一点还是不行

那可能是LTDC时钟频率太高了,降低到60帧左右还是不行

可能是FMC时钟频率太高了,降到80M也还是不行

那可能是FMC和LTDC的时序配置问题

参照野火的资料对比了一下是一样的,野火的能用不能说我的不能用吧

实在没办法了把配置发给ai让ai配了一个

hsdram1.Instance = FMC_SDRAM_DEVICE;
/* hsdram1.Init */
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_DISABLE;
hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_1;
/* SdramTiming */
SdramTiming.LoadToActiveDelay = 2;
SdramTiming.ExitSelfRefreshDelay = 10;
SdramTiming.SelfRefreshTime = 8;
SdramTiming.RowCycleDelay = 12;
SdramTiming.WriteRecoveryTime = 8;
SdramTiming.RPDelay = 3;
SdramTiming.RCDDelay = 3;

LTDC_LayerCfgTypeDef pLayerCfg = {0};

/* USER CODE BEGIN LTDC_Init 1 */
/* USER CODE END LTDC_Init 1 */
hltdc.Instance = LTDC;
hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;
hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;
hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;
hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
hltdc.Init.HorizontalSync = 39;
hltdc.Init.VerticalSync = 8;
hltdc.Init.AccumulatedHBP = 46;
hltdc.Init.AccumulatedVBP = 9;
hltdc.Init.AccumulatedActiveW = 525;
hltdc.Init.AccumulatedActiveH = 281;
hltdc.Init.TotalWidth = 529;
hltdc.Init.TotalHeigh = 285;
hltdc.Init.Backcolor.Blue = 0;
hltdc.Init.Backcolor.Green = 0;
hltdc.Init.Backcolor.Red = 255;
if (HAL_LTDC_Init(&hltdc) != HAL_OK)
{
  Error_Handler();
}
pLayerCfg.WindowX0 = 0;
pLayerCfg.WindowX1 = 480;
pLayerCfg.WindowY0 = 0;
pLayerCfg.WindowY1 = 272;
pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;
pLayerCfg.Alpha = 255;
pLayerCfg.Alpha0 = 0;
pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;
pLayerCfg.FBStartAdress = 0xD0000000;
pLayerCfg.ImageWidth = 480;
pLayerCfg.ImageHeight = 272;
pLayerCfg.Backcolor.Blue = 0;
pLayerCfg.Backcolor.Green = 0;
pLayerCfg.Backcolor.Red = 0;






结果还是不行

哪位大佬愿意救我一下

用的野火的挑战者V2STM32H743IIT6

SDRAM是W9825G6KH-6

屏幕是野火的4.3寸RGB888屏幕




1.png



回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
123011
QQ
发表于 2026-5-28 11:45:17 | 显示全部楼层
Cache问题处理了没,另外就是为什么用MDMA,不使用DMA2D,DMA2D是专门的图形复制粘贴和颜色格式处理

MDMA和DMA2D的复制粘贴速度基本没区别




点评

cache没有问题,如果没处理cache在调试的时候从SDRAM读出来的数据应该不正常,DMA2D我想后面尝试专门给LVGL做混合透明度这些来加速,如果这里搬运也用DMA2D可能会卡顿  详情 回复 发表于 2026-5-28 13:50
回复

使用道具 举报

4

主题

8

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2026-5-28 13:50:23 | 显示全部楼层
eric2013 发表于 2026-5-28 11:45
Cache问题处理了没,另外就是为什么用MDMA,不使用DMA2D,DMA2D是专门的图形复制粘贴和颜色格式处理

MDM ...

cache没有问题,如果没处理cache在调试的时候从SDRAM读出来的数据应该不正常,DMA2D我想后面尝试专门给LVGL做混合透明度这些来加速,如果这里搬运也用DMA2D可能会卡顿
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
123011
QQ
发表于 2026-5-28 13:55:40 | 显示全部楼层
kinh 发表于 2026-5-28 13:50
cache没有问题,如果没处理cache在调试的时候从SDRAM读出来的数据应该不正常,DMA2D我想后面尝试专门给LVGL ...

你这个是4.3寸的屏,分辨率应该是800*480以下下,仅用DMA2D即可,无敌流畅快

点评

LVGL9把DMA2D直接全部接管了,如果搬运也用DMA2D的话LVGL也要改很多东西  详情 回复 发表于 2026-5-28 13:59
回复

使用道具 举报

4

主题

8

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2026-5-28 13:59:28 | 显示全部楼层
eric2013 发表于 2026-5-28 13:55
你这个是4.3寸的屏,分辨率应该是800*480以下下,仅用DMA2D即可,无敌流畅快

LVGL9把DMA2D直接全部接管了,如果搬运也用DMA2D的话LVGL也要改很多东西
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
123011
QQ
发表于 2026-5-29 09:28:56 | 显示全部楼层
kinh 发表于 2026-5-28 13:59
LVGL9把DMA2D直接全部接管了,如果搬运也用DMA2D的话LVGL也要改很多东西

由于SDRAM带宽有限,MDMA搬运的时候,DMA2D工作非常受限,完全可以也用DMA2D搬运,这样你的工程实现和管理非常方便。



点评

解决了,实际是dcache清除的时候偏移量算错了,因为我分了两个缓存区,清除dcache的时候不小心把传给MDMA的地址给了dcache,所以白线几乎只不出现在下半屏.为什么GDB导出的数据居然是正常的?因为如果dcache如果还保存着  详情 回复 发表于 2026-5-29 10:40
回复

使用道具 举报

4

主题

8

回帖

20

积分

新手上路

积分
20
 楼主| 发表于 2026-5-29 10:40:34 | 显示全部楼层
eric2013 发表于 2026-5-29 09:28
由于SDRAM带宽有限,MDMA搬运的时候,DMA2D工作非常受限,完全可以也用DMA2D搬运,这样你的工程实现和管 ...

解决了,实际是dcache清除的时候偏移量算错了,因为我分了两个缓存区,清除dcache的时候不小心把传给MDMA的地址给了dcache,所以白线几乎只不出现在下半屏.为什么GDB导出的数据居然是正常的?因为如果dcache如果还保存着相关数据,就不会真的去读SDRAM,即使调试器上根据地址去看,看到的也是dcache保存的数据
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
123011
QQ
发表于 2026-5-29 11:23:02 | 显示全部楼层
kinh 发表于 2026-5-29 10:40
解决了,实际是dcache清除的时候偏移量算错了,因为我分了两个缓存区,清除dcache的时候不小心把传给MDMA的 ...

好的,Cache问题排查最简单就是直接关闭DMA操作RAM空的读写Cache特性来排查。

调试之类的查看不行,读取的是Cache里面的数据,使用RTT Viewer的时候这种坑最多。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-10 21:43 , Processed in 0.452140 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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