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

Вопрос о памяти (по крайней мере о трассировке) и помехах закрыт.

Отключил в TouchGFX  акселератор ChromART (DMA2D) - все глюки исчезли.

Тогда вопрос к людям, конкретно, работавшим с ChromART.  Что с ним может быть не так?

 

Вот на всякий случай мои настройки DMA2D

1Ktfw2vN.png?download=1

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


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

Я выше приводил код настройки mpu. И писал, что как раз таки добавление в mpu настроек для адресов sdram избавило от одной из описанных проблем - от полос на круге. I-cache и d-cache включены по умолчанию. Я их отключал по очереди, ни на что не повлияло.

Посмотрите код на предыдущей странице, может я вас не так понял?

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


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

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

Я выше приводил код настройки mpu. И писал, что как раз таки добавление в mpu настроек для адресов sdram избавило от одной из описанных проблем - от полос на круге. I-cache и d-cache включены по умолчанию. Я их отключал по очереди, ни на что не повлияло.

Посмотрите код на предыдущей странице, может я вас не так понял?

Это как одна из версий, если есть проблемы при работе с DMA. При отключенном кэше mpu не нужен, будет и без него работать. Я просто сталкивался с интересными ошибками, когда данные в кэше лежат не сначала 32 битной строки и при сбросе кэша портились "соседние" данные. Хотя если вы hal используете, то там это учтено.

Проверить это проще всего, выключив для теста кэш. А с выключенным кешем, вам и mpu не нужно, можно и его выключить на время теста. 

А без TouchGFX вывод работает? 

Ну и опять же, в качестве версии для проверки - а на самом деле,  в том месте где у вас полосы, какой цвет лежит? Соответствует содержимое видеобуфера изображению? 

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


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

Без touchgfx я картинки не выводил, так, прямоугольниками баловался - без глюков.

А какой кеш отключить - I или D?

24 minutes ago, sst78rus said:

Ну и опять же, в качестве версии для проверки - а на самом деле,  в том месте где у вас полосы, какой цвет лежит? Соответствует содержимое видеобуфера изображению

Там лежит цвет 0x00, который используется как маска прозрачности. При этом, если в первой полосе есть участок самой картинки, любого цвета, это не влияет на результат - полоса везде либо розовая, либо зеленая.

Но это в qspi flash. А вот с видеобуфером я не сверял. У меня их два, это нужно еще вычислить адрес. Я ж не ручками картинку вывожу, а библиотекой, в которой пока не сильно ориентируюсь. Попробую проверить

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


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

Не.... отключение кеша добавляет проблем, а при отключенном MPU программа вылетает в HardFault.

Попробую поиграться с режимами DMA, порисовать что-нибудь своими силами, минуя TouchGFX.

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


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

У акселератора ChromART (DMA2D) есть возможность настройки пропускной способности к шине, можно её попробовать уменьшить. А так тоже думаю надо копать настройки MPU. У нас были проблемы с изображением при похожей конфигурации железа, при отключении DCache проблемы исчезали безвозвратно.

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


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

Еще раз попробовал отключить DCache - стало только хуже, появились артефакты, там где их не было, там где они имели место до настройки мной MPU.

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


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

Дошли руки до DMA. попробовал выводить прямоугольнички с его помощью

void TFT_FillRectangle(uint16_t x1, uint16_t y1,
											uint16_t x2, uint16_t y2, uint32_t color)
{
	#define swap(a,b) {int16_t t=a;a=b;b=t;}

	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);
	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);
		}
	}
}

Я прямо набрался наглости и вставил вывод прямоугольника вот сюда

 while (1)
  {
    /* USER CODE END WHILE */

  MX_TouchGFX_Process();
		TFT_FillRectangle(100,100,300,300,0xFFFFFFFF);
    /* USER CODE BEGIN 3 */
		
		
  }

Нормально выводится,  в 32 битном режиме SDRAM, без артефактов.....

Куда блин копать дальше.....

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


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

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

Нормально выводится,  в 32 битном режиме SDRAM, без артефактов.....

Куда блин копать дальше.....

Надо пробовать не одноцветные квадраты рисовать, а переходы из одного цвета в другой, контрастные переходы и т.д. посмотрите тестовые таблицы, вот на этих переходах и смотреть артефакты. На сплошной заливке их никогда и не бывает, разве, что на границах.

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


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

Ан нет.... однотонный прямоугольник тоже дает искажение. Просто получившийся цвет был незаметен.

Смотрите, вот код инициализации DMA2D  

static void MX_DMA2D_Init(void)
{

 
  hdma2d.Instance = DMA2D;
  hdma2d.Init.Mode = DMA2D_M2M_PFC;
  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();
  }
 

}

Настройка слоя

 

............
  pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB888;
  pLayerCfg.Alpha = 255;
  pLayerCfg.Alpha0 = 0;
  pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
  pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;
  pLayerCfg.FBStartAdress = 0xD0000000;
 ...........
  if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)

 

А вот собственно функция, рисующая прямоугольник

 

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);
	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);
		}
	}
}

 

TFT_FillRectangle(10,10,200,200,0xFF0000FF);

На выходе получаю синий прямоугольник с красной полосой слева.

Что не так?

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


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

Если абсолютно все устанавливаю в режим ARGB8888, то никаких полос нет, но вот беда, TOuchGFX  в таком режиме не работает.

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


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

Обнаружил некую закономерность. Наличие артефакта зависит от того, где линия начинается и где заканчивается.

h1voCad3.png?download=1

При одной и той же длине линии результат зависит от координат начала и координат конца.

В конце зеленый артефакт наблюдается если его координаты нечетны. То есть под одному через один.

В начале красный артефакт появляется если координаты начала - по два через два.

 

Есть мысли?

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


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

6 часов назад, MementoMori сказал:

Если абсолютно все устанавливаю в режим ARGB8888, то никаких полос нет, но вот беда, TOuchGFX  в таком режиме не работает.

Значит дело в преобразователе форматов. А в каком он работает (TOuchGFX)?

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


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

TouchGFX работает либо в RGB565 (с ним как раз проблем нет) либо в RGB888.

А что, разве если в DMA2D и в LTDC установить все одинаково в RGB888, что-то будет преобразовываться?

Кстати, я нашел как регулировать пропускную способность, сделал так

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

Не помогло.

Как вариант, конечно, можно двигать элементы. Исходя из логики картинки, что приведена выше, можно безопасно разместить элемент любой длины. А +\- 2 пикселя - это в общем-то ерунда.

Но все же....

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


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

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

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

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

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

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

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

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

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

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