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

MementoMori

Свой
  • Постов

    1 340
  • Зарегистрирован

  • Посещение

Весь контент MementoMori


  1. Трассировка преобразователя у меня такая
  2. Все-таки до конца проблемы с дисплеем не решены. Когда он у меня худо бедно заработал, я забил на частоту пиксельклока. Но теперь все же хочу получить законно (по даташиту) причитающиеся мне мегагерцы. А по факту не получается завести дисплей более чем на 30 МГц. Итак, напомню - контроллер STM32F746. Дисплей https://www.buydisplay.com/download/manual/ER-TFT070-6_Datasheet.pdf Контроллер дисплея https://www.buydisplay.com/download/ic/EK79001.pdf Согласно даташиту дисплей может работать с пиксельклоком до до 65 МГц У меня же после 30 МГЦ черный экран, с артефактами и прочим. Иногда есть неяркие мутные вспышки, во время которых на линиях питания VGL и VGH есть плавные просадки напряжения примерно 0.5 вольт (не ниже нижнего предела питания по даташиту). Для того, чтобы полностью исключить LTDC я принудительно настроил загнал ножки интерфейса как GPIO_Output и настроил на красный цвет. То есть в отправляемой информации на дисплей я уверен. Остается только клок. К сожалению, у меня нет возможности проверить осциллографом клок, мой не берет такие частоты. Но, как мне кажется, если бы дело было в клоке то я на экране ничего не увидел бы - каждый загоняемы в него пиксель - красный - ну подумаешь, пропущено пару клоков и что? Насчтет просадок напряжения -мне кажется что они являются не причиной, а следствием. В противном случае, если бы они зависели от контролера питания, поведение дисплея не зависело бы от частоты клока. Более того - просадки и вспышки - нечастое явление, в остальные 90% времени на линиях питания нет никаких просадок, но экран черный. Куда копать? Вот видео https://cloud.mail.ru/public/42Ba/DpBw5umNp
  3. А какое у вас разрешение экрана было? У меня вот к примеру, как я уже писал, артефакты имеют место быть в 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_
  4. Есть Banana Pi. Похожа на Raspberry, но в отличие от нее работает с Android
  5. Если они исчезают при отключении ChromART или при переводе графики в режим RGB565 - то это то же самое, что у меня. Если найдете решение, сообщите? Обещаю то же со своей стороны. Вы явно что-то не так настраиваете. Пока я разбирался, у меня тоже так было, но потом почему-то проекты стали работать. Хотя поначалу я тоже плевался и пытался генерировать отдельно, скрещивая ужа с ежом. Более того - установите самую последнюю версию куба и самую последнюю дизайнера. Они там внесли много изменений. И TOuchGFX настроить проще, если что не так, система внятно сообщает о том, что за ошибка.
  6. Не осилил тему... Так какой лучше купить?
  7. Сделал еще один финт ушами - решил проверить, а нет ли конфликта между LTDC и DMA2D за память. Натравил LTDC на RAM по адресу 0x20010000, а сам в это время попытался порисовать прямоугольник в SDRAM - байты все так же бьются....
  8. Сузил размеры буфера и окна вывода до 50х50 пикселей. Разместил его в RAM - по адресу 0x20010000. Средствами HAL, как полагается - pLayerCfg.FBStartAdress = 0x20010000; Прямоугольники выводятся без артефактов. Никакого выравнивания не делал. На всякий случай проверил новый буфер со SDRAM - те же самые артефакты. Резюме такое - сама SDRAM работает нормально (о чем говорят правильные прямоугольники при работе ручками). DMA сама по себе тоже работоспособна - работает же она с RAM. А вот DMA+SDRAM - беда... Тактирование SDRAM снизил - HCLK/3 - не помогло, AHB Prescaler поставил 2 - не помогло. Не в скорости значит дело. Попробовал ограничить пропускную способность DMA согласно даташиту Сделал вот так DMA2D->AMTCR |=0x01; DMA2D->AMTCR |=0xFF00; Не помогло. Я правильно поработал с регистрами? В отладчике видно, что в них записалось то, что нужно.
  9. Подумал уже об этом. Пытаюсь, что-то пока не получается буфер перенастроить....
  10. Путем обычной записи по адресу все нормально. Более того, я писал раньше, Вы могли не видеть - если я отключаю ChromART (но не DMA2D) - у меня даже в TOuchGFX все нормально. я сделал ширину прямоугольника 7 пикселей - все наглядно, и на экране (под лупой) и в окне отладчика (без лупы). Дык попробовал уже 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 библиотеке.
  11. Да.... я не обратил внимания.... Посмотрите... Я вывожу синий цвет, то есть 0x00 00 FF. А теперь поделите байты в вышеприведенном скрине мысленно на тройки - там получается не только первый пиксель испорчен, но и какое-то смещение и по чтению и по записи. Я хочу записать 00 00 00 | 00 00 00 | 00 00 FF | 00 00 FF Пишется 00 00 00 | 00 0F E0 | 70 00 00 | FF 00 00 Последний пиксель должен читаться как красный, а читается как синий. При этом я и пытался записать его как синий. То есть при записи промахивание. При чтении тоже промахивание. Оба промахивания в совокупности дают правильный результат кроме первого и послденего пикселей.
  12. Как я заполняю буфер - писал выше, на предыдущей странице. Перед рисованием прямоугольника я заполняю экран черным. Прямоугольник - нарисую поменьше. Вот Не ловится ни один брейкпоинт. Но, как я понял после последней вашей реплики - и не должен?
  13. Вот оно что... гляну. А пока вот что. Я поместил прямоугольник в координаты X=2 (чтоб вывело ошибку) Y=0. Залил цветом 0x0000FF Получил вот что первые 6 пар пропускаем (это точки с X= 0 и X=1). 70 00 00 - это тянет на красноватый цвет - так и есть, красная полоса. А дальше 0x0000FF - синий. Заканчивается это безобразие последовательностью 00 00 F3 E0 8F 03 - два испорченых пикселя, последний зеленоватый (и в реале и судя по байтам). Почитал Вашу тему про выравнивания. Честно... те идиоматические выражения, которыми Вы настраивали выравнивание - для меня китайская грамота, тем более, что у меня проект, где это запаковано где-то в глубине HAL. Не расскажете поподробнее, где это выравнивание настроить? Я так, на всякий случай попытался сместить адрес буфера с 0xD0000000 на 2,4,6,8 байт - не помогло.
  14. Это Вы о чем? Я знаю один. И он у меня мониторит LTDC_IER_TERRIE и LTDC_IER_FUIE. Это оно?
  15. Сейчас прочту К сожалению, эта таблица была создана при работе с графикой "ручками". В TouchGFX я двигал элементы по горизонтали - проблемы были всегда. Но, полагаю, если корень проблемы устранить, то и в TOuchGFX все будет ОК. Включены. Как ни странно - ошибок нет. Я брейкпоинты даже ставил. Надо попробовать программный флажок для надежности.
  16. Ну проблема то не в альфе. Простой прямоугольник нарисовать проблема. На том этапе, на котором TouchGFX'ом еще и не пахнет. В 32-битном режиме SDRAM.
  17. Поддерживается. Для справки, если что - TouchGFX работает только с одним слоем. Так что если вы о "железной" альфе, то она тут ни при чем. Вот по поводу железа и настроек https://touchgfx.zendesk.com/hc/en-us/articles/360010921760-TouchGFX-HAL-Development
  18. Скажите, а ChomART (DMA2D) приносит какую-нибудь пользу тогда, когда нужно и рисовать и вычислять что-то? У меня задачи нетривиальные - получить из пары десятков глобальных переменных значения и вывести их на экран, послать что-то по UART, включить какую-нибудь ножку. Пока что, отключив ChromART, я не заметил снижения быстродействия. А проверял я его хоть и на глазок, но жестко - делал смещение картинки 1024х600 целиком. Разницы, действительно, не заметил.
  19. TouchGFX работает либо в RGB565 (с ним как раз проблем нет) либо в RGB888. А что, разве если в DMA2D и в LTDC установить все одинаково в RGB888, что-то будет преобразовываться? Кстати, я нашел как регулировать пропускную способность, сделал так DMA2D->AMTCR |=0x01; DMA2D->AMTCR |=0xFF00; Не помогло. Как вариант, конечно, можно двигать элементы. Исходя из логики картинки, что приведена выше, можно безопасно разместить элемент любой длины. А +\- 2 пикселя - это в общем-то ерунда. Но все же....
  20. Обнаружил некую закономерность. Наличие артефакта зависит от того, где линия начинается и где заканчивается. При одной и той же длине линии результат зависит от координат начала и координат конца. В конце зеленый артефакт наблюдается если его координаты нечетны. То есть под одному через один. В начале красный артефакт появляется если координаты начала - по два через два. Есть мысли?
  21. Если абсолютно все устанавливаю в режим ARGB8888, то никаких полос нет, но вот беда, TOuchGFX в таком режиме не работает.
  22. Ан нет.... однотонный прямоугольник тоже дает искажение. Просто получившийся цвет был незаметен. Смотрите, вот код инициализации 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); На выходе получаю синий прямоугольник с красной полосой слева. Что не так?
  23. Дошли руки до 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, без артефактов..... Куда блин копать дальше.....
  24. Еще раз попробовал отключить DCache - стало только хуже, появились артефакты, там где их не было, там где они имели место до настройки мной MPU.
  25. Не.... отключение кеша добавляет проблем, а при отключенном MPU программа вылетает в HardFault. Попробую поиграться с режимами DMA, порисовать что-нибудь своими силами, минуя TouchGFX.
×
×
  • Создать...