MementoMori 4 24 февраля, 2020 Опубликовано 24 февраля, 2020 · Жалоба 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 библиотеке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sst78rus 0 24 февраля, 2020 Опубликовано 24 февраля, 2020 · Жалоба 8 минут назад, MementoMori сказал: Вы мне про выравнивание лучше объясните. Как ту абракадабру, что была в Вашей теме, применить к моей hal библиотеке. Про hal библиотеку я никак не смогу вам объяснить, я про нее ничего толком не знаю. По вашим словам получается, что у вас проблемы с dma2d? А если при помощи dma2d копировать не в sdram, а скажем в память мк? Только адрес буфера выровняйте по границе 4-х байт. Может проблема с sdram, но проявляется при интенсивной записи через dma? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 24 февраля, 2020 Опубликовано 24 февраля, 2020 · Жалоба 8 minutes ago, sst78rus said: А если при помощи dma2d копировать не в sdram, а скажем в память мк? Подумал уже об этом. Пытаюсь, что-то пока не получается буфер перенастроить.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 24 февраля, 2020 Опубликовано 24 февраля, 2020 · Жалоба 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 согласно даташиту Сделал вот так DMA2D->AMTCR |=0x01; DMA2D->AMTCR |=0xFF00; Не помогло. Я правильно поработал с регистрами? В отладчике видно, что в них записалось то, что нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 24 февраля, 2020 Опубликовано 24 февраля, 2020 · Жалоба Сделал еще один финт ушами - решил проверить, а нет ли конфликта между LTDC и DMA2D за память. Натравил LTDC на RAM по адресу 0x20010000, а сам в это время попытался порисовать прямоугольник в SDRAM - байты все так же бьются.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rostoopt 0 26 февраля, 2020 Опубликовано 26 февраля, 2020 · Жалоба Та же проблема на отладочных платах f769i и h753i появляются полосы и артефакты на местах перехода после десятка перезагрузок все вдруг начинает работать идеально Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Salamander 2 26 февраля, 2020 Опубликовано 26 февраля, 2020 (изменено) · Жалоба 1 hour ago, rostoopt said: Та же проблема на отладочных платах Настройки кубовские или, ваши? Изменено 26 февраля, 2020 пользователем Salamander Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rostoopt 0 27 февраля, 2020 Опубликовано 27 февраля, 2020 · Жалоба С кубовскими настройками оно вообще не работает, там много не хватает Обычно генерю из gfxdesigner пустой проект на соответствующую плату, потом из куба генерю то же самое и все основные файлы с настройками (папки Core и generated + драйвера) в CubeIDE подменяю на те, что получились от gfxdesigner. Простые проекты в 90% случаях идеально но иногда кривит, где побольше графики во внешнюю флэш загружаю до 16Мб оно 20% нормально а остальное такие артефакты Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 28 февраля, 2020 Опубликовано 28 февраля, 2020 · Жалоба 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 настроить проще, если что не так, система внятно сообщает о том, что за ошибка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nanorobot 6 2 марта, 2020 Опубликовано 2 марта, 2020 (изменено) · Жалоба On 2/16/2020 at 11:10 PM, MementoMori said: Господа, продолжаю бороться со связкой STM32F746+SDRAM MT48LC4M32B2P-6A +TouchGFX. C созданием и компиляцией проекта проблем нет. Но при работе есть артефакты. Вот такие вертикальные полосы сбоку от элементов Избавиться от них удалось лишь тогда, когда я инициализировал память не в 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 Изменено 2 марта, 2020 пользователем nanorobot Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 2 марта, 2020 Опубликовано 2 марта, 2020 · Жалоба 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_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 54 2 марта, 2020 Опубликовано 2 марта, 2020 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nanorobot 6 3 марта, 2020 Опубликовано 3 марта, 2020 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 18 марта, 2020 Опубликовано 18 марта, 2020 · Жалоба Ну что я хочу сказать.... Поставил я на плату 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 все рисуется как надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 18 марта, 2020 Опубликовано 18 марта, 2020 (изменено) · Жалоба 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; } Структуру без дыр попросить у компилятора Изменено 18 марта, 2020 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться