Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: 32F769IDISCOVERY + MIPI DSI 720p (1280x720)?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2, 3
Огурцов
Цитата(golf2109 @ Oct 6 2017, 00:24) *
оксюморон - сочетание противоречащих друг другу понятий

вы не поняли один юморон, и я не удивлён, что вы не поняли и другой

Цитата(golf2109 @ Oct 6 2017, 00:24) *
а насчет 1080 читаем первоисточники

что именно в первоисточнике ? 30 кадров 8 бит ?

Цитата(golf2109 @ Oct 6 2017, 00:24) *
а "не сделал" - значит нет потребности

действительно, кому такая порнуха нужна
мой коллега сделал примерно такое, хоть скорее и не по его вине, но тоже, через одно место
поэтому реального практического смысла у него тоже не получилось

Цитата(golf2109 @ Oct 6 2017, 00:24) *
и кроме того, попробуйте найти дисплей 1080 с RGB интерфейсом

в том вам и вопрос, а зачем ?
mantech
Цитата(Огурцов @ Oct 5 2017, 08:57) *
я например хочу 1080p, как это сделать на stm без дополнительного расширения ? и вообще, странно, что такого ещё никто не сделал


В таблице ясно написано, что такое разрешение только на 1 слое и в 16битах, при 32х битной сдрам, что тут может быть непонятного, если достаточно таких параметров - должно работать...

Почему не делают, по себе скажу, что кроме собственно отрисовки картинки с таким разрешением, ее еще нужно как-то подготовить, а в случае анимированных - еще и обеспечить скорость распаковки-обновления, а с этим такие МК не справляются однозначно..
Огурцов
Цитата(mantech @ Oct 6 2017, 08:16) *
В таблице ясно написано, что такое разрешение только на 1 слое и в 16битах, при 32х битной сдрам, что тут может быть непонятного, если достаточно таких параметров - должно работать...

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

недостаточно, нужно 24 бита, или 32 - для удобства
вот пусть stm (да хоть avr) и занимается подготовкой и распаковкой
и что совсем прекрасно - в асинхронном режиме
а отрисовкой пусть занимается внешний, по отношению к stm, контроллер lcd - не понятно, что тут непонятно
Шаманъ
Цитата(Sanya_kv @ Oct 6 2017, 10:01) *
Ни кто не баловался с DMA2D. Не получается залить картинку цветом с прозрачностью в режиме RGB565. Пытаюсь сделать эффект затемнения за диалоговым окном на одном слое.

В чем именно проблема, напишите подробнее? У меня такой вариант работает без проблем. Да и почти вся графика работает через DMA2D.
Sanya_kv
Цитата(Шаманъ @ Oct 6 2017, 13:59) *
В чем именно проблема, напишите подробнее? У меня такой вариант работает без проблем. Да и почти вся графика работает через DMA2D.

Скажите, в своём проекте Вы RGB565 режим используете?

Пытался делать заливку цветом в формате ARGB8888, как оказалось для режима RGB565 он выкидывает alpha канал в функции DMA2D_SetConfig.
Понял что не так делал.
Сейчас пытаюсь разобраться как это сделать правильно.
Огурцов
Цитата(Шаманъ @ Oct 6 2017, 09:59) *
Да и почти вся графика работает через DMA2D

а dma2d может работать со статической памятью и с отключенным ltdc ?
Шаманъ
Цитата(Sanya_kv @ Oct 6 2017, 13:28) *
Скажите, в своём проекте Вы RGB565 режим используете?

Я разные режимы использую, но фреймбуфер в RGB565.

Цитата
Пытался делать заливку цветом в формате ARGB8888, как оказалось для режима RGB565 он выкидывает alpha канал в функции DMA2D_SetConfig.

Что такое SetConfig я не знаю - STMовскими либами не пользуюсь.

Чтобы сделать то, что Вы хотите Вам нужно сконфигурировать DMA2D для полной обработки (режим Memory-to-memory with blending, см. описание регистра DMA2D->CR). Далее в качестве переднего плана указать формат цвета А8, с заменой альфа канала на указанное Вами значение, установить регистр DMA2D->FGCOLR в требуемый цвет, в качестве заднего плана нужно использовать тот же кусок фреймбуфера куда будете рисовать.

Тогда у Вас будет прочитано исходное изображение произведен блендинг с указанным Вами цветом переднего плана и прозрачностью, и результат записан обратно. В Reference Manual DMA2D блок достаточно хорошо описан - там нет ничего сложного.

Надеюсь Вы поняли меня sm.gif


Цитата(Огурцов @ Oct 6 2017, 15:05) *
а dma2d может работать со статической памятью и с отключенным ltdc ?

Да, это независимый блок. Может и с внутренней и со статической, читать из флеша может и т.д.
Sanya_kv
Цитата(Шаманъ @ Oct 6 2017, 17:40) *
Надеюсь Вы поняли меня sm.gif

Спасибо за развернутый ответ. Честно говоря уже и не рассчитывал. sm.gif
Sanya_kv
Цитата(Шаманъ @ Oct 6 2017, 17:40) *
Чтобы сделать то, что Вы хотите Вам нужно сконфигурировать DMA2D для полной обработки (режим Memory-to-memory with blending, см. описание регистра DMA2D->CR). Далее в качестве переднего плана указать формат цвета А8, с заменой альфа канала на указанное Вами значение, установить регистр DMA2D->FGCOLR в требуемый цвет, в качестве заднего плана нужно использовать тот же кусок фреймбуфера куда будете рисовать.

Тогда у Вас будет прочитано исходное изображение произведен блендинг с указанным Вами цветом переднего плана и прозрачностью, и результат записан обратно. В Reference Manual DMA2D блок достаточно хорошо описан - там нет ничего сложного.

Сделал как вы рекомендовали, все завилось с пол пинка. Попутно избавился от СТМовских библиотек в LTDC и DMA2D, лишнего там ... .
Ещё раз благодарю "Шаманъ" за помощь . Неизвестно сколько мне одному пришлось разбираться. По началу банально не был уверен в позитивном результате.
На будущие, может кому пригодится, примерный набросок рабочей функции заливки области цветом с прозрачностью.
CODE
//=============== Заполнить буфер цветом с коэффициентом прозрачности ========
void LCD_DRV_LL_FillBufferAlphaColor(uint32_t BufferAddr, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t OutputColorMode, uint32_t ColorRGB888, uint8_t Alpha)
{
// Копирование с замешиванием
MODIFY_REG(DMA2D->CR, DMA2D_CR_MODE, DMA2D_M2M_BLEND);

//Конфигурация переднего плана
DMA2D->FGPFCCR = (DMA2D_FGPFCCR_CM & DMA2D_INPUT_A8)// Формат цвета
|(DMA2D_FGPFCCR_AM & (1 << DMA2D_FGPFCCR_AM_Pos))//Замена альфа канала
|(DMA2D_FGPFCCR_ALPHA & (Alpha << DMA2D_FGPFCCR_ALPHA_Pos));//Алфа канал

DMA2D->FGCOLR = ColorRGB888;
DMA2D->FGMAR = BufferAddr;
DMA2D->FGOR = OffLine;

//Конфигурация заднего плана
DMA2D->BGPFCCR = DMA2D_BGPFCCR_CM & OutputColorMode;// Формат цвета

DMA2D->BGMAR = BufferAddr;
DMA2D->BGOR = OffLine;


//Выходной буфер
// Формат цвета
DMA2D->OPFCCR = DMA2D_OPFCCR_CM & OutputColorMode;


DMA2D->OMAR = BufferAddr;//адрес буфера для заполнения
DMA2D->OOR = OffLine; // установка смещения (xSize + OffLine = LayerXSize)

// установка количества пикселей на линию и количество линий
DMA2D->NLR = (DMA2D_NLR_NL|DMA2D_NLR_PL) & (ySize| (xSize << DMA2D_NLR_PL_Pos));

//Запуск
DMA2D->CR |= DMA2D_CR_START;

if((DMA2D->CR & DMA2D_CR_START) != RESET)
{
uint32_t tickstart = HAL_GetTick();
__IO uint32_t DMA2D_ISR;
uint32_t ErrorCode;
//Ожидаем конца выполнения рисования
while(((DMA2D_ISR = DMA2D->ISR) & DMA2D_FLAG_TC) == RESET)
{
if ((DMA2D_ISR & (DMA2D_FLAG_CE|DMA2D_FLAG_TE)) != RESET)
{//Ошибка
if ((DMA2D_ISR & DMA2D_FLAG_CE) != RESET)
{
ErrorCode |= HAL_DMA2D_ERROR_CE;
}
if ((DMA2D_ISR & DMA2D_FLAG_TE) != RESET)
{
ErrorCode |= HAL_DMA2D_ERROR_TE;
}

DMA2D->IFCR = DMA2D_FLAG_TC | DMA2D_FLAG_CTC;
return;//произошла ошибка
}
if((HAL_GetTick() - tickstart ) > DMA2D_TIMEOUT)
{//Вышло время ожидания
DMA2D->CR |= DMA2D_CR_ABORT;//
DMA2D->IFCR = DMA2D_FLAG_TC | DMA2D_FLAG_CTC;
return;
}
}
}
DMA2D->IFCR = DMA2D_FLAG_TC|DMA2D_FLAG_CTC;
}
Огурцов
ещё вопрос: есть мысли как подключить к stm второй дисплей ? с разными картинками, конечно
Sanya_kv
Цитата(Огурцов @ Oct 23 2017, 06:40) *
ещё вопрос: есть мысли как подключить к stm второй дисплей ? с разными картинками, конечно

Можно. Только если у второго дисплея будет свой графический контроллер.
Шаманъ
Цитата(Огурцов @ Oct 23 2017, 05:40) *
ещё вопрос: есть мысли как подключить к stm второй дисплей ? с разными картинками, конечно

Кроме варианта озвученного выше можно сильно извратиться и подключить пару одинаковых дисплеев (безконтроллерных) так, что каждая "четная" точка будет отображаться на первом, а каждая "нечетная" на втором, думаю все догадались как это сделать (да, потребуется немного внешней логики). Естественно возможны и вариации на тему (типа два дисплея с 12-ти битным цветом, тут хватит возможностей самого МК, внешняя логика не потребуется) и т.д. Только в чем смысл?
mantech
Цитата(Sanya_kv @ Oct 23 2017, 16:37) *
Можно. Только если у второго дисплея будет свой графический контроллер.


Если в таком ключе, то можно и 2 и 3 подключить biggrin.gif
Огурцов
Цитата(Шаманъ @ Oct 23 2017, 15:23) *
каждая "четная" точка

а dma2d по отдельности чётные-нечётные получится рисовать ?

Цитата(Шаманъ @ Oct 23 2017, 15:23) *
12-ти битным цветом

вообще не вариант

Цитата(Шаманъ @ Oct 23 2017, 15:23) *
Только в чем смысл?

странный вопрос
mantech
Цитата(Огурцов @ Oct 23 2017, 18:36) *
а dma2d по отдельности чётные-нечётные получится рисовать ?


вообще не вариант


странный вопрос


Вопрос действительно странный, ибо для этих целей есть другие мк с соотв. возможностями.
jcxz
Цитата(Огурцов @ Oct 23 2017, 05:40) *
ещё вопрос: есть мысли как подключить к stm второй дисплей ? с разными картинками, конечно

Интерфейс SPI позволяет подключить не только второй, но и гораздо больше дисплеев без каких-либо проблем. И не только к STM.
Шаманъ
Цитата(Огурцов @ Oct 23 2017, 18:36) *
а dma2d по отдельности чётные-нечётные получится рисовать ?

И да, и нет. В общем случае не позволяет, но некоторые вещи ускорить можно. Например, можно нарисовать горизонтальную линию, но не прямоугольник.

Можно рисовать в буфер за пределами экрана с помощью DMA2D, потом им же можно перенести все в основной буфер одной операцией с учетом "шагания через одну точку". В таком варианте будет полноценное использование DMA2D.

Цитата
странный вопрос

Ну я бы в случае если мне нужно было бы пару полноценных дисплеев поискал бы что-то другое (в первую очередь с бОльшей пропускной способностью подсистемы памяти), а если нужно маленький экранчик, так сказать в дополнение, так полно мелких дисплеев со своим контроллером.
aaarrr
Цитата(Огурцов @ Oct 23 2017, 18:36) *
а dma2d по отдельности чётные-нечётные получится рисовать ?

Лучше добавить немного логики, и сделать side by side. Но два экрана на STM - это изврат.
По нынешним меркам ему вообще не нужен интерфейс к экрану, т.к. всякая мелочь цепляется через SPI/I2C, а для нормального экрана сам STM уже мелочь.
jcxz
Цитата(Шаманъ @ Oct 25 2017, 15:28) *
Можно рисовать в буфер за пределами экрана с помощью DMA2D, потом им же можно перенести все в основной буфер одной операцией с учетом "шагания через одну точку". В таком варианте будет полноценное использование DMA2D.

А в чём выигрыш от рисования в видеобуфере с помощью DMA2D? Чем оно лучше чисто процессорного рисования?
В моём текущем проекте на STM32F4 отрисовка в видеобуфер делается процессором. Имеет ли смысл как-то задействовать сюда DMA2D?
Видеобуфер у меня просто во внутренней памяти МК, без привязки к железу.

Наиболее частые операции у меня:
Рисование разных шрифтов с наложением OR поверх другого изображения (однотонного) с отсечением по границам экрана или по границам произвольной прямоугольной области.
И рисование закрашенных прямоугольников. Тоже с отсечением.
И разными цветами. 16 цветов.
Шаманъ
Цитата(jcxz @ Oct 25 2017, 15:51) *
А в чём выигрыш от рисования в видеобуфере с помощью DMA2D? Чем оно лучше чисто процессорного рисования?

На многих операциях через DMA2D быстрее, а даже если не быстрее рисование выполняется параллельно с работой ЦП. Т.е. нагрузка на ЦП уменьшается в любом случае (ну конечно если не выводить через DMA2D по одной точке sm.gif).

Цитата
В моём текущем проекте на STM32F4 отрисовка в видеобуфер делается процессором. Имеет ли смысл как-то задействовать сюда DMA2D?

Зависит от того, что рисуется и чем Вас не устраивает нынешний вариант. В общем случае с DMA2D должно получиться более быстрое рисование и разгрузка процессора - если это интересно, то используйте DMA2D.

Я почти все делаю через DMA2D.Рисование через DMA2D было всегда быстрее, за исключением одной очень специфической операции (которая в итоге была реализована напрямую) - с ней разницы по времени не было, но напрямую было проще.

Цитата
Наиболее частые операции у меня:
Рисование разных шрифтов с наложением OR поверх другого изображения (однотонного) с отсечением по границам экрана или по границам произвольной прямоугольной области.
И рисование закрашенных прямоугольников. Тоже с отсечением.
И разными цветами. 16 цветов.

Это все можно легко сделать через DMA2D. На маленьком дисплее, правда выигрыш будет наверное не очень большой.
Огурцов
Цитата(aaarrr @ Oct 25 2017, 13:42) *
Лучше добавить немного логики, и сделать side by side

если добавлять, то можно добавить много, просто не понятно, как сделать side by side на логике ?
вот если бы горизонтальное поле дисплей позволял увеличить в пару раз, тогда да
или то же самое по вертикали
но не позволяет


Цитата(Шаманъ @ Oct 25 2017, 13:28) *
можно нарисовать горизонтальную линию, но не прямоугольник

можете привести пример ? или какое поле нужно заполнить в структуре DMA2D_InitTypeDef чтобы нарисовать горизонтальную линию точками ?

aaarrr
Цитата(Огурцов @ Oct 26 2017, 02:11) *
если добавлять, то можно добавить много, просто не понятно, как сделать side by side на логике ?

Маскировать CLK и DE на половину строки, если допуск по частоте CLK дисплея позволяет.
Если нет, тогда "много логики" - буфер на строку.
Огурцов
Цитата(mantech @ Oct 23 2017, 18:37) *
есть другие мк с соотв. возможностями.

stm32 - хороший вариант микроконтроллера, одновременно с производительностью первых пентиумов, на которые никто вообще-то не жаловался вплоть до 1280x1024


Цитата(aaarrr @ Oct 26 2017, 00:17) *
Маскировать CLK и DE на половину строки, если допуск по частоте CLK дисплея позволяет.

вот первый попавшийся дисплей https://www.waveshare.com/w/upload/4/44/4.3...-UserManual.pdf
605 vs 480 или 399 vs 272 - ни в то, ни в то второй дисплей не входит

Цитата(aaarrr @ Oct 26 2017, 00:17) *
Если нет, тогда "много логики" - буфер на строку.

это как раз понятно
aaarrr
Цитата(Огурцов @ Oct 26 2017, 02:31) *
605 vs 480 или 399 vs 272 - ни в то, ни в то второй дисплей не входит


Цитата
Маскировать CLK и DE на половину строки



Цитата(Огурцов @ Oct 26 2017, 02:31) *
stm32 - хороший вариант микроконтроллера, одновременно с производительностью первых пентиумов, на которые никто вообще-то не жаловался вплоть до 1280x1024

В те блаженные времена никто особо не жаловался на отсутствие альфа-канала, скоростной анимации на весь экран и прочих современных must have плюшек.
Огурцов
Цитата
Маскировать CLK и DE на половину строки

не, а такое прокатит ? в смысле прерывать подачу клока

Цитата(aaarrr @ Oct 26 2017, 00:40) *
В те блаженные времена никто особо не жаловался на отсутствие альфа-канала, скоростной анимации на весь экран и прочих современных must have плюшек.

и кто придумал этот must have ? если даже spi в качестве интерфейса не гнушаются предлагать
aaarrr
Цитата(Огурцов @ Oct 26 2017, 02:54) *
не, а такое прокатит ?

А что, кто-то запрещает?

Цитата(Огурцов @ Oct 26 2017, 02:54) *
и кто придумал этот must have ? если даже spi не гнушаются предлагать

Так требования рынка. 256 цветов могут долго существовать только в условиях плановой экономики.
SPI для всякой ерунды типа 128x64.
Огурцов
Цитата(aaarrr @ Oct 26 2017, 00:59) *
А что, кто-то запрещает?

привычка, для тв-сигнала не приемлемо

Цитата(aaarrr @ Oct 26 2017, 00:59) *
256 цветов

я не говорил про 256 цветов, а про 24 бита говорил
прозрачность как бы не сильно нужна, но она требуется для выравнивания размера пикселя на 4 байта
aaarrr
Цитата(Огурцов @ Oct 26 2017, 03:26) *
я не говорил про 256 цветов, а про 24 бита говорил

1280x1024 24bpp во времена первых пентиумов? Не было такого в массовом сегменте.
Огурцов
Цитата(aaarrr @ Oct 26 2017, 01:46) *
1280x1024 24bpp во времена первых пентиумов? Не было такого в массовом сегменте.

правильно, но вы смешиваете разные посты - 480x272 в 10 раз меньше, чем 1280x1024
и даже если взять 640x480, всё равно остаётся запас
aaarrr
Вот 480x272, пожалуй, еще как-то можно окучивать STM. А выше забираться я бы не стал.
jcxz
Цитата(aaarrr @ Oct 26 2017, 02:59) *
SPI для всякой ерунды типа 128x64.

Хм... у меня сейчас вполне себе нормально работает LCD по SPI на 320x240x16bpp. 3D-шутеры на нём показывать не надо.
Вся динамическая информация отображается вполне бодро: всякие счётчики (текстовые отображения меняющихся чисел) на экране бегут очень даже шустро.
Конечно, если бы в этом LCD (и МК) был quad-SPI (или LCD по интерфейсу поддерживал бы режимы с меньшей разрядностью цвета) - было бы вообще за глаза. На quad-SPI и в 2 раза больший экран нормально пойдёт.

Цитата(aaarrr @ Oct 26 2017, 04:32) *
Вот 480x272, пожалуй, еще как-то можно окучивать STM. А выше забираться я бы не стал.

По какому интерфейсу? Параллельному? По параллельному STM32 должен много больше нормально обслуживать. Ну если руки конечно прямые rolleyes.gif
У меня сейчас работает проектик:
По SPI идёт 320x240x16bpp на SCLK=40МГц, параллельно этот же CPU декодирует MP3 на 320кб/c, парсит поток с ESP8266 (WiFi) и ещё много чего успевает. На экране в это время бегут несколько быстро меняющихся счётчиков, процедура отрисовки пока построена неоптимально - при каждом изменении видеобуфер стирается полностью, потом строится новый кадр заново (затем отправляется на LCD) - поэтому при любой модификации на экране контроллеру LCD отправляются все пикселы 320x240. При всём при этом загрузка процессора составляет ~55%. И частота МК не максимальная == 160МГц. И измерено это на исходнике скомпилённом с Low оптимизацией (IAR) выполняющемся из RAM/SDRAM.

Если-б этот МК (и контроллер ILI9341) имели dual- или quad-SPI была-бы вообще красота. cool.gif
Шаманъ
Цитата(aaarrr @ Oct 26 2017, 02:40) *
В те блаженные времена никто особо не жаловался на отсутствие альфа-канала, скоростной анимации на весь экран и прочих современных must have плюшек.

Цитата(aaarrr @ Oct 26 2017, 04:32) *
Вот 480x272, пожалуй, еще как-то можно окучивать STM. А выше забираться я бы не стал.

У меня на экране 800х480х16бит крутится можно сказать анимация почти на весь экран с несколькими слоями прозрачности. Перерисовка всего кадра занимает от 10 до 30мс при одновременном выводе с частотой кадров около 29к/с. Загрузка процессора при этом от 5 до 14% (процессор параллельно занят разными своими делами - вычислениями БПФ, фильтрацией сигнала, обслуживанием подключенных к нему устройств, USB, запись/чтение с SD карты и т.д). Наверное я что-то делаю не так, но меня полностью устраивает в этом плане stm32 laughing.gif

Как по мне, то 800х480х16бит без проблем вообще, 1024х600х16бит наверное рубеж, для большего нужно как минимум перейти на 32битную SDRAM либо на другую платформу.

Цитата(Огурцов @ Oct 26 2017, 02:15) *
можете привести пример ?

Все просто - в регистр смещения до следующей линии (OOR/BGOR) записываете смещение до следующей точки/штриха от окончания нарисованного элемента, размер по горизонтали устанавливаете равным длине штриха (или в 1 если точки рисуете), кол-во линий (размер по вертикали) равным кол-ву точек/штрихов в линии, вот собственно и все.
Например, линия 3 точки рисуем, потом 5 точек пропускаем, общая длина 80 точек:
Код
   int m = 3; //Кол-во точек которые рисуем
   int s = 5; //Кол-во точек которые пропускаем
   int l = 80; //Длина линии
  
   DMA2D->OOR = s;
   DMA2D->NLR = DMA2D_NLR_PL_0 * m + DMA2D_NLR_NL_0 * (l/(m+s));

Остальное инициализируете, как обычно при рисовании, например, прямоугольника. Если нужна прозрачность, то регистр BGOR инициализируете так же, как OOR.
Код
   DMA2D->BGOR = s;


Цитата
или какое поле нужно заполнить в структуре DMA2D_InitTypeDef чтобы нарисовать горизонтальную линию точками ?

HALом не пользуюсь, поэтому что там в структурах надо инициализировать не подскажу.
Огурцов
Цитата(Шаманъ @ Oct 26 2017, 06:51) *
DMA2D->OOR = s;
DMA2D->NLR = DMA2D_NLR_PL_0 * m + DMA2D_NLR_NL_0 * (l/(m+s));

ок, надо перевести на нормальный язык
а почему так нельзя рисовать прямоугольники ? вроде самое оно, если ширина регистра позволяет

Цитата(Шаманъ @ Oct 26 2017, 06:51) *
HALом не пользуюсь

я тоже

олл, почему дисплей подёргивается, когда dma2d работает ? т.е. картинка как бы сдвигается в сторону
это синхра слетает или что, или это нормально, куда копать ?


Цитата(aaarrr @ Oct 26 2017, 01:32) *
Вот 480x272, пожалуй, еще как-то можно окучивать STM. А выше забираться я бы не стал.

800x600 считается нормально, т.е. 2x640x480 обязано работать
а больше вроде бы как и не надо
т.е. надо, но уже как-то иначе и это будет уже совсем другая история
aaarrr
Цитата(jcxz @ Oct 26 2017, 08:51) *
По SPI идёт 320x240x16bpp на SCLK=40МГц...

320 * 240 * 16 / 40M = 30.72 мс = 32.55 к/с

Цитата(Шаманъ @ Oct 26 2017, 09:51) *
Перерисовка всего кадра занимает от 10 до 30мс при одновременном выводе с частотой кадров около 29 к/с.


Ну вот, а у нормального UI перерисовка не должна занимать больше 16 мс (т.е. обеспечивать 60 к/с), иначе плавной анимации не будет по определению.
Да, TFT-экран, конечно, надо обслуживать с частотой 60, а не 30. Даташит позволяет, но пользователей тоже надо уважать.
Sanya_kv
Цитата(Шаманъ @ Oct 25 2017, 16:28) *
Например, можно нарисовать горизонтальную линию, но не прямоугольник.

Прямоугольник рисовать можно, Пример:

Цитата(Sanya_kv @ Oct 9 2017, 18:52) *
CODE

void LCD_DRV_DrawFillRectAlpha(uint32_t LayerAddr, uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint32_t ColorRGB888, uint8_t Alpha)
{
if (y0 > y1)
{
uint16_t bak;
bak = y1;
y1 = y0;
y0 = bak;
}
if (x0 > x1)
{
uint16_t bak;
bak = x1;
x1 = x0;
x0 = bak;
}
uint16_t Width = x1 - x0;
uint16_t Height = y1 - y0;
#if (LCD_PIXEL_BYTES == 2)
uint32_t Xaddress = LayerAddr + 2*(LCD_DRV_GetXSize()*y0 + x0);
#else
uint32_t Xaddress = LayerAddr + 4*(LCD_DRV_GetXSize()*y0 + x0);
#endif

LCD_DRV_LL_DMA2D_FillBufferAlphaColor(Xaddress, Width, Height, (LCD_DRV_GetXSize() - Width), DMA2D_OUTPUT_RGB565, ColorRGB888, Alpha, true);
}
//=============== Заполнить область цветом с коэффициентом прозрачности ========
void LCD_DRV_LL_DMA2D_FillBufferAlphaColor(uint32_t BufferAddr, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t OutputColorMode, uint32_t ColorRGB888, uint8_t Alpha, uint8_t wait)
{
LCD_DRV_DMA2D_WaitEND();//Дождаться конца выполнения предыдущего вывода
// Замешивание
MODIFY_REG(DMA2D->CR, DMA2D_CR_MODE, DMA2D_M2M_BLEND);

//Конфигурация переднего плана
DMA2D->FGPFCCR = (DMA2D_FGPFCCR_CM & DMA2D_INPUT_A8)// Формат цвета
|(DMA2D_FGPFCCR_AM & (1 << DMA2D_FGPFCCR_AM_Pos))//Замена альфа канала
|(DMA2D_FGPFCCR_ALPHA & (Alpha << DMA2D_FGPFCCR_ALPHA_Pos));//Алфа канал

DMA2D->FGCOLR = ColorRGB888;
DMA2D->FGMAR = BufferAddr;
DMA2D->FGOR = OffLine;

//Конфигурация заднего плана
DMA2D->BGPFCCR = DMA2D_BGPFCCR_CM & OutputColorMode;// Формат цвета

DMA2D->BGMAR = BufferAddr;
DMA2D->BGOR = OffLine;


//Выходной буфер
// Формат цвета
DMA2D->OPFCCR = DMA2D_OPFCCR_CM & OutputColorMode;

DMA2D->OMAR = BufferAddr;//адрес буфера для заполнения
DMA2D->OOR = OffLine; // установка смещения (xSize + OffLine = LayerXSize)

// установка количества пикселей на линию и количество линий
DMA2D->NLR = (DMA2D_NLR_NL|DMA2D_NLR_PL) & (ySize| (xSize << DMA2D_NLR_PL_Pos));

//Запуск
DMA2D->CR |= DMA2D_CR_START;

if(wait)LCD_DRV_DMA2D_WaitEND();
}



jcxz
Цитата(aaarrr @ Oct 26 2017, 12:19) *
Ну вот, а у нормального UI перерисовка не должна занимать больше 16 мс (т.е. обеспечивать 60 к/с), иначе плавной анимации не будет по определению.
Да, TFT-экран, конечно, надо обслуживать с частотой 60, а не 30. Даташит позволяет, но пользователей тоже надо уважать.

У меня в UI есть бегущие строки - на глаз бегут вполне плавно. Так что FPS==30Гц - вполне ок. Тащить 8+ проводов только на LCD - сильно накладно.
В планах есть модификация всего алгоритма отрисовки UI (чтобы при изменении одного элемента только он перерисовывался, а не весь экран).
Это позволит пересылать на LCD не весь экран, а только минимальный прямоугольник, охватывающий изменения (ILI9341 позволяет и моя граф.либа позволяет) и поднять средний FPS.
Но потребуется сильно усложнить весь алгоритм отрисовки UI. Не уверен, что это усложнение реально нужно.
Sanya_kv
Цитата(Огурцов @ Oct 26 2017, 13:16) *
олл, почему дисплей подёргивается, когда dma2d работает ? т.е. картинка как бы сдвигается в сторону
это синхра слетает или что, или это нормально, куда копать ?

Причин может быть 2:
Либо у Вас высокая частота вывода, медленная память, 16 бит память. Или Вы выводите картинку и рисуете её в одном буфере.

На 32 битной памяти (в 32F769IDISCOVERY) без проблем выводится разрешение 1280х800 RGB565 1 слой 42 гц. С помощью DMA2d вывожу анимацию частотой 42 гц.
После того как разобрался с DMA2d, во втором слое не вижу необходимости.
aaarrr
Цитата(jcxz @ Oct 26 2017, 13:27) *
У меня в UI есть бегущие строки - на глаз бегут вполне плавно. Так что FPS==30Гц - вполне ок.

Так-таки и ок?

ИМХО, когда дело касается UI, нельзя идти на компромиссы. Производительности должно не просто хватать, она должна в разы перекрывать потребности. Тогда можно работать.
Огурцов
Цитата(Sanya_kv @ Oct 26 2017, 11:31) *
Или Вы выводите картинку и рисуете её в одном буфере.

да, в одном, а какая разница, где я её рисую ? если бы она просто мерцала на месте перерисовки, я бы даже не спрашивал, но она куда-то улетает - каков механизм этого ?


Цитата(aaarrr @ Oct 26 2017, 11:54) *
ИМХО, когда дело касается UI, нельзя идти на компромиссы

вся электроника - это сплошные компромиссы
Sanya_kv
Цитата(Огурцов @ Oct 26 2017, 15:19) *
да, в одном, а какая разница, где я её рисую ? если бы она просто мерцала, я бы даже не спрашивал, но она куда-то улетает - каков механизм этого ?

Попробуйте понизить частоту вывода.
jcxz
Цитата(aaarrr @ Oct 26 2017, 13:54) *

У меня скорость бегущих строк намного ниже чем по этой ссылке. Если с такой большой скоростью строка будет бежать, она будет нечитабельна на любой FPS.
На бегущих счётчиках тоже не видно никаких артефактов, дёрганий и т.п.
aaarrr
Цитата(jcxz @ Oct 26 2017, 15:22) *
У меня скорость бегущих строк намного ниже чем по этой ссылке.

Речь не о скорости, а о плавности.

Цитата(jcxz @ Oct 26 2017, 15:22) *
На бегущих счётчиках тоже не видно никаких артефактов, дёрганий и т.п.

Не видно ровно до тех пор, пока рядом не окажется счетчика с 60 FPS.
30 - это практически нижняя граница комфортного восприятия движения.
Obam
Цитата(aaarrr @ Oct 26 2017, 16:30) *
Речь не о скорости, а о плавности.


Не видно ровно до тех пор, пока рядом не окажется счетчика с 60 FPS.
30 - это практически нижняя граница комфортного восприятия движения.

Кино - 24 fps и ничего, никно не жужжит… или это не те fps?
aaarrr
Цитата(Obam @ Oct 26 2017, 16:46) *
Кино - 24 fps и ничего, никно не жужжит… или это не те fps?

Так ведь не от хорошей жизни 24 FPS выбрали, просто плёнка дюже дорога была.
Sanya_kv
Цитата(Obam @ Oct 26 2017, 17:46) *
Кино - 24 fps и ничего, никно не жужжит… или это не те fps?

В кино каждый кадр в отдельности смазан. Тема эта достаточно обширна, описана боле менее здесь https://habrahabr.ru/post/338796/ (раскрывается в комментариях).
На хабаре так же есть статья, как сделать нормальную анимацию с низким FPS. Найти сейчас не смог. Читал пару лет назад.
Шаманъ
Цитата(Огурцов @ Oct 26 2017, 12:16) *
а почему так нельзя рисовать прямоугольники ? вроде самое оно, если ширина регистра позволяет

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

Цитата
олл, почему дисплей подёргивается, когда dma2d работает ? т.е. картинка как бы сдвигается в сторону

Не хватает производительности подсистемы памяти.

Цитата(aaarrr @ Oct 26 2017, 12:19) *
Ну вот, а у нормального UI перерисовка не должна занимать больше 16 мс (т.е. обеспечивать 60 к/с), иначе плавной анимации не будет по определению.
Да, TFT-экран, конечно, надо обслуживать с частотой 60, а не 30. Даташит позволяет, но пользователей тоже надо уважать.

У меня все плавно. Я как-то по этому поводу проводил эксперименты - если делать с умом, то начиная от 22..24fps все можно сделать, чтобы выглядело плавно.

Посмотрите с каким fps Вы смотрите фильмы, и ничего не дергается...

В любом случае есть хороший запас - у меня память 16бит, ожно перейти на 32бита, но под мою задачу смысла нет.

Цитата(Sanya_kv @ Oct 26 2017, 13:21) *
Прямоугольник рисовать можно, Пример:

Это будет обычный прямоугольник, а вопрос был про через одну точку, так не выйдет.
aaarrr
Цитата(Шаманъ @ Oct 26 2017, 18:31) *
...если делать с умом, то начиная от 22..24fps все можно сделать, чтобы выглядело плавно.

Вот с этого момента можно подробнее, какие техники применяются для обеспечения плавности?
Огурцов
Цитата(Шаманъ @ Oct 26 2017, 15:31) *
Обычный прямоугольник можно, но вопрос был про "рисование через одну точку" - так уже прямоугольник не выйдет.

всё правильно
Огурцов
Цитата(Sanya_kv @ Oct 26 2017, 11:31) *
Либо у Вас высокая частота вывода

в общем да, была пропущена установка прескалера RCC_PLLSAIDivR_Div8
что даёт где-то восьмикратный запас по разрешению

зы: кстати, в 32 битном (vs 24) режиме даже без прескалера не дёргается
Sanya_kv
Цитата(Огурцов @ Oct 23 2017, 06:40) *
ещё вопрос: есть мысли как подключить к stm второй дисплей ? с разными картинками, конечно

Побаловался с MIPI DSI в командном режиме. Идея его в том, что на индикаторе используется графический контроллер со своей GRAM памятью (например OTM8009A), передача данных происходит при необходимости изменения картинки. Соответственно к DSI шине вполне возможно подключить несколько индикаторов.

"Шаманъ" Случайно не проверяли, что быстрее копирует DMA2D или просто DMA. Имеется в виду режим MemToMem
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.