Jump to content

    
MementoMori

TouchGFX и 32 битная SDRAM

Recommended Posts

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 библиотеке.

Share this post


Link to post
Share on other sites
8 минут назад, MementoMori сказал:

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

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

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

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

Share this post


Link to post
Share on other sites
8 minutes ago, sst78rus said:

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

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

Share this post


Link to post
Share on other sites
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;

 

Не помогло.

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

Image from iOS.jpg

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
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 настроить проще, если что не так, система внятно сообщает о том, что за ошибка.

Share this post


Link to post
Share on other sites
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

Edited by nanorobot

Share this post


Link to post
Share on other sites
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_

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites

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

Поставил я на плату 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 все рисуется как надо.

 

Share this post


Link to post
Share on other sites
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;
}

 

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

Edited by GenaSPB

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.