Официальный сайт компании Arduino по адресу arduino.cc
ESDp32 и SSD1963 - ускорение fillrate
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пт, 22/11/2019 - 11:24
Пишу драйвер для работы с SSD1963 в восьмибитном режиме
уткнулся в тупик как мне кажется.
Скорость обновления экрана 174мс в режиме 800х480
вот функция которая самая тормозная
#define GPIO_CLEAR GPIO.out_w1tc #define GPIO_SET GPIO.out_w1ts const uint32_t TFT_CS_BIT = 1 << TFT_CS; const uint32_t TFT_RS_BIT = 1 << TFT_RS; const uint32_t TFT_WR_BIT = 1 << TFT_WR; const uint32_t TFT_CS_RS_BIT = TFT_CS_BIT | TFT_RS_BIT; const uint32_t TFT_WR_CS_BIT = TFT_WR_BIT | TFT_CS_BIT; void TFT1963::writeBlock( uint32_t color, uint32_t repeat ) { int8_t red = color & 0xFF; int8_t green = ( color >> 8 ) & 0xFF; int8_t blue = ( color >> 16 ) & 0xFF; uint32_t GPIO_CLEAR_R = TFT_WR_CS_BIT | ( ( ( ~red ) & 0xFF ) << TFT_D0 ); uint32_t GPIO_CLEAR_G = TFT_WR_CS_BIT | ( ( ( ~green ) & 0xFF ) << TFT_D0 ); uint32_t GPIO_CLEAR_B = TFT_WR_CS_BIT | ( ( ( ~blue ) & 0xFF ) << TFT_D0 ); uint32_t GPIO_SET_R = TFT_RS_BIT | ( red << TFT_D0 ); uint32_t GPIO_SET_G = TFT_RS_BIT | ( green << TFT_D0 ); uint32_t GPIO_SET_B = TFT_RS_BIT | ( blue << TFT_D0 ); Send_TFT_Command( write_memory_start ); for( int i = 0; i < repeat; i++ ) { GPIO_SET = GPIO_SET_R; GPIO_CLEAR = GPIO_CLEAR_R; GPIO_SET = TFT_WR_CS_BIT; GPIO_SET = GPIO_SET_G; GPIO_CLEAR = GPIO_CLEAR_G; GPIO_SET = TFT_WR_CS_BIT; GPIO_SET = GPIO_SET_B; GPIO_CLEAR = GPIO_CLEAR_B; GPIO_SET = TFT_WR_CS_BIT; } }
глаз замылился. не знаю что еще можно заооптимизировать чтобы ускорить.
16 битный режим работы не вариант - пинов нет уже свободных
Получается 0.174 секунды на 1152000 ( 3 * 800 * 480 ) операций = 0.15 микросекунды на одну запись цвета.
это всего 6,6 мегагерц. При 240 мегагерцовом чипе внешняя перефирия так медленно работает?
А все потому что она внешняя. Внешняя всегда будет работать медленно.
да но SPI протокол работает же на 80 мегагерцах в драйвере ILI9341.
Вот как так? Я весь код либы перерыл - не нашел ничего такого что у меня не проинициализировано.