Перейти к содержанию
    

13 minutes ago, sst78rus said:

Да, раз артефакты есть в видеобуфере, то ltdc может и не иметь ошибок.

Попробуйте локализовать проблему. Сначала сделайте рисование прямоугольника "руками" (всмысле просто записью значений в цикле в видеобуфер). Тут можно даже без экрана проверить - очищаем память, рисуем прямоугольник, читаем обратно  и проверяем записанное. Если с "одиночной" записью проблем нет, попробуйте обычным DMA в режиме mem2mem. 

Т.е. как-то определить где у вас проблема - в работе с sdram, в настройках dma2d или еще где.

Да, чтоб проще глазами поверять содержимое, можно сделать небольшим размер слоя. В идеальном варианте - чтобы ширина была такой, сколько у вас в окне отладчика помещается. Тогда просто сразу видно, что куда пишется.  При ширине слоя в 1024 не очень удобно это смотреть :)

 

Путем обычной записи по адресу все нормально. Более того, я писал раньше, Вы могли не видеть - если я отключаю ChromART (но не DMA2D) - у меня даже в TOuchGFX все нормально.

3 minutes ago, MementoMori said:

Да, чтоб проще глазами поверять содержимое, можно сделать небольшим размер слоя. В идеальном варианте - чтобы ширина была такой, сколько у вас в окне отладчика помещается.

я сделал ширину прямоугольника 7 пикселей - все наглядно, и на экране (под лупой) и в окне отладчика (без лупы).

3 minutes ago, MementoMori said:

Если с "одиночной" записью проблем нет, попробуйте обычным DMA в режиме mem2mem. 

Дык попробовал уже

 hdma2d.Instance = DMA2D;
  hdma2d.Init.Mode = DMA2D_M2M;
  hdma2d.Init.ColorMode = DMA2D_OUTPUT_RGB888;
  hdma2d.Init.OutputOffset = 0;
  hdma2d.LayerCfg[1].InputOffset = 0;
  hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_RGB888;
  hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
  hdma2d.LayerCfg[1].InputAlpha = 0;
  if (HAL_DMA2D_Init(&hdma2d) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_DMA2D_ConfigLayer(&hdma2d, 1) != HAL_OK)
  {
    Error_Handler();
  }

....

void TFT_FillRectangle(uint16_t x1, uint16_t y1,
											uint16_t x2, uint16_t y2, uint32_t color)
{
	if(x1>x2) swap(x1,x2);
	if(y1>y2) swap(y1,y2);
	uint32_t addr=0;
	addr = hltdc.LayerCfg[0].FBStartAdress + 3*(y1*hltdc.LayerCfg[0].ImageWidth+x1);
	hdma2d.Init.Mode = DMA2D_R2M;
	//ñìåùåíèå = øèðèíà ýêðàíà ìèíóñ øèðèíà ïðÿìîóãîëüíèêà
	hdma2d.Init.OutputOffset = hltdc.LayerCfg[0].ImageWidth - (x2-x1);
	
	
	hdma2d.Init.ColorMode = DMA2D_RGB888;
  hdma2d.Init.OutputOffset = 0;
  hdma2d.LayerCfg[0].InputOffset = 2;
  hdma2d.LayerCfg[0].InputColorMode = DMA2D_INPUT_RGB888;
  hdma2d.LayerCfg[0].AlphaMode = DMA2D_NO_MODIF_ALPHA;
  hdma2d.LayerCfg[0].InputAlpha = 0;
	
	
	if(HAL_DMA2D_Init(&hdma2d) == HAL_OK)
	{
		if(HAL_DMA2D_Start(&hdma2d, color, addr,	x2-x1, y2-y1) == HAL_OK)
		{
			HAL_DMA2D_PollForTransfer(&hdma2d, 10);
		}
	}
}

 

Вы мне про выравнивание лучше объясните. Как ту абракадабру, что была в Вашей теме, применить к моей hal библиотеке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 минут назад, MementoMori сказал:

Вы мне про выравнивание лучше объясните. Как ту абракадабру, что была в Вашей теме, применить к моей hal библиотеке.

Про hal библиотеку я никак не смогу вам объяснить, я про нее ничего толком не знаю.

По вашим словам получается, что у вас проблемы с dma2d? А если при помощи dma2d копировать не в sdram, а скажем в память мк? Только адрес буфера выровняйте по границе 4-х байт.

Может проблема с sdram, но проявляется при интенсивной записи через dma?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 minutes ago, sst78rus said:

А если при помощи dma2d копировать не в sdram, а скажем в память мк?

Подумал уже об этом. Пытаюсь, что-то пока не получается буфер перенастроить....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

43 minutes ago, sst78rus said:

Может проблема с sdram, но проявляется при интенсивной записи через dma?

 

Сузил размеры буфера и окна вывода до 50х50 пикселей.

Разместил его в RAM - по адресу 0x20010000. Средствами HAL, как полагается -   pLayerCfg.FBStartAdress = 0x20010000;

Прямоугольники выводятся без артефактов.  Никакого выравнивания не делал. 

На всякий случай проверил новый буфер со SDRAM  - те же самые артефакты.

Резюме такое - сама SDRAM работает нормально (о чем говорят правильные прямоугольники при работе ручками).

DMA сама по себе тоже работоспособна - работает же она с RAM.

А вот DMA+SDRAM - беда...

 

Тактирование SDRAM снизил - HCLK/3 - не помогло, AHB Prescaler поставил 2 - не помогло. Не в скорости значит дело.

Попробовал ограничить пропускную способность DMA согласно даташиту

 

rNKrRweQ.png?download=1

 

Сделал вот так

 DMA2D->AMTCR |=0x01;
    DMA2D->AMTCR |=0xFF00;

 

Не помогло.

Я правильно поработал с регистрами? В отладчике видно, что в них записалось то, что нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделал еще один финт ушами - решил проверить, а нет ли конфликта между LTDC и DMA2D за память. Натравил LTDC на RAM по адресу 0x20010000, а сам в это время попытался порисовать прямоугольник в SDRAM - байты все так же бьются....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Та же проблема на отладочных платах

f769i и h753i   появляются полосы и артефакты на местах перехода

после десятка перезагрузок все вдруг начинает работать идеально

Image from iOS.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, rostoopt said:

Та же проблема на отладочных платах

Настройки кубовские или, ваши?

Изменено пользователем Salamander

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С кубовскими настройками оно вообще не работает, там много не хватает

Обычно генерю из gfxdesigner пустой проект на соответствующую плату, потом из куба генерю то же самое и все основные файлы с настройками (папки Core и generated + драйвера) в CubeIDE подменяю на те, что получились от gfxdesigner.

Простые проекты в 90% случаях идеально но иногда кривит, где побольше графики во внешнюю флэш загружаю до 16Мб оно 20% нормально а остальное такие артефакты

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 hours ago, rostoopt said:

С кубовскими настройками оно вообще не работает, там много не хватает

Обычно генерю из gfxdesigner пустой проект на соответствующую плату, потом из куба генерю то же самое и все основные файлы с настройками (папки Core и generated + драйвера) в CubeIDE подменяю на те, что получились от gfxdesigner.

Простые проекты в 90% случаях идеально но иногда кривит, где побольше графики во внешнюю флэш загружаю до 16Мб оно 20% нормально а остальное такие артефакты

Если они исчезают при отключении ChromART или при переводе графики в режим RGB565 - то это то же самое, что у меня.

Если найдете решение, сообщите? Обещаю то же со своей стороны.

11 hours ago, rostoopt said:

С кубовскими настройками оно вообще не работает, там много не хватает

Обычно генерю из gfxdesigner пустой проект на соответствующую плату, потом из куба генерю то же самое и все основные файлы с настройками (папки Core и generated + драйвера) в CubeIDE подменяю на те, что получились от gfxdesigner.

Вы явно что-то не так настраиваете.

Пока я разбирался, у меня тоже так было, но потом почему-то проекты стали работать. Хотя поначалу  я тоже плевался и пытался генерировать отдельно, скрещивая ужа с ежом.

Более того - установите самую последнюю версию куба и самую последнюю дизайнера. Они там внесли много изменений. И TOuchGFX настроить проще, если что не так, система внятно сообщает о том, что за ошибка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 2/16/2020 at 11:10 PM, MementoMori said:

Господа, продолжаю бороться со связкой STM32F746+SDRAM MT48LC4M32B2P-6A  +TouchGFX.

C созданием и компиляцией проекта проблем нет. Но при работе есть артефакты.

Вот такие вертикальные полосы сбоку от элементов

renditionDownload?rendition=ORIGINAL_Jpg

 

Избавиться от них удалось лишь тогда, когда я инициализировал память не в 32, а в 16-битном режиме.

И это, если честно, вызвало удивление. С одной стороны, SDRAM проецируется в единое адресное пространство и TouchGFX работает с ней, даже не зная, что это SDRAM. Для системы - что 16 бит, что 32 - без разницы. То есть проблема должна быть с аппаратной частью SDRAM. но с другой стороны - я неоднократно тестировал SDRAM - ошибок нет. А вот в работе с TouchGFX появляются артефакты.

Что интересно, похожие вертикальные белые полосы, но не с краю, а внутри картинок появились когда я случайно в одном месте, где инициализируется SDRAM, указал CAS Latency=2, а в другом - 3.  То есть в принципе аппаратная проблема может иметь место.

 

Смех в том, что когда я еще прорабатывал архитектуру и думал, стоит ли заморачиваться с 32 бит, один товарищ здесь на форуме написал, что у него с 16 бит были артефакты, которые исчезли, когда он поставил 32 бит.

Может есть какие тонкости  в работе с 32 битной SDRAM?

Кто-нибудь сталкивался с подобной проблемой?

 

Вот так я ее инициализирую

  Reveal hidden contents

static void MX_FMC_Init(void)
{

  /* USER CODE BEGIN FMC_Init 0 */

  /* USER CODE END FMC_Init 0 */

  FMC_SDRAM_TimingTypeDef SdramTiming = {0};

  /* USER CODE BEGIN FMC_Init 1 */

  /* USER CODE END FMC_Init 1 */

  /** Perform the SDRAM1 memory initialization sequence
  */
  hsdram1.Instance = FMC_SDRAM_DEVICE;
  /* hsdram1.Init */
  hsdram1.Init.SDBank = FMC_SDRAM_BANK2;
  hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8;
  hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12;
  hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_32;
  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_2;
  hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE;
  hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0;
  /* SdramTiming */
  SdramTiming.LoadToActiveDelay = 2;
  SdramTiming.ExitSelfRefreshDelay = 7;
  SdramTiming.SelfRefreshTime = 4;
  SdramTiming.RowCycleDelay = 7;
  SdramTiming.WriteRecoveryTime = 3;
  SdramTiming.RPDelay = 2;
  SdramTiming.RCDDelay = 2;

  if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK)
  {
    Error_Handler( );
  }

  /* USER CODE BEGIN FMC_Init 2 */
  __IO uint32_t tmpmrd = 0;

    /* Step 1: Configure a clock configuration enable command */
    Command.CommandMode            = FMC_SDRAM_CMD_CLK_ENABLE;
    Command.CommandTarget          =  FMC_SDRAM_CMD_TARGET_BANK2;
    Command.AutoRefreshNumber      = 1;
    Command.ModeRegisterDefinition = 0;

    /* Send the command */
    HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT);

    /* Step 2: Insert 100 us minimum delay */
    /* Inserted delay is equal to 1 ms due to systick time base unit (ms) */
    HAL_Delay(1);

    /* Step 3: Configure a PALL (precharge all) command */
    Command.CommandMode            = FMC_SDRAM_CMD_PALL;
    Command.CommandTarget          = FMC_SDRAM_CMD_TARGET_BANK2;
    Command.AutoRefreshNumber      = 1;
    Command.ModeRegisterDefinition = 0;

    /* Send the command */
    HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT);

    /* Step 4: Configure an Auto Refresh command */
    Command.CommandMode            = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
    Command.CommandTarget          = FMC_SDRAM_CMD_TARGET_BANK2;
    Command.AutoRefreshNumber      = 8;
    Command.ModeRegisterDefinition = 0;

    /* Send the command */
    HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT);

    /* Step 5: Program the external memory mode register */
    tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1 | \
             SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL    | \
             SDRAM_MODEREG_CAS_LATENCY_3            | \
             SDRAM_MODEREG_OPERATING_MODE_STANDARD  | \
             SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;

    Command.CommandMode            = FMC_SDRAM_CMD_LOAD_MODE;
    Command.CommandTarget          = FMC_SDRAM_CMD_TARGET_BANK2;
    Command.AutoRefreshNumber      = 1;
    Command.ModeRegisterDefinition = tmpmrd;

    /* Send the command */
    HAL_SDRAM_SendCommand(&hsdram1, &Command, SDRAM_TIMEOUT);

    /* Step 6: Set the refresh rate counter */
    /* Set the device refresh rate */
    HAL_SDRAM_ProgramRefreshRate(&hsdram1, REFRESH_COUNT);
    
    //Deactivate speculative/cache access to first FMC Bank to save FMC bandwidth
    FMC_Bank1->BTCR[0] = 0x000030D2;
  /* USER CODE END FMC_Init 2 */
}

 

У "товарища" (тоесть у меня) артефакты были совершенно иными, например при перерисовке окна, оно могло дергаться, частично ломаться и тд и тп. - было орпробовано на Discovery - F429 c 16 битовой SDRAM. Я предположил что это связано с недосточной пропускной способностью тракта ЯДРО- SDRAM-LTDC и вскоре я  изготовил свой процессорный модуль на F439 c 32 битовой SDRAM. С этим модулем вышеописанные проблемы ушли. Но общая призводительнось  заставляла желать лучшего. В дальнейшем, не ожидая особых улучшений, опробовал этот модуль с F746, особого прироста производительности не заметил, и глубже уже не рыл, перешел на линуксовую плату с iMX6ULL от starterkit.ru. Полагаю что природа артефактов на Вашей плате, совершенно другая, возможно связанная с использованием неких "плюшек" F746, которых нет в F439

Изменено пользователем nanorobot

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 hours ago, nanorobot said:

было орпробовано на Discovery - F429 c 16 битовой SDRAM. Я предположил что это связано с недосточной пропускной способностью тракта ЯДРО- SDRAM-LTDC и вскоре я  изготовил свой процессорный модуль на F439 c 32 битовой SDRAM. С этим модулем вышеописанные проблемы ушли.

А какое у вас разрешение экрана было? У меня вот к примеру, как я уже писал, артефакты имеют место быть в 32 битном режиме, но если включаешь в 16 битный, то при перерисовке наблюдается то, что вы описали. И при включении обратно в 32 битный режим проблемы сильно уменьшаются, но не уходят. У меняя 1024х600, 24 битный цвет.

Китайцы красавцы

https://aliexpress.ru/item/33051221436.html?spm=a2g0o.productlist.0.0.1a3e5932oT6UPm&algo_pvid=94ab9a70-858b-4e0d-923d-d8dfaba0fb21&algo_expid=94ab9a70-858b-4e0d-923d-d8dfaba0fb21-2&btsid=0b8b034a15831703604504622ea072&ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_

 

в модулях на основе imx6ul умудрились 24 битный цвет до 16 битного обрезать.

 

Вот интересные модули

 

https://aliexpress.ru/item/10000085794212.html?spm=a2g0o.productlist.0.0.1a3e5932oT6UPm&algo_pvid=94ab9a70-858b-4e0d-923d-d8dfaba0fb21&algo_expid=94ab9a70-858b-4e0d-923d-d8dfaba0fb21-7&btsid=0b8b034a15831703604504622ea072&ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, MementoMori сказал:

в модулях на основе imx6ul умудрились 24 битный цвет до 16 битного обрезать.

Там возможно некоторые ноги можно мультиплексировать с линиями D16 и 17, в основном матрицы идут 18и битного цвета, так что все норм...

А вот действительно интересный модуль - https://aliexpress.ru/item/4000241560681.html?spm=a2g0o.detail.1000014.23.5e575065nT9I8n&gps-id=pcDetailBottomMoreOtherSeller&scm=1007.13338.128125.0&scm_id=1007.13338.128125.0&scm-url=1007.13338.128125.0&pvid=57718e11-ef36-4f27-b09e-0bf133a5a17c

Особенно его цена... Хотя и недостатков многовато - нет эзернета от слова вообще, и доки в 2 раза меньше, чем на это - 

https://aliexpress.ru/item/33047223726.html?spm=a2g0o.detail.1000023.13.724720b32LWAAY

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 hours ago, MementoMori said:

А какое у вас разрешение экрана было? У меня вот к примеру, как я уже писал, артефакты имеют место быть в 32 битном режиме, но если включаешь в 16 битный, то при перерисовке наблюдается то, что вы описали. И при включении обратно в 32 битный режим проблемы сильно уменьшаются, но не уходят. У меняя 1024х600, 24 битный цвет.

Китайцы красавцы

https://aliexpress.ru/item/33051221436.html?spm=a2g0o.productlist.0.0.1a3e5932oT6UPm&algo_pvid=94ab9a70-858b-4e0d-923d-d8dfaba0fb21&algo_expid=94ab9a70-858b-4e0d-923d-d8dfaba0fb21-2&btsid=0b8b034a15831703604504622ea072&ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_

 

в модулях на основе imx6ul умудрились 24 битный цвет до 16 битного обрезать.

 

Вот интересные модули

 

https://aliexpress.ru/item/10000085794212.html?spm=a2g0o.productlist.0.0.1a3e5932oT6UPm&algo_pvid=94ab9a70-858b-4e0d-923d-d8dfaba0fb21&algo_expid=94ab9a70-858b-4e0d-923d-d8dfaba0fb21-7&btsid=0b8b034a15831703604504622ea072&ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_

разрешение в обоих случаях 800х480 / RGB565

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну что я хочу сказать....

Поставил я на плату STM32H743 

https://cloud.mail.ru/public/4xPy/35mhDrsq7

Проблема просто исчезла.

Правда, как и говорил кто-то, просто так перепрыгнуть с F7 на H7 не получится, есть нюансы.

Но все же полагаю о F7 нужно забыть как о страшном сне.

 

Кстати, какая-то странность со SDRAM появилась.

Вот такой код

 

for (y = 0; y < 5700; y++)
	{
	
     *(__IO uint32_t*)(SDRAM_BANK_ADDR + y*3) = 0x0000FF;
  
  }

вываливает в HardFault.

То есть, если пытаться писать по 3 байта. Меняю y*3 на y*4 - все нормально, правда цвет пишется неправильно.

В F7 такого не было, код взят оттуда, из функции,рисующей прямоугольник в RGB888.

Ну да бог с ним, через DMA2D все рисуется как надо.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, MementoMori said:

В F7 такого не было, код взят оттуда

А ничего что тамошний код пишет и в соседние с заполняемой областью точки и вообще за область экрана?
Писали бы чем-то вроде 
 

unsigned long color = 0x0000FF;	// Blue
struct tcc { uint8_t b, g, r; } tc = { color >> 0, color >> 8, color >> 16 };
assert(sizeof tc == 3);
for (y = 0; y < 5700; y++)
{ 
  *(__IO struct tcc *)(SDRAM_BANK_ADDR + y*3) = tc;
}

 

Структуру без дыр попросить у компилятора

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...