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

Скорость вывода пикселей на TFT 3.5" 320x480 (ili9486)?

Присмотрел такой экранчик: http://ali.onl/1dtP
TFT 3.5" 320x480, вроде как на ili9486

Вопросы:

Что означает ili9486/ili9488 в описании у продавца (это какое то мошенничество, пришлют более дешевую модель)?

С за сколько времени можно попиксельно заполнить весь экран, при использовании 16 битной шины данных, на максимуме
скорости интерфейса, без разгона, по датащиту. Например, для передачи произвольного пикселя TFT 320x240 на ili9341 в
варианте 8 битной шины данных и двухбайтового цвета, надо отправить 13 байт на экранчик(!), (на STM32F105RBT6 удалось
выжать около 0,4 сек на заполнение экрана, пичалька), тут как этим?

Если вы реально работали с таким экранчиком, можете выложить код инициализации и самой работы, а то по датащиту я не разберусь?

Какие ещё есть интересные варианты покупки этого экранчика?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 минут назад, Donker сказал:

Например, для передачи произвольного пикселя TFT 320x240 на ili9341 в
варианте 8 битной шины данных и двухбайтового цвета, надо отправить 13 байт на экранчик(!), (на STM32F105RBT6 удалось
выжать около 0,4 сек на заполнение экрана, пичалька), тут как этим?

Что-то у вас в консерватории нужно править. Даже по SPI такой экран заполняется на порядок быстрее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не надо такой дисп сажать на F105, у него нет FSMC, ногами дрыгать программно долго будет.

Возьмите либо дисп с SPI, либо проц с FSMC типа F103ZET6/F407/...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

30кадров в сек, на 107 чипе в режиме ногодрыга.

Вы завязывайте там со своим халом и адруиной, тут нужны сишные функции на несколько с строчек - с прямым обращениям к регистрам. К тому-же глупо каждый раз отдавать полный адрес пиксела,  ili9486/ili9488 и ещё куча подобных - умеют принимать данные в потоке, с автоматическим увеличением адреса пиксела.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

AVI-crak  

это теоретическое  предположение или он у вас и правда с такой скоростью заполнялся?

Можете выложить код по передаче пикселя?

У меня пиксель сейчас выводится так:

Спойлер

#define CS_HI   GPIOA->BSRR = GPIO_BSRR_BS8  //высокий уровень CS_HI; //Chip Select (не активный)
#define    CS_LOW  GPIOA->BSRR = GPIO_BSRR_BR8  //низкий уровень  CS_LOW; //Chip Select (активный)
#define RS_HI   GPIOA->BSRR = GPIO_BSRR_BS9  //высокий уровень RS_HI; //Data
#define    RS_LOW  GPIOA->BSRR = GPIO_BSRR_BR9  //низкий уровень  RS_LOW; //Command
#define WR_HI   GPIOA->BSRR = GPIO_BSRR_BS10 //высокий уровень //LCD Write
#define    WR_LOW  GPIOA->BSRR = GPIO_BSRR_BR10 //низкий уровень //LCD Write (активный)
#define RD_HI   GPIOA->BSRR = GPIO_BSRR_BS11 //высокий уровень //LCD Read
#define    RD_LOW  GPIOA->BSRR = GPIO_BSRR_BR11 //низкий уровень
#define RES_HI  GPIOA->BSRR = GPIO_BSRR_BS12 //высокий уровень //LCD Reset
#define    RES_LOW    GPIOA->BSRR = GPIO_BSRR_BR12 //низкий уровень

#define  WR_STROBE {WR_LOW; WR_HI;}
//*************************************************************************************

 

 

void TFT_DrawPixel(int x, int y, uint16_t color)
{
/////////////////////////////////////////////////////////////   
unsigned long t;    
t = x;
t<<=16;
t |= X_SIZE-1;
//--------------------------------------------------------------   
RS_LOW; //линия в состоянии посылки команды
GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| 0x2A;    WR_STROBE;
RS_HI; ////линия в состоянии посылки данных
GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(t>>24);    WR_STROBE;
GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(t>>16);    WR_STROBE;
GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(t>>8);    WR_STROBE;
GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(t);    WR_STROBE;  
//--------------------------------------------------------------    
t = y;
t<<=16;
t |= Y_SIZE-1;
//--------------------------------------------------------------   
RS_LOW; //линия в состоянии посылки команды
GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| 0x2B;    WR_STROBE;
RS_HI; ////линия в состоянии посылки данных
GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(t>>24);    WR_STROBE;
GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(t>>16);    WR_STROBE;
GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(t>>8);    WR_STROBE;
GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(t);    WR_STROBE;
//--------------------------------------------------------------   
RS_LOW;//линия в состоянии посылки команды
GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| 0x2C;    
WR_STROBE;        
//--------------------------------------------------------------         
RS_HI; //линия в состоянии посылки данных
GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(color>>8);
WR_STROBE    
//--------------------------------------------------------------   
GPIOA -> ODR =(GPIOA -> ODR & 0xFF00)| uint8_t(color);
WR_STROBE   
////////////////////////////////////////////////////////////    
}

 

 

Изменено пользователем Donker

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 hours ago, Donker said:

Присмотрел такой экранчик: http://ali.onl/1dtP
TFT 3.5" 320x480, вроде как на ili9486

Вопросы:

Что означает ili9486/ili9488 в описании у продавца (это какое то мошенничество, пришлют более дешевую модель)?

С за сколько времени можно попиксельно заполнить весь экран, при использовании 16 битной шины данных, на максимуме
скорости интерфейса, без разгона, по датащиту. Например, для передачи произвольного пикселя TFT 320x240 на ili9341 в
варианте 8 битной шины данных и двухбайтового цвета, надо отправить 13 байт на экранчик(!), (на STM32F105RBT6 удалось
выжать около 0,4 сек на заполнение экрана, пичалька), тут как этим?

Если вы реально работали с таким экранчиком, можете выложить код инициализации и самой работы, а то по датащиту я не разберусь?

Какие ещё есть интересные варианты покупки этого экранчика?

выдернуто из реального проекта

p.s. функции установки состояния ног и вывод внутренние но по названию более-менее понятно

инициализация

const uint8_t InitCommandsList[] = {
                            //  Initialization commands for ILI9486 screens
  19,                       //  19 commands in list:
                            //
  0x11, 0,                  //    1: Out of sleep mode, no args
     
  0xF2, 8,                  //    2: ???, 8 args
  0x1C,0xA3,0x32,0x02,      //
  0xB2,0x12,0xFF,0x12,      //
    
  0xF1, 2,                  //    3: ???, 2 args
  0x36,0xA4,                //
                                                                                          
  0xF8, 2,                  //    4: ???, 2 args
  0x21,0x04,                //
                                
  0xF9, 2,                  //    5: ???, 2 args
  0x00,0x08,                //
                                
  0xC0, 2,                  //    6: Power control 1, 2 arg
  0x0D,0x0D,                //
                                
  0xC1, 2,                  //    7: Power control 1, 2 arg
  0x43,0x00,                //
                                
  0xC2, 1,                  //    8: Power control 3, 1 arg
  0x00,                     //
                                
  0xC5, 2,                  //    9: VCOM control, 2 arg
  0x00,0x48,                //

  0xB6, 3,                  //   10: Display Function Control, 3 arg
  0x00,0x22,0x3B,           //

  0xE0,15,                  //   11: Positive Gamma Control, 15 arg
  0x0f,0x24,0x1c,0x0a,0x0f, //
  0x08,0x43,0x88,0x32,0x0f, //
  0x10,0x06,0x0f,0x07,0x00, //
    
  0xE1,15,                  //   12: Negative Gamma Contro, 15 arg
  0x0F,0x38,0x30,0x09,0x0f, //
  0x0f,0x4e,0x77,0x3c,0x07, //
  0x10,0x05,0x23,0x1b,0x00, //

  0x20, 1,                  //   13: Display Inversion OFF, 1 arg
  0x00,                     //

  0x3A, 1,                  //   14: Interface Pixel Format, 1 arg
  0x55,                     //

  0x2A, 4,                  //   15: Column Addess Set, 4 arg
  0x00,0x00,0x01,0xDF,      //

  0x2B, 4,                  //   16: Page Addess Set, 4 arg
  0x00,0x00,0x01,0x3F,      //

  0x36, 1,                  //   17:
  0xF8,                     //      0 x 1111 1000 0xE8
                            //          |||| ||||
                            //          |||| |||*-- D0 x
                            //          |||| ||*--- D1 x
                            //          |||| |*---- D2 MH   Display Data Latch Data Order  
                            //                              0 = LCD Refresh Left to Right
                            //                              1 = LCD Refresh Right to Left
                            //          |||| *----- D3 BGR  RGB/BGR Order
                            //                              0 = RGB      
                            //                              1 = BGR      
                            //          |||*------- D4 ML   Line Address Order           
                            //                              0 = LCD Refresh Top to Bottom
                            //                              1 = LCD Refresh Bottom to Top
                            //          ||*-------- D5 MV   Page/Column Order
                            //                              0 = Normal Mode  
                            //                              1 = Reverse Mode 
                            //          |*--------- D6 MX   Column Address Order
                            //                              0 = Left to Right   
                            //                              1 = Right to Left   
                            //          *---------- D7 MY   Page Address Order
                            //                              0 = Top to Bottom 
                            //                              1 = Bottom to Top 

  0x29, 0,                  //   18: Display ON, no args         

  0x2C, 0,                  //   19: Memory Write, no args         
  
};

void TDeviceConsole::Init(void)
{
  uint8_t *cmds;
  uint8_t numCommands, numArgs;

  {
    APP_CFG_LCD_POWER_ON;
    APP_CFG_LCD_CS_OFF;
    APP_CFG_LCD_RS_OFF;
    APP_CFG_LCD_WR_OFF;
    APP_CFG_LCD_RST_OFF;
  }

  {
    APP_CFG_LCD_RST_ON;
    msDelay(50);
    APP_CFG_LCD_RST_OFF;
    msDelay(50);
  }

  APP_CFG_LCD_CS_ON;
  {
    cmds = (uint8_t*)InitCommandsList;
    numCommands = *cmds++;            // Number of commands to follow
    while (numCommands--) {           // For each command...
      APP_CFG_LCD_RS_ON;
      APP_CFG_LCD_WR_BUS(*cmds++);    //   Read and issue command
      numArgs = *cmds++;              //   Number of args to follow
      while(numArgs--) {              //   For each argument...
        APP_CFG_LCD_RS_OFF;
        APP_CFG_LCD_WR_BUS(*cmds++);  //     Read and issue argument
      }
    }
  }
  APP_CFG_LCD_CS_OFF;
}

выводить на него точками действительно медленно получается, но если принять во внимание что много элементов это буквы, графические примитивы и прочее то очень спасает его функция SetWindow. например можно указать окно вывода с началом 100,100 и размером 8,16 и вывести в него очередной символ 8x16. получается удобно и не нужно каждый раз вычислять координаты вывода.

Изменено пользователем Zeal0t

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Zeal0t

спасибо.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Spoiler

/// Контакты управления дисплеем ( обязательно на одном порту)
#define SETPIXSEL__CE       GPIO_Pin_2
#define SETPIXSEL__WR       GPIO_Pin_7
#define SETPIXSEL__RS       GPIO_Pin_9
#define SETPIXSEL__RD       GPIO_Pin_6
#define SETPIXSEL__read	    GPIOE->CRL=0x44444444;GPIOE->CRH=0x44444444
#define SETPIXSEL__record   GPIOE->CRL=0x33333333;GPIOE->CRH=0x33333333

/// Имя порта для жк индикатора
#define GPIO_SETPIXSEL      GPIOE->ODR
#define GPIO_READPIXSEL     GPIOE->IDR
#define GPIO_SETcontrol     GPIOB->BSRR

#define SETPIXSEL_all       (uint32_t)( SETPIXSEL__RD | SETPIXSEL__RS | SETPIXSEL__WR | SETPIXSEL__CE )
#define SETPIXSEL_ce_rs     (uint32_t) (( SETPIXSEL__CE | SETPIXSEL__RS ) << 16) | (SETPIXSEL_all ^ ( SETPIXSEL__CE | SETPIXSEL__RS ))
#define SETPIXSEL_ce_rs_wr  (uint32_t) (( SETPIXSEL__CE | SETPIXSEL__RS | SETPIXSEL__WR ) << 16) | (SETPIXSEL_all ^ ( SETPIXSEL__CE | SETPIXSEL__RS | SETPIXSEL__WR ))
#define SETPIXSEL_ce        (uint32_t) (( SETPIXSEL__CE ) << 16) | (SETPIXSEL_all ^ ( SETPIXSEL__CE ))
#define SETPIXSEL_ce_wr     (uint32_t) (( SETPIXSEL__CE | SETPIXSEL__WR ) << 16) | (SETPIXSEL_all ^ ( SETPIXSEL__CE | SETPIXSEL__WR ))
#define SETPIXSEL_ce_rd     (uint32_t) (( SETPIXSEL__CE | SETPIXSEL__RD ) << 16) | (SETPIXSEL_all ^ ( SETPIXSEL__CE | SETPIXSEL__RD ))



void setReg (re,se)
{
    GPIO_SETcontrol = SETPIXSEL_ce_rs_wr;
	GPIO_SETPIXSEL = re ;
	GPIO_SETcontrol = SETPIXSEL_ce_rs;
	GPIO_SETcontrol = SETPIXSEL_ce_wr;
	GPIO_SETPIXSEL = se ;
	GPIO_SETcontrol = SETPIXSEL_ce;
	GPIO_SETcontrol = SETPIXSEL_all;
}

/// Рисуем цветную точку
void setPixel (uint16_t x,uint16_t y,uint16_t RGB)
{
	GPIO_SETcontrol = SETPIXSEL_ce_rs_wr;
	GPIO_SETPIXSEL = 0x0200;
	GPIO_SETcontrol = SETPIXSEL_ce_rs;
	GPIO_SETcontrol = SETPIXSEL_ce_wr;
	GPIO_SETPIXSEL = x;
	GPIO_SETcontrol = SETPIXSEL_ce;
	GPIO_SETcontrol = SETPIXSEL_ce_rs_wr;
	GPIO_SETPIXSEL = 0x0201;
    GPIO_SETcontrol = SETPIXSEL_ce_rs;
	GPIO_SETcontrol = SETPIXSEL_ce_wr;
	GPIO_SETPIXSEL = y;
	GPIO_SETcontrol = SETPIXSEL_ce;
    GPIO_SETcontrol = SETPIXSEL_ce_rs_wr;
	GPIO_SETPIXSEL = 0x0202;
	GPIO_SETcontrol = SETPIXSEL_ce_rs;
	GPIO_SETcontrol = SETPIXSEL_ce_wr;
	GPIO_SETPIXSEL = RGB;
	GPIO_SETcontrol = SETPIXSEL_all;
};

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

AVI-crak

спасибо, но инициализация тоже интересна, с ней обычно больше всего проблем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 hours ago, AVI-crak said:
  Reveal hidden contents


/// Контакты управления дисплеем ( обязательно на одном порту)
#define SETPIXSEL__CE       GPIO_Pin_2
#define SETPIXSEL__WR       GPIO_Pin_7
#define SETPIXSEL__RS       GPIO_Pin_9
#define SETPIXSEL__RD       GPIO_Pin_6
#define SETPIXSEL__read	    GPIOE->CRL=0x44444444;GPIOE->CRH=0x44444444
#define SETPIXSEL__record   GPIOE->CRL=0x33333333;GPIOE->CRH=0x33333333

/// Имя порта для жк индикатора
#define GPIO_SETPIXSEL      GPIOE->ODR
#define GPIO_READPIXSEL     GPIOE->IDR
#define GPIO_SETcontrol     GPIOB->BSRR

#define SETPIXSEL_all       (uint32_t)( SETPIXSEL__RD | SETPIXSEL__RS | SETPIXSEL__WR | SETPIXSEL__CE )
#define SETPIXSEL_ce_rs     (uint32_t) (( SETPIXSEL__CE | SETPIXSEL__RS ) << 16) | (SETPIXSEL_all ^ ( SETPIXSEL__CE | SETPIXSEL__RS ))
#define SETPIXSEL_ce_rs_wr  (uint32_t) (( SETPIXSEL__CE | SETPIXSEL__RS | SETPIXSEL__WR ) << 16) | (SETPIXSEL_all ^ ( SETPIXSEL__CE | SETPIXSEL__RS | SETPIXSEL__WR ))
#define SETPIXSEL_ce        (uint32_t) (( SETPIXSEL__CE ) << 16) | (SETPIXSEL_all ^ ( SETPIXSEL__CE ))
#define SETPIXSEL_ce_wr     (uint32_t) (( SETPIXSEL__CE | SETPIXSEL__WR ) << 16) | (SETPIXSEL_all ^ ( SETPIXSEL__CE | SETPIXSEL__WR ))
#define SETPIXSEL_ce_rd     (uint32_t) (( SETPIXSEL__CE | SETPIXSEL__RD ) << 16) | (SETPIXSEL_all ^ ( SETPIXSEL__CE | SETPIXSEL__RD ))



void setReg (re,se)
{
    GPIO_SETcontrol = SETPIXSEL_ce_rs_wr;
	GPIO_SETPIXSEL = re ;
	GPIO_SETcontrol = SETPIXSEL_ce_rs;
	GPIO_SETcontrol = SETPIXSEL_ce_wr;
	GPIO_SETPIXSEL = se ;
	GPIO_SETcontrol = SETPIXSEL_ce;
	GPIO_SETcontrol = SETPIXSEL_all;
}

/// Рисуем цветную точку
void setPixel (uint16_t x,uint16_t y,uint16_t RGB)
{
	GPIO_SETcontrol = SETPIXSEL_ce_rs_wr;
	GPIO_SETPIXSEL = 0x0200;
	GPIO_SETcontrol = SETPIXSEL_ce_rs;
	GPIO_SETcontrol = SETPIXSEL_ce_wr;
	GPIO_SETPIXSEL = x;
	GPIO_SETcontrol = SETPIXSEL_ce;
	GPIO_SETcontrol = SETPIXSEL_ce_rs_wr;
	GPIO_SETPIXSEL = 0x0201;
    GPIO_SETcontrol = SETPIXSEL_ce_rs;
	GPIO_SETcontrol = SETPIXSEL_ce_wr;
	GPIO_SETPIXSEL = y;
	GPIO_SETcontrol = SETPIXSEL_ce;
    GPIO_SETcontrol = SETPIXSEL_ce_rs_wr;
	GPIO_SETPIXSEL = 0x0202;
	GPIO_SETcontrol = SETPIXSEL_ce_rs;
	GPIO_SETcontrol = SETPIXSEL_ce_wr;
	GPIO_SETPIXSEL = RGB;
	GPIO_SETcontrol = SETPIXSEL_all;
};

 

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

специально не засекал но очень медленно.

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

обновление значений идет не в реальном режиме времени а после расчетов

постоянное обновление этого экрана давало результат ~28-30 обновлений в секунду

https://my-files.ru/ak1nnj

p.s. файл будет лежать по ссылке 20 дней после последнего скачивания

p.p.s. sorry. не туда ответил )

Изменено пользователем Zeal0t

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 hours ago, Donker said:

спасибо, но инициализация тоже интересна, с ней обычно больше всего проблем.

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

Тут желательно на другое обратить внимание - то как он должен обновляться в рабочем режиме, точнее что вы собираетесь на него выводить. От этого зависит предпочтительная ориентация пикселов. Для того чтобы потом не выполнять дополнительный код по размещению точек графики, точнее сократить его до минимума.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 12.02.2019 в 14:21, AVI-crak сказал:

30кадров в сек, на 107 чипе в режиме ногодрыга.

30 fps даже по SPI достигается (320x240).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

49 минут назад, jcxz сказал:

30 fps даже по SPI достигается (320x240).

Вот мне тоже интересно...

Есть задача (хобби) выводить анимированные меню, красивые переходы и прочие графические виджеты на экран. Вот смотрел на TouchGFX - у них круто выглядит все. Только рисовать хочу не руками (SetPixel, SetLine и т.д.), а на uSD-карте хранить заранее подготовленные отфотошопленные битмапы кнопочек, теней, виджетов - в общем, всю красоту, и выводить ее на экран.

Поднимется ли такая же красота на SPI-дисплеях?

Пока что вижу лишь связку uSD->SDRAM->STM32F429(LTDC)->TFT(RGB666) для реально крутой графики по умеренной цене.

Хочу как-раз дешево сделать. Нашел на Aliexpress еле-еле экран с RGB интерфейсом (VSYNC, HSYNC), с ним выходит круто (уже есть другой девайс с графикой и такой цепочкой, что привел выше, заценил). А вот SPI-модулей полно и они гораздо дешевле. Но жутко напрягают видео на ютубе (подавляющее большинство), в которых отрисовка одного кадра (!) видна как тормозящая жутко. И никаких 30fps там нет:cray: Ну вот пример: https://www.youtube.com/watch?v=5HKlbpoErpg

А хочется вот такого качества: https://www.youtube.com/watch?v=QcKX_Pc6ldU

Просто цена моего решения (с RGB-дисплеем) существенно выше (многоногий корпус МК, наличие SDRAM, более редкий TFT, более сложная плата (4-слойка) и т.д.), чем SPI-решения, где даже видеобуфер хранить нужно только по факту один - один уже в экране хранится, а другой готовим в ОЗУ МК. С учетом этого хотелось бы услышать оценочное мнение о целесообразности связки с SDRAM+LTDC+TFT-RGB против SPI-TFT.

 

P.S. Экран у меня 480x320. Глубина цвета - ну на сегодняшний момент 24 бита (RGB666) (именно хранение пикселей). Вот и думаю, 480*320*30fps*3Bpp = ~14МГц обмена по SPI, что, как бы, не много для STM32. Если еще и взять STM32F429 с DMA2D, то битмапы, вычитанные с SD-карты, можно произвольно расположить в видеобуфере, со всякими преобразованиями форматов пикселей и альфаканалом, при желании, что позволит сделать некие анимированные виджеты. Потом это дело отправить на дисплей по DMA, что не займет много процессорных сил для других дел. Но это только на первый взгляд... Как считаете, взлетит?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 минут назад, Arlleex сказал:

P.S. Экран у меня 480x320. Глубина цвета - ну на сегодняшний момент 24 бита (RGB666) (именно хранение пикселей). Вот и думаю, 480*320*30fps*3Bpp = ~14МГц обмена по SPI,

А почему всего 14 МГц?

За 320*480 не скажу, но 320*240 у меня при SCLK=40 МГц  даёт как раз 30 FPS. На STM32F429. И это не предел - у меня тактовая стоит 160МГц, а могу поставить 180МГц и получить ещё немного выше скорость (пробовал SCLK=45МГц - ILI нормально тянет такую). Вывод предыдущей картинки и рисование следующей может идти параллельно в разные видеобуферы.

Цитата

что, как бы, не много для STM32. Если еще и взять STM32F429 с DMA2D, то битмапы, вычитанные с SD-карты, можно произвольно расположить в видеобуфере, со всякими преобразованиями форматов пикселей и альфаканалом, при желании, что позволит сделать некие анимированные виджеты. Потом это дело отправить на дисплей по DMA, что не займет много процессорных сил для других дел. Но это только на первый взгляд... Как считаете, взлетит?

Насчёт построения картинки - не знаю, так трудно сказать. У меня графика простая, с небольшими фрагментами анимации. Вам надо отдельно посмотреть сколько времени займёт построение картинки с теми плюшками, что хотите. Но очевидно, что внутренней памяти Вам не хватит и SDRAM всё равно придётся ставить (если STM32F429, если не искать МК с большим объёмом внутренней ОЗУ).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...