Easyelectronics.ru

Электроника для всех
Текущее время: 23 янв 2021, 01:21

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 23 ] 
Автор Сообщение
 Заголовок сообщения: Непонятки с TFT
СообщениеДобавлено: 11 ноя 2020, 17:04 
Старожил
Аватара пользователя

Зарегистрирован: 27 июн 2011, 01:37
Сообщения: 239
Откуда: Саратов
Собственно, мучаю (или она меня) STM32F7-discovery. Вывожу картинку на ее TFT (480x272).
В зависимости от размера картинки результаты как показано ниже. На первом фото (слева) - 50х50, на втором - 49х49... на последнем - 46х46. А 44х44 отображает нормально. И далее история повторяется. Это касается не только квадратных, но и прямоугольных областей рисунка.
Если кто-то сталкивался с этим или есть идеи, подскажите, пожалуйста, в чем причина.

Изображение Изображение Изображение Изображение Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с TFT
СообщениеДобавлено: 11 ноя 2020, 18:53 
Старожил
Аватара пользователя

Зарегистрирован: 13 дек 2010, 23:15
Сообщения: 2446
Откуда: Киев
Сталкивался с таким, но не на стм. Банально где-то в функции рисования, не правильно область прорисовки/размеры изображения передаёте.
Либо используемая функция их как-то не верно обрабатывает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с TFT
СообщениеДобавлено: 11 ноя 2020, 21:39 
Заглядывает иногда

Зарегистрирован: 10 сен 2020, 21:37
Сообщения: 148
Неверно заданы размеры слоя, неверно посчитаны параметры в настройках слоя, неверный формат (расположение байтов) картинки. Правильность задания параметров (размеров) слоя именно так и влияет на отображение картинки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с TFT
СообщениеДобавлено: 11 ноя 2020, 22:28 
Старожил
Аватара пользователя

Зарегистрирован: 27 июн 2011, 01:37
Сообщения: 239
Откуда: Саратов
Ок. Проверю. Спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с TFT
СообщениеДобавлено: 12 ноя 2020, 11:48 
Старожил
Аватара пользователя

Зарегистрирован: 27 июн 2011, 01:37
Сообщения: 239
Откуда: Саратов
Взгляните, пожалуйста, правильны ли настройки? Зпущен еще DMA2D.
Изображение
Код:
static void MX_LTDC_Init(void)
{

  /* USER CODE BEGIN LTDC_Init 0 */

  /* USER CODE END LTDC_Init 0 */

  LTDC_LayerCfgTypeDef pLayerCfg = {0};
  LTDC_LayerCfgTypeDef pLayerCfg1 = {0};

  /* USER CODE BEGIN LTDC_Init 1 */

  /* USER CODE END LTDC_Init 1 */
  hltdc.Instance = LTDC;
  hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;
  hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;
  hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;
  hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
  hltdc.Init.HorizontalSync = 40;
  hltdc.Init.VerticalSync = 9;
  hltdc.Init.AccumulatedHBP = 53;
  hltdc.Init.AccumulatedVBP = 11;
  hltdc.Init.AccumulatedActiveW = 533;
  hltdc.Init.AccumulatedActiveH = 283;
  hltdc.Init.TotalWidth = 565;
  hltdc.Init.TotalHeigh = 285;
  hltdc.Init.Backcolor.Blue = 0;
  hltdc.Init.Backcolor.Green = 0;
  hltdc.Init.Backcolor.Red = 0;
  if (HAL_LTDC_Init(&hltdc) != HAL_OK)
  {
    Error_Handler();
  }
  pLayerCfg.WindowX0 = 0;
  pLayerCfg.WindowX1 = 480;
  pLayerCfg.WindowY0 = 0;
  pLayerCfg.WindowY1 = 272;
  pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;
  pLayerCfg.Alpha = 255;
  pLayerCfg.Alpha0 = 0;
  pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;
  pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;
  pLayerCfg.FBStartAdress = 0;
  pLayerCfg.ImageWidth = 480;
  pLayerCfg.ImageHeight = 272;
  pLayerCfg.Backcolor.Blue = 0;
  pLayerCfg.Backcolor.Green = 0;
  pLayerCfg.Backcolor.Red = 0;
  if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)
  {
    Error_Handler();
  }
  pLayerCfg1.WindowX0 = 0;
  pLayerCfg1.WindowX1 = 0;
  pLayerCfg1.WindowY0 = 0;
  pLayerCfg1.WindowY1 = 0;
  pLayerCfg1.Alpha = 0;
  pLayerCfg1.Alpha0 = 0;
  pLayerCfg1.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
  pLayerCfg1.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;
  pLayerCfg1.FBStartAdress = 0;
  pLayerCfg1.ImageWidth = 0;
  pLayerCfg1.ImageHeight = 0;
  pLayerCfg1.Backcolor.Blue = 0;
  pLayerCfg1.Backcolor.Green = 0;
  pLayerCfg1.Backcolor.Red = 0;
  if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg1, 1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN LTDC_Init 2 */

  /* USER CODE END LTDC_Init 2 */

}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с TFT
СообщениеДобавлено: 12 ноя 2020, 12:31 
Старожил
Аватара пользователя

Зарегистрирован: 13 дек 2010, 23:15
Сообщения: 2446
Откуда: Киев
Ну у вас же фоновая картинка вроде верновывелась. Имхо проблема где-то там где именно уже иконка отображается.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с TFT
СообщениеДобавлено: 12 ноя 2020, 13:52 
Старожил
Аватара пользователя

Зарегистрирован: 27 июн 2011, 01:37
Сообщения: 239
Откуда: Саратов
Фон заливка прямоугольной области цветом - не картинка.
А в конфигурации Layer1 (pLayerCfg1.WindowX1 = 0;) не должно ли тоже быть значение 480 как в нулевом? И для pLayerCfg1.WindowY1 = 0; соответственно, если используется вся область экрана 480х272?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с TFT
СообщениеДобавлено: 12 ноя 2020, 15:05 
Старожил
Аватара пользователя

Зарегистрирован: 13 дек 2010, 23:15
Сообщения: 2446
Откуда: Киев
Увы, я с кубом не работал. Но чисто по коду и картинке выше, ваше pLayerCfg1.WindowX1 = 0 очень похоже на старт позицию. И если у вас весь экран используется, то выглядит верно. Скиньте кусок кода вывода иконки пожалуйста.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с TFT
СообщениеДобавлено: 12 ноя 2020, 17:54 
Старожил
Аватара пользователя

Зарегистрирован: 27 июн 2011, 01:37
Сообщения: 239
Откуда: Саратов
Код:
///--- Функция вывода рисунка BMP ---------------------------------------------------
void TFT_DrawBitmap(uint32_t x_pos, uint32_t y_pos, uint8_t *ptr) {
  uint32_t index = 0, width = 0, height = 0, bit_pixel = 0;
  uint32_t address;

  //-- Get bitmap data address offset
  index = *(__IO uint16_t *)(ptr + 10);
  index |= (*(__IO uint16_t *)(ptr + 12)) << 16;
  //-- Read bitmap width
  width = *(__IO uint16_t *)(ptr + 18);
  width |= (*(__IO uint16_t *)(ptr + 20)) << 16;
  //-- Read bitmap height
  height = *(__IO uint16_t *)(ptr + 22);
  height |= (*(__IO uint16_t *)(ptr + 24)) << 16;
  //-- Read bit/pixel
  bit_pixel = *(__IO uint16_t *)(ptr + 28);
  //-- Set the address
  address = hltdc.LayerCfg[0].FBStartAdress + (((hltdc.LayerCfg[0].ImageWidth * y_pos) + x_pos) * 4);
  //-- Bypass the bitmap header
  ptr += (index + (width * (height - 1) * (bit_pixel / 8)));
  if( (bit_pixel / 8) == 4 ) {
    TFT_FillScreen( LCD_COLOR_RED );
  }
  else {
    if( (bit_pixel / 8) == 2 ) {
    TFT_FillScreen( LCD_COLOR_GREEN );
    }
    else {
      hdma2d.Init.Mode = DMA2D_M2M_PFC;
      hdma2d.Init.ColorMode = DMA2D_ARGB8888;
      hdma2d.Init.OutputOffset = 0;
      hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
      hdma2d.LayerCfg[1].InputAlpha = 0xFF;
      hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_RGB888;
      hdma2d.LayerCfg[1].InputOffset = 0;
      //-- Convert picture to ARGB8888 pixel format
      if( HAL_DMA2D_Init( &hdma2d ) == HAL_OK ) {
        if( HAL_DMA2D_ConfigLayer( &hdma2d, 1 ) == HAL_OK ) {
          for( index = 0; index < height; index++ ) {
            if( HAL_DMA2D_Start( &hdma2d, (uint32_t) ptr, address, width, 1 ) == HAL_OK ) {
            HAL_DMA2D_PollForTransfer( &hdma2d, 10 );
            }
            address += hltdc.LayerCfg[0].ImageWidth * 4;
            ptr -= width * (bit_pixel / 8);
          }
        }
      }
    }
    //-- Установим настройки DMA2D в DMA2D_M2M
    hdma2d.Init.Mode = DMA2D_M2M;
    hdma2d.Init.ColorMode = DMA2D_OUTPUT_ARGB8888;
    hdma2d.Init.OutputOffset = 0;
    hdma2d.LayerCfg[1].InputOffset = 0;
    hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_ARGB8888;
    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();
    }
  }
  bit_pixel = 0;
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с TFT
СообщениеДобавлено: 12 ноя 2020, 20:34 
Старожил
Аватара пользователя

Зарегистрирован: 13 дек 2010, 23:15
Сообщения: 2446
Откуда: Киев
На первый взгляд грубых ошибок нет, едиственный момент:
Код:
for( index = 0; index < height; index++ ) {
            if( HAL_DMA2D_Start( &hdma2d, (uint32_t) ptr, address, width, 1 ) == HAL_OK ) {
            HAL_DMA2D_PollForTransfer( &hdma2d, 10 );
            }
            address += hltdc.LayerCfg[0].ImageWidth * 4;
            ptr -= width * (bit_pixel / 8);
}

Вот эти все касты и умножение на константы довольно легкий способ где-то что-то пропустить. При этом указатели компилируются, но работают не правильно.
По сути у вас происходит следующее, есть картинка для простоты 50х50. И по идее квадрат на экране должен быть такого-же размера, но то ли из-за того что в самом файле bmp width и height заданы не верно, толи код, что вы привели выше делает что-то не-то, они интерпретируются не верно. В результате, если к примеру реальная картинка 44x44, а вы окно задаете 50х50, то уже на первой строке изображение будет смещено в лево на 6 пикселей, на второй на 12 и так далее и вы получите тот результат что-выше.
Вообщем надо проверить, что картинки в примере действительно имеют верные width и height c реальным изображением, прописанным в файле. По идее можно на компе октрыть в любой рисовалке, если отображается верно, значит и прописано верно.
Далее дебаг на эту функцию, и смотрим width , height и ptr. Правильно ли они обсчитываются.
Больше идей пока нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с TFT
СообщениеДобавлено: 13 ноя 2020, 00:45 
Старожил
Аватара пользователя

Зарегистрирован: 27 июн 2011, 01:37
Сообщения: 239
Откуда: Саратов
В width и height ошибки нет. У меня возникло то же впечатление, что не верно рассчитывается сдвиг на адрес начала картинки в BMP-файле.
Сам файл читается с SD-карты в буфер (указатель ptr) корректно. address в области LTDC тоже рассчитан корректно, т.к. прорисовывается квадрат в заданной координате на TFT (и размеры width и height соответствуют). Но, вот, если не верно рассчитывается сдвиг на адрес начала картинки в BMP-файле, то может появиться сдвиг. Вопрос, который пока без ответа: "Если сдвиг рассчитывается некорректно, то почему при определенных размерах картинки (в моем случае 48х48 и 44х44) она отрисовывается верно?" То есть, если ошибка хроническая...
Завтра еще раз внимательно в отладке буду высматривать и вынюхивать в надежде озарения)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с TFT
СообщениеДобавлено: 13 ноя 2020, 02:44 
Старожил
Аватара пользователя

Зарегистрирован: 18 июн 2011, 16:29
Сообщения: 2107
Откуда: Докучаевск-Волноваха
просто так, вдруг подумалось:
Цитата:
при определенных размерах картинки (в моем случае 48х48 и 44х44)
(48*48) и (44*44) нацело делятся на 16 и на 8. А вот 50*50 уже не нацело. Проверяйте расчеты еще раз. Попробуйте вывести 64*64 или 32*32

_________________
Хранитель форума


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с TFT
СообщениеДобавлено: 13 ноя 2020, 23:01 
Старожил
Аватара пользователя

Зарегистрирован: 27 июн 2011, 01:37
Сообщения: 239
Откуда: Саратов
Что удалось выяснить.
Проблема кроется в "лишних" байтах BMP-файлов в случаях, когда произведение width * height не кратно 16, как заметил Финский. Эти байты втыкаются в области данных файла по одному или по два в основном в конце строк и в зависимости от размеров тех самых width и height. Для чего это делается, по какому алгоритму - для меня темный лес. От графического, ли, векторного, ли, редактора это, кстати, не зависит. Рисунок, сохраненный в PNG и прогнанный через конвертер Image2Lcd на выходе имеет те же "лишние" байты. Разумеется, от этого и "ползет" рисунок.
Может есть у кого светлые мысли разобраться в этих дебрях? Уж, очень не хотелось бы рисовать миниатюры и следить за результатом width * height ((


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с TFT
СообщениеДобавлено: 13 ноя 2020, 23:28 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1396
Финский писал(а):
(48*48) и (44*44) нацело делятся на 16 и на 8. А вот 50*50 уже не нацело.

48 и 44 нацело делятся на 4, по ширине, высота не важна, проблема в рядах. Длина ряда должна быть кратна четырем иначе будет дополнение нулями...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с TFT
СообщениеДобавлено: 13 ноя 2020, 23:40 
Старожил
Аватара пользователя

Зарегистрирован: 27 июн 2011, 01:37
Сообщения: 239
Откуда: Саратов
Reflector писал(а):
48 и 44 нацело делятся на 4, по ширине, высота не важна, проблема в рядах. Длина ряда должна быть кратна четырем иначе будет дополнение нулями...

Ок. Попробую вытянуть из этого пользу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с TFT
СообщениеДобавлено: 14 ноя 2020, 00:44 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 2140
Гораздо больше пользы от
https://en.wikipedia.org/wiki/BMP_file_format
если не хочется взять готовую библиотеку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с TFT
СообщениеДобавлено: 14 ноя 2020, 01:07 
Старожил

Зарегистрирован: 28 сен 2018, 00:25
Сообщения: 355
Так принципиально именно бмп/пнг формат использовать? Я по старинке картинки в массив перегоняю. Пользуюсь сеггеровой тулзой BmpCvtST. На выходе дает массив в уже нужном формате и структуру-описатель изображения.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с TFT
СообщениеДобавлено: 27 ноя 2020, 16:45 
Старожил
Аватара пользователя

Зарегистрирован: 27 июн 2011, 01:37
Сообщения: 239
Откуда: Саратов
dvf писал(а):
Reflector писал(а):
48 и 44 нацело делятся на 4, по ширине, высота не важна, проблема в рядах. Длина ряда должна быть кратна четырем иначе будет дополнение нулями...

Ок. Попробую вытянуть из этого пользу.

Вытянул из этого то, что мудохаться с отрисовкой BMP со сторонами не кратными 4 себе дороже. Поэтому решил юзать картинки с 4 байтами на пиксель. Например PNG. Правда это тоже гемор в плане двух преобразований: Исходник в векторном или графическом редакторе -> Преобразование в PNG (формат со сжатием) -> Преобразование PNG программкой Image2Lcd в удобоваримый файл EBM, который и закидывается на SD-карту.
Минус одно преобразование - это рисовать в Photoshop с альфа-каналом и сохранять сразу в BMP с форматом пикселя ARGB. тогда не надо будет заморачиваться с кратностью 4.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с TFT
СообщениеДобавлено: 27 ноя 2020, 17:09 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2900
Откуда: Санкт-Петербург
Да ладно, какие проблемы с кратностью? Делов-то – в цикле по строкам правильно считать начало следующей строки (ну или правильно посчитать длину строки в байтах: size = width * 3 + width % 4, и при переходе со строки на строку начало новой брать от начала предыдущей)

Впрочем, если уже есть рабочее решение – понимаю желание не париться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с TFT
СообщениеДобавлено: 27 ноя 2020, 17:11 
Старожил
Аватара пользователя

Зарегистрирован: 27 июн 2011, 01:37
Сообщения: 239
Откуда: Саратов
У меня еще вопрос ко всем. Экран сначала заливаю черным фоном одноцветным, а потом вывожу каждые 200 мс картинку 50*50 с альфа-каналом (но это не важно), инкрементируя Х-координату. Картинка порой при выводе мерцай, как будто фон просвечивается. Надо как-то синхронизироваться с самим экраном в идеале при выводе графики? Видос форум напрямую не дает залить, увы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с TFT
СообщениеДобавлено: 27 ноя 2020, 17:55 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 458
Буферизировать надо экран. Если буфер не влезаем в память МК, то частично буферизировать и по частям выводить. Это реализовано в некоторых графических либах для МК


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с TFT
СообщениеДобавлено: 27 ноя 2020, 18:00 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 458
А, туплю. Тут же речь про STM32F7-discovery с граф. ускорителем. Скорее всего двойная буферизация должна поддерживаться из коробки, но это не точно ))
Посмотрел кучу примеров. Народ просто держит два фрейбуфера в ОЗУ. Один - для отрисовки, другой для отображения на экране. Отрисовал, дождался LTDC_CDSR_VSYNCS, переключил, отрисовал, дождался LTDC_CDSR_VSYNCS, переключил и т.д.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Непонятки с TFT
СообщениеДобавлено: 30 ноя 2020, 02:43 
Старожил
Аватара пользователя

Зарегистрирован: 27 июн 2011, 01:37
Сообщения: 239
Откуда: Саратов
ArtDen писал(а):
Отрисовал, дождался LTDC_CDSR_VSYNCS, переключил, отрисовал, дождался LTDC_CDSR_VSYNCS, переключил и т.д.

Спасибо за вектор


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB