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.
Вот как так? Я весь код либы перерыл - не нашел ничего такого что у меня не проинициализировано.