|
|
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屏幕
|
|