[Решено] Любой способ улучшить скорость ILI9486 SPI ? STM32F1

Sajuukkahr
Солнце 19 февраля 2017 г., 21:31
Всем здравствуйте,

Я строю проект на основе STM32F1, работающего на 72 МГц и ILI9486, подключенный к SPI1, часовой разделитель - 1 .
Сейчас он работает довольно хорошо, моя единственная забота - медленное время розыгрыша.
Я рисую изображения через 2 петли и нарисование, библиотека https: // github.com/stevstrong/adafruit_ ... Ри/Мастер на основе Adafruit GFX.

Времена:
Timespendreadingflash = 191 миллисы
Timespendrendering = 1915 миллисы

Это для рендеринга:
1x 320x240
1x 320x45
1x 320x26
1x 320x21
1x 38x21
в общей сложности 107038 пикселей

Есть ли способ ускорить это ? пользовательский интерфейс, основанный на этом решении, действительно вялый.

Что я попробовал:
Распространить результат STM32 до 128 МГц: некоторые улучшения скорости, но ничего особенного.

Sajuukkahr
Солнце 19 февраля 2017 г., 21:47
Timespendreadingflash = 186
Timespendrendering = 2015
TimespendSettingWindow = 1652
TimespendSettingColor = 256

Кажется, что большую часть времени тратится.
По внешнему виду кажется, что SetAdDrwindow устанавливает окно памяти 1 пикселя в то время. Увеличение окна до большего количества пикселей должно теоретически уменьшить время розыгрыша.

Стивестронг
Солнце 19 февраля 2017 г. 22:16
Это так, 9 usecs wndow настройка адреса для написания 1 пиксель 1USEC.
Попробуйте написать несколько пикселей в том же блоке.
Вы можете сначала подготовиться в памяти, чтобы быть записанным на отображение.

Sajuukkahr
Солнце 19 февраля 2017 г. 22:19
Приветствую, кажется, мне нужно написать пользовательский GFX на ваш.

Sajuukkahr
Солнце 19 февраля 2017 г. 11:44
Стивестронг написал:Это так, 9 usecs wndow настройка адреса для написания 1 пиксель 1USEC.
Попробуйте написать несколько пикселей в том же блоке.
Вы можете сначала подготовиться в памяти, чтобы быть записанным на отображение.

Sajuukkahr
Пн 20 февраля 2017 г. 2:03
Я посмотрел на Spiclass :: write (const void *data, uint32 длина), но это просто Spiclass :: write (uint16 data) с помощью цикла while

Sajuukkahr
Пн 20 февраля 2017 г. 2:24
SPI.setDatasize (data_size_16bit); сокращает время розыгрыша для полноэкранного
ScreendRaw = 89

Sajuukkahr
Пн 20 февраля 2017 г., 2:52
Пользовательская функция writebuffer
val = !val; /* "set" bits are lower than "reset" bits */ dev->regs->BSRR = (1U << pin) << (16 * val);

Стивестронг
Пн 20 февраля 2017 г. 8:35 утра
Саджуккахр написал: Разве это не то, что spiclass :: write (const void *data, uint32 длина) должен делать ?

Sajuukkahr
Пн 20 февраля 2017 г. 8:56 утра
Стивестронг написал:Саджуккахр написал: Разве это не то, что spiclass :: write (const void *data, uint32 длина) должен делать ?

Стивестронг
Пн 20 февраля 2017 г. 9:15 утра
Саджуккахр написал: Сначала я пытался использовать его, но, честно говоря, не мог.

Sajuukkahr
Пн 20 февраля 2017 г., 17:46
int data; #define Trigger PB3 void setup() { pinMode(Trigger, OUTPUT); digitalWrite(Trigger, LOW); Serial.begin(115200); Wire.begin(); } void loop() { digitalWrite(Trigger, HIGH); // ols trigger Wire.i2c_start(); Wire.i2c_shift_out(0x50); // device address Wire.i2c_get_ack(); Wire.i2c_shift_out(0x5a); // writing data to this address Wire.i2c_get_ack(); Wire.i2c_shift_out(0xa5); // write data Wire.i2c_get_ack(); Wire.i2c_stop(); delay(5); Wire.i2c_start(); Wire.i2c_shift_out(0x50); // device address Wire.i2c_get_ack(); Wire.i2c_shift_out(0x5a); // writing data to this address Wire.i2c_get_ack(); data = Wire.i2c_shift_in(); // write data Wire.i2c_get_ack(); Wire.i2c_stop(); digitalWrite(Trigger, LOW); // delay(5); }

Стивестронг
Пн 20 февраля 2017 г. 18:39
Почему бы тебе не использовать void WireEepromWriteByte(uint16_t theMemoryAddress, uint8_t u8Byte) { Wire.beginTransmission(EEPROM_ADDRESS); Wire.write( (theMemoryAddress >> 8) & 0xFF ); Wire.write( (theMemoryAddress >> 0) & 0xFF ); Wire.write(u8Byte); Wire.endTransmission(); delay(5); } uint8_t WireEepromRead(uint16_t theMemoryAddress) { uint8_t u8retVal = 0; Wire.beginTransmission(EEPROM_ADDRESS); Wire.write( (theMemoryAddress >> 8) & 0xFF ); Wire.write( (theMemoryAddress >> 0) & 0xFF ); Wire.endTransmission(); delay(5); Wire.requestFrom(EEPROM_ADDRESS, 1); u8retVal = Wire.read(); return u8retVal ; }

Sajuukkahr
Вт 21 февраля 2017 г. 12:49
Попробовал это на первом месте.
Я просто хотел «дополнительные меры», чтобы убедиться, что я что -то не испортил.

Это может быть SPI.C в ядре как SPI.C, кажется, в порядке, будет попытаться отладить, когда у меня будет свободное время.

Спасибо за помощь.

Быстрый вопрос, оффтопический: я сталкиваюсь с разрывом экрана (обновление экрана попадает, когда я рисую кадр)...любая идея, как избежать этого ?

Стивестронг
Вт 21 февраля 2017 г. 8:40
Что касается функций SPI, я ответил в вашем другом посте.

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

ДВИДНАЯ ДВИЖЕНИЯ АРМА ??