MementoMori 4 18 февраля, 2020 Опубликовано 18 февраля, 2020 · Жалоба Вопрос о памяти (по крайней мере о трассировке) и помехах закрыт. Отключил в TouchGFX акселератор ChromART (DMA2D) - все глюки исчезли. Тогда вопрос к людям, конкретно, работавшим с ChromART. Что с ним может быть не так? Вот на всякий случай мои настройки DMA2D Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sst78rus 0 18 февраля, 2020 Опубликовано 18 февраля, 2020 · Жалоба Кэш данных включен? Попробуйте выключить кэш и mpu. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 18 февраля, 2020 Опубликовано 18 февраля, 2020 · Жалоба Я выше приводил код настройки mpu. И писал, что как раз таки добавление в mpu настроек для адресов sdram избавило от одной из описанных проблем - от полос на круге. I-cache и d-cache включены по умолчанию. Я их отключал по очереди, ни на что не повлияло. Посмотрите код на предыдущей странице, может я вас не так понял? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sst78rus 0 18 февраля, 2020 Опубликовано 18 февраля, 2020 · Жалоба 2 часа назад, MementoMori сказал: Я выше приводил код настройки mpu. И писал, что как раз таки добавление в mpu настроек для адресов sdram избавило от одной из описанных проблем - от полос на круге. I-cache и d-cache включены по умолчанию. Я их отключал по очереди, ни на что не повлияло. Посмотрите код на предыдущей странице, может я вас не так понял? Это как одна из версий, если есть проблемы при работе с DMA. При отключенном кэше mpu не нужен, будет и без него работать. Я просто сталкивался с интересными ошибками, когда данные в кэше лежат не сначала 32 битной строки и при сбросе кэша портились "соседние" данные. Хотя если вы hal используете, то там это учтено. Проверить это проще всего, выключив для теста кэш. А с выключенным кешем, вам и mpu не нужно, можно и его выключить на время теста. А без TouchGFX вывод работает? Ну и опять же, в качестве версии для проверки - а на самом деле, в том месте где у вас полосы, какой цвет лежит? Соответствует содержимое видеобуфера изображению? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 18 февраля, 2020 Опубликовано 18 февраля, 2020 · Жалоба Без touchgfx я картинки не выводил, так, прямоугольниками баловался - без глюков. А какой кеш отключить - I или D? 24 minutes ago, sst78rus said: Ну и опять же, в качестве версии для проверки - а на самом деле, в том месте где у вас полосы, какой цвет лежит? Соответствует содержимое видеобуфера изображению? Там лежит цвет 0x00, который используется как маска прозрачности. При этом, если в первой полосе есть участок самой картинки, любого цвета, это не влияет на результат - полоса везде либо розовая, либо зеленая. Но это в qspi flash. А вот с видеобуфером я не сверял. У меня их два, это нужно еще вычислить адрес. Я ж не ручками картинку вывожу, а библиотекой, в которой пока не сильно ориентируюсь. Попробую проверить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 18 февраля, 2020 Опубликовано 18 февраля, 2020 · Жалоба Не.... отключение кеша добавляет проблем, а при отключенном MPU программа вылетает в HardFault. Попробую поиграться с режимами DMA, порисовать что-нибудь своими силами, минуя TouchGFX. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dlsh 2 18 февраля, 2020 Опубликовано 18 февраля, 2020 · Жалоба У акселератора ChromART (DMA2D) есть возможность настройки пропускной способности к шине, можно её попробовать уменьшить. А так тоже думаю надо копать настройки MPU. У нас были проблемы с изображением при похожей конфигурации железа, при отключении DCache проблемы исчезали безвозвратно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 18 февраля, 2020 Опубликовано 18 февраля, 2020 · Жалоба Еще раз попробовал отключить DCache - стало только хуже, появились артефакты, там где их не было, там где они имели место до настройки мной MPU. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 22 февраля, 2020 Опубликовано 22 февраля, 2020 · Жалоба Дошли руки до 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, без артефактов..... Куда блин копать дальше..... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 22 февраля, 2020 Опубликовано 22 февраля, 2020 · Жалоба 4 часа назад, MementoMori сказал: Нормально выводится, в 32 битном режиме SDRAM, без артефактов..... Куда блин копать дальше..... Надо пробовать не одноцветные квадраты рисовать, а переходы из одного цвета в другой, контрастные переходы и т.д. посмотрите тестовые таблицы, вот на этих переходах и смотреть артефакты. На сплошной заливке их никогда и не бывает, разве, что на границах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 23 февраля, 2020 Опубликовано 23 февраля, 2020 · Жалоба Ан нет.... однотонный прямоугольник тоже дает искажение. Просто получившийся цвет был незаметен. Смотрите, вот код инициализации 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); На выходе получаю синий прямоугольник с красной полосой слева. Что не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 23 февраля, 2020 Опубликовано 23 февраля, 2020 · Жалоба Если абсолютно все устанавливаю в режим ARGB8888, то никаких полос нет, но вот беда, TOuchGFX в таком режиме не работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 23 февраля, 2020 Опубликовано 23 февраля, 2020 · Жалоба Обнаружил некую закономерность. Наличие артефакта зависит от того, где линия начинается и где заканчивается. При одной и той же длине линии результат зависит от координат начала и координат конца. В конце зеленый артефакт наблюдается если его координаты нечетны. То есть под одному через один. В начале красный артефакт появляется если координаты начала - по два через два. Есть мысли? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 23 февраля, 2020 Опубликовано 23 февраля, 2020 · Жалоба 6 часов назад, MementoMori сказал: Если абсолютно все устанавливаю в режим ARGB8888, то никаких полос нет, но вот беда, TOuchGFX в таком режиме не работает. Значит дело в преобразователе форматов. А в каком он работает (TOuchGFX)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 23 февраля, 2020 Опубликовано 23 февраля, 2020 · Жалоба TouchGFX работает либо в RGB565 (с ним как раз проблем нет) либо в RGB888. А что, разве если в DMA2D и в LTDC установить все одинаково в RGB888, что-то будет преобразовываться? Кстати, я нашел как регулировать пропускную способность, сделал так DMA2D->AMTCR |=0x01; DMA2D->AMTCR |=0xFF00; Не помогло. Как вариант, конечно, можно двигать элементы. Исходя из логики картинки, что приведена выше, можно безопасно разместить элемент любой длины. А +\- 2 пикселя - это в общем-то ерунда. Но все же.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться