Я переписал код, который был написан AVR по управлению в "ручную" 8 битной шиной для управления дисплеем IVI9488 при помощи платы nucleo с ST32F103RB. У меня дисплей 420*380, в уроке был 320*240. Да я понимаю, что у меня значительно большее идет данных по шине, но на AVR из цвета в цвет переходил ну практически моментально, а у меня закрашивается наверное около секунды. В чем может быть проблема?
Из-за того что я использую Nucleo64 с дисплейным шилдом, то все выводы раскиданы аж по 3 портам, поэтому написано всечерез функции с применением библиотеки HAL. Может ли это значительно уменьшать скорость ?
Изменение скорости тактирования порта с LOW на HIGH существенно ничего не меняет. Прикладываю только файл *.cpp , думаю *.h с заголовками тут не поможет. в main.c тоже только TFT9488_ini(); да TFT9488_FillScreen(); с другими необходимыми для запуска nucleo командами
Знаю что у меня есть DMA и это может дать прирост в скорости, но я не пока не умею им пользоваться и как мне кажется, STM32 должна опережать по скорости Atmega8 , даже без использования DMA...
Так же проверял этот код на гораздо более скоростной плате f469i-disco скорость отображения 1в1 такая же как и на f103RB
Код:
/* * ili9488.c * * Created on: Mar 14, 2022 * Author: AVerzin */ #include "ili9488.h"
unsigned int X_SIZE = 320;
unsigned int Y_SIZE = 480;
unsigned long dtt = 0; // что нужно доделать
// чтобы было незаметно глазу обновление экрана он это должен делать быстрее чем за // 1с / 25 кадров в секунду = 0,04 секунды = 40 миллисекунд = 40 000 микросекунд
// сделать функцию перевода портов линии данных из состояния чтения в состояние вывода // убрать упоминание портов во всех функицях, сделать все на метках DATA,CS и тп (+) // отладить функцию чтения портов линии данных (+) // сделать функцию чтения из регистров LCD (+) // прочитать ID LCD (!!!!) (+)
// Функция установки нужных уровней на линии выбора дисплея PORTC4 void TFT9488_CS_Active(void) { HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, RESET); } void TFT9488_CS_Idle(void) { HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, SET); }
// Функции установки состояния ножки RESET PORTC5 void TFT9488_RESET_Active(void) { HAL_GPIO_WritePin(RST_GPIO_Port, RST_Pin, RESET); } void TFT9488_RESET_Idle(void) { HAL_GPIO_WritePin(RST_GPIO_Port, RST_Pin, SET); }
// Функции установки состояния ножки отвечающей за строб, о том что данные готовы к считыванию // PORTC2 void TFT9488_WR_Active(void) { HAL_GPIO_WritePin(WR_GPIO_Port, WR_Pin, RESET); } void TFT9488_WR_Idle(void) { HAL_GPIO_WritePin(WR_GPIO_Port, WR_Pin, SET); }
// Функции установки состояния ножки если уровень низкий то мы читаем данные из LCD // PORTB2 void TFT9488_RD_Active(void) { HAL_GPIO_WritePin(RD_GPIO_Port, RD_Pin, RESET); } void TFT9488_RD_Idle(void) { HAL_GPIO_WritePin(RD_GPIO_Port, RD_Pin, SET); }
// Функции установки состояния ножки отвечающий за то что будет передаваться данные или команда // PORTС3 void TFT9488_RS_Command(void) { HAL_GPIO_WritePin(RS_GPIO_Port, RS_Pin, RESET); } void TFT9488_RS_Data(void) { HAL_GPIO_WritePin(RS_GPIO_Port, RS_Pin, SET); }
// Функция чтения данных из портов на линии данных char TFT9488_Port_Read(void) { char dt; // переменнная для чтения данных TFT9488_Set_Port_Read(); // Установка портов линии даннных на чтение
// чтение данных с портов линии данных начиная со старшего бита dt = HAL_GPIO_ReadPin(DATA7_GPIO_Port, DATA7_Pin); // прочитали бит с пина dt <<= 1; // сдвинули влево на 1 разряд dt |= HAL_GPIO_ReadPin(DATA6_GPIO_Port, DATA6_Pin); // прочитали следующий пин и присоединили его к dt dt <<= 1; dt |= HAL_GPIO_ReadPin(DATA5_GPIO_Port, DATA5_Pin); dt <<= 1; dt |= HAL_GPIO_ReadPin(DATA4_GPIO_Port, DATA4_Pin); dt <<= 1; dt |= HAL_GPIO_ReadPin(DATA3_GPIO_Port, DATA3_Pin); dt <<= 1; dt |= HAL_GPIO_ReadPin(DATA2_GPIO_Port, DATA2_Pin); dt <<= 1; dt |= HAL_GPIO_ReadPin(DATA1_GPIO_Port, DATA1_Pin); dt <<= 1; dt |= HAL_GPIO_ReadPin(DATA0_GPIO_Port, DATA0_Pin);
TFT9488_Set_Port_Write();// Возврат портов линии данных на запись, так как этот режим применяется чаще соответственно он должен быть по умолчанию
return (dt); }
// Функция записи данных в порты на линию данных void TFT9488_Port_Write(char dt) { // смысл этого (dt & 0b10000000)?1:0 в следующем. это тернарная операция if // мы смотрим, есть ли в старшем бите dt единица и если она есть, то выдаем 1 // если в старшем бите 0, соотвественно выводим 0. HAL_GPIO_WritePin(DATA7_GPIO_Port, DATA7_Pin, (dt & 0b10000000) ? 1 : 0); HAL_GPIO_WritePin(DATA6_GPIO_Port, DATA6_Pin, (dt & 0b01000000) ? 1 : 0); HAL_GPIO_WritePin(DATA5_GPIO_Port, DATA5_Pin, (dt & 0b00100000) ? 1 : 0); HAL_GPIO_WritePin(DATA4_GPIO_Port, DATA4_Pin, (dt & 0b00010000) ? 1 : 0); HAL_GPIO_WritePin(DATA3_GPIO_Port, DATA3_Pin, (dt & 0b00001000) ? 1 : 0); HAL_GPIO_WritePin(DATA2_GPIO_Port, DATA2_Pin, (dt & 0b00000100) ? 1 : 0); HAL_GPIO_WritePin(DATA1_GPIO_Port, DATA1_Pin, (dt & 0b00000010) ? 1 : 0); HAL_GPIO_WritePin(DATA0_GPIO_Port, DATA0_Pin, (dt & 0b00000001) ? 1 : 0); }
// Функция которая дает строб, который говорит что данные готовы void TFT9488_WR_Strobe(void) { TFT9488_WR_Active(); TFT9488_WR_Idle(); }
//—————————————————————
void TFT9488_SendCommand(unsigned char cmd) { TFT9488_RS_Command(); //лапка в состоянии посылки команды TFT9488_RD_Idle(); //отключим чтение TFT9488_CS_Active(); //подали команду LCD чтобы он начал слушать TFT9488_Port_Write(cmd); //выставили на нужных ножках данные TFT9488_WR_Strobe(); //подаем строб, чтобы LCD забрал данные TFT9488_CS_Idle(); //подаем команду на прекращение слушания LCD }
//—————————————————————
void TFT9488_SendData(unsigned char dt) { TFT9488_RS_Data(); //лапка в состоянии посылки данных TFT9488_RD_Idle(); //отключим чтение TFT9488_CS_Active(); //выбор дисплея TFT9488_Port_Write(dt); TFT9488_WR_Strobe(); TFT9488_CS_Idle(); }
//—————————————————————
void TFT9488_reset(void) {
TFT9488_CS_Idle(); TFT9488_WR_Idle(); TFT9488_RD_Idle(); TFT9488_RESET_Active(); HAL_Delay(2); TFT9488_RESET_Idle(); TFT9488_CS_Active(); TFT9488_SendCommand(0x01); //Software Reset for (uint8_t i = 0; i < 3; i++) TFT9488_WR_Strobe(); TFT9488_CS_Idle(); } //—————————————————————
unsigned long TFT9488_ReadReg(unsigned char r) { unsigned long id; unsigned char x; TFT9488_CS_Active(); //выбор дисплея TFT9488_RS_Command(); //лапка в состоянии посылки команды TFT9488_Write8(r); TFT9488_Set_Port_Read(); TFT9488_RS_Data(); // _delay_us(50);
HAL_Delay(1); TFT9488_RD_Active(); // _delay_us(5); HAL_Delay(1); x = TFT9488_Port_Read();
TFT9488_RD_Idle(); id = x; id <<= 8; TFT9488_RD_Active();
// _delay_us(5); HAL_Delay(1); x = TFT9488_Port_Read(); TFT9488_RD_Idle(); id |= x; id <<= 8; TFT9488_RD_Active();
// _delay_us(5); HAL_Delay(1); x = TFT9488_Port_Read(); TFT9488_RD_Idle(); id |= x; id <<= 8; TFT9488_RD_Active();
// _delay_us(5); HAL_Delay(1); x = TFT9488_Port_Read(); TFT9488_RD_Idle(); id |= x; if (r == 0xEF) { id <<= 8; TFT9488_RD_Active(); // _delay_us(5); HAL_Delay(1); x = TFT9488_Port_Read(); TFT9488_RD_Idle(); id |= x; } TFT9488_CS_Idle(); TFT9488_Set_Port_Write(); // _delay_us(150);//stabilization time HAL_Delay(2);
return (id); }
//————————————————————— // Функции настройки портов к котормы подключены линии данных на чтение или запись // линии данных подключены к портам G и A void TFT9488_Set_Port_Read(void) { GPIO_InitTypeDef GPIO_InitStruct = { 0 }; // Каждый пин расписан индивидуально, без обьединенений для того чтобы при перенеосе этой библиотеки // нужно было менять пины и порты только в файле .h
// Функция заливки области void TFT9488_Flood(unsigned short color, unsigned long len) { unsigned short blocks; unsigned char i, hi = color>>8, lo=color; TFT9488_CS_Active(); TFT9488_RS_Command(); TFT9488_Write8(0x2C); TFT9488_RS_Data(); TFT9488_Write8(hi); TFT9488_Write8(lo); len--; blocks=(unsigned short)(len/64);//64 pixels/block if (hi==lo) { while(blocks--) { i=16; do { TFT9488_WR_Strobe();TFT9488_WR_Strobe();TFT9488_WR_Strobe();TFT9488_WR_Strobe();//2bytes/pixel TFT9488_WR_Strobe();TFT9488_WR_Strobe();TFT9488_WR_Strobe();TFT9488_WR_Strobe();//x4 pixel } while (--i); } //Fill any remaining pixels(1 to 64) for (i=(unsigned char)len&63;i--;) { TFT9488_WR_Strobe(); TFT9488_WR_Strobe(); } } else { while(blocks--) { i=16; do { TFT9488_Write8(hi);TFT9488_Write8(lo);TFT9488_Write8(hi);TFT9488_Write8(lo); TFT9488_Write8(hi);TFT9488_Write8(lo);TFT9488_Write8(hi);TFT9488_Write8(lo); } while (--i); } //Fill any remaining pixels(1 to 64) for (i=(unsigned char)len&63;i--;) { TFT9488_Write8(hi); TFT9488_Write8(lo); } } TFT9488_CS_Idle(); }
// Функция записи в регистр 32 числа void TFT9488_WriteRegister32(unsigned char r, unsigned long d) { TFT9488_CS_Active(); TFT9488_RS_Command(); TFT9488_Write8(r); TFT9488_SendData; HAL_Delay(1); TFT9488_Write8(d>>24); HAL_Delay(1); TFT9488_Write8(d>>16); HAL_Delay(1); TFT9488_Write8(d>>8); HAL_Delay(1); TFT9488_Write8(d); TFT9488_CS_Idle(); } /* * прежде чем отправлять в память байты, нам нужно объявить область памяти, в которую будет вся наша цепочка одинаковых пикселей отправляться. Для этого мы напишем специальную функцию */ void TFT9488_SetAddrWindow(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2) { unsigned long t; TFT9488_CS_Active(); TFT9488_SendCommand(0x2A);
TFT9488_SendCommand(0xB4); //Display Inversion Control TFT9488_SendData(0x02); //2-dot
TFT9488_SendCommand(0XB6); //Display Function Control RGB/MCU Interface Control TFT9488_SendData(0x02); //MCU TFT9488_SendData(0x02); //Source,Gate scan dieection TFT9488_SendData(0x3B); //480 линий
TFT9488_SendCommand(0XE9); // Set Image Functio TFT9488_SendData(0x00); // Disable 24 bit data
// Функция записи данных в порты на линию данных void TFT9488_Port_Write(char dt) { // смысл этого (dt & 0b10000000)?1:0 в следующем. это тернарная операция if // мы смотрим, есть ли в старшем бите dt единица и если она есть, то выдаем 1 // если в старшем бите 0, соотвественно выводим 0. HAL_GPIO_WritePin(DATA7_GPIO_Port, DATA7_Pin, (dt & 0b10000000) ? 1 : 0); HAL_GPIO_WritePin(DATA6_GPIO_Port, DATA6_Pin, (dt & 0b01000000) ? 1 : 0); HAL_GPIO_WritePin(DATA5_GPIO_Port, DATA5_Pin, (dt & 0b00100000) ? 1 : 0); HAL_GPIO_WritePin(DATA4_GPIO_Port, DATA4_Pin, (dt & 0b00010000) ? 1 : 0); HAL_GPIO_WritePin(DATA3_GPIO_Port, DATA3_Pin, (dt & 0b00001000) ? 1 : 0); HAL_GPIO_WritePin(DATA2_GPIO_Port, DATA2_Pin, (dt & 0b00000100) ? 1 : 0); HAL_GPIO_WritePin(DATA1_GPIO_Port, DATA1_Pin, (dt & 0b00000010) ? 1 : 0); HAL_GPIO_WritePin(DATA0_GPIO_Port, DATA0_Pin, (dt & 0b00000001) ? 1 : 0); }
Вывод 8 бит в порт, вместе с RS и RW, если порт тот же - это одна запись в BSRR, а не вот это... Неужели на AVR было так же и заливка происходила практически моментально?
Хоспаде, вы бы ещё на Ява-скрипте написали. HAL он на то и "Уровень абстракции от железа". Он позволяет писать код одинаково для всех контроллеров производителя, но взамен выполняет МНОГО дополнительных операций внутри своих слоёв. Ну и плюс... Почему нельзя было просто вывести байт в порт? Зачем эта дикая конструкция по проверке битов?
и как мне кажется, STM32 должна опережать по скорости Atmega8 , даже без использования DMA...
Когда вот так в лоб сравнивают скорость AVR с ARM сразу приходит в голову мультик "Ишь ты, Масленица" - "Пока твой конь четырьмя ногами - раз два три четыре... Мальчишка на двух - раз, два, раз, два".
Скажу так, ваш код, навскидку, можно в десятки (а может даже сотню, смотря как ноги по портам распихать) раз ускорить.
Добавлено after 16 minutes 28 seconds: План действий такой: 1. Отказаться от HAL_GPIO_WritePin. 2. Сгруппировать записи по портам. У вас их три, вот и должно быть три записи. 3. Объединить запись линий data с сигналами RS и RW. 4. Посмотреть на код и перегруппировать ноги так, чтобы было как можно меньше логических операций при группировке данных для записи в порты.
На каждом шаге можно получить значительный прирост в скорости. Atmega8 так уж точно обойдём
Вывод 8 бит в порт, вместе с RS и RW, если порт тот же - это одна запись в BSRR, а не вот это... Неужели на AVR было так же и заливка происходила практически моментально?
Нет, в уроке было более оптимально просто перенос переменной в регистры. так как там все было подключено к 1 порту, я просто думал что STM32 настолько быстро дрыгает своими ножками, что и так сойдет...
AlanDrakes писал(а):
замут чтобы линии на экран назначать любой порт, любой пин.
Да, именно в этом и была цель. Так как у меня разные платы и, казалось, что 8 битная шина ну никак не может быть медленной. Но видимо ошибся
VladislavS писал(а):
План действий такой: 1. Отказаться от HAL_GPIO_WritePin. 2. Сгруппировать записи по портам. У вас их три, вот и должно быть три записи. 3. Объединить запись линий data с сигналами RS и RW. 4. Посмотреть на код и перегруппировать ноги так, чтобы было как можно меньше логических операций при группировке данных для записи в порты. На каждом шаге можно получить значительный прирост в скорости. Atmega8 так уж точно обойдём
Огромное спасибо! На днях отпишусь по результатам, может даже попробую все переписать на работу с 1 портом Портов на линии данных на самом деле 2, часть управления на 3ем =)
Добавлено after 2 hours 5 minutes 32 seconds: Чтото у меня ещё более монструозное получается.... Чую я не в том направление иду, уже вижу ошибки как минимум в GPIOx->ODR = mask. Затирает весь порт и оставляет только биты данных
mask = 0x0000; //7 бит данных на 8 порт if(dt & 0b10000000) { mask = 0x0100; } // 0бит данных на 9 порт if(dt & 0b00000001){ mask |= 0x0200; } //2бит данных на 10 порт if(dt & 0b00000100){ mask |= 0x0400; } GPIOA->ODR = mask;
mask = 0x0000; //3бит данных на 3 порт if(dt & 0b00001000){ mask |= 0x0008; } //4 бит данных на 5 порт if(dt & 0b00010000){ mask |=0x0020 ; } //6 бит данных на 10 порту if(dt & 0b01000000){ mask |= 0x0400; } GPIOB->ODR = mask;
2 VladislavS Подскажите пожалуйста, переписал на BSRR, но увы не работает. Перепроверял соответствие бита и пинов все верно, однако не работает (
Код:
if (dt & 0b10000000) maskA |= GPIO_PIN_8; // 7 бит данных на 8 пин порт А if (dt & 0b01000000) maskB |= GPIO_PIN_10; // 6 бит данных на 10 пин порта В if (dt & 0b00100000) maskB |= GPIO_PIN_4;// 5 бит данных на 4 пин порта В if (dt & 0b00010000) maskB |= GPIO_PIN_5; // 4 бит данных на 5 пин порта В if (dt & 0b00001000) maskB |= GPIO_PIN_3; // 3 бит данных на 3 пин порт В if (dt & 0b00000100) maskA |= GPIO_PIN_10; // 2 бит данных на 10 пин порт А if (dt & 0b00000010) maskC |= GPIO_PIN_7; // 1 бит данных на 7 пин порта С if (dt & 0b00000001) maskA |= GPIO_PIN_9; // 0 бит данных на 9 пин порт А
Нет, BSRR ставит и снимает одновременно. Ты только ставишь, через время на портах будет 10 единичек. Конечно можно снимать при помощи BRR, но тогда будет две записи в порт...
Пока пытался понять логику работы понял, что вы имеете ввиду. Получается что через BRR я в итоге забью весь порт и будет у меня там всегда 1 после этой функции и они не будут сбрасываться для следующей передачи данных. Интересная мысль спасибо!
т.е. получается мне необходимо модифицировать какуюто функцию, чтобы данные отправились, произошел строб для считывания и потом все линии стали в нули....
Похоже ты ничего не понял. Допустим нужно в PA2/PA1/PA0 записать 5 не трогая другие пины, тогда сначала очищаем все три пина записывая единички в старшую половину BSRR, а потом устанавливаем нужные два:
Reflector, Спасибо, действительно пока сложно понять, как работать с этим регистром в моем случае. Пример был очень наглядный и понятный, пойду возьму паузу на осмысление и понятия того как это использовать мне. А так было просто с WritePin)
Добавлено after 8 minutes 39 seconds: Родилось вот такое
Код:
if (dt & 0b10000000) maskA |= GPIO_PIN_8; // 7 бит данных на 8 пин порт А if (dt & 0b01000000) maskB |= GPIO_PIN_10; // 6 бит данных на 10 пин порта В if (dt & 0b00100000) maskB |= GPIO_PIN_4; // 5 бит данных на 4 пин порта В if (dt & 0b00010000) maskB |= GPIO_PIN_5; // 4 бит данных на 5 пин порта В if (dt & 0b00001000) maskB |= GPIO_PIN_3; // 3 бит данных на 3 пин порт В if (dt & 0b00000100) maskA |= GPIO_PIN_10; // 2 бит данных на 10 пин порт А if (dt & 0b00000010) maskC |= GPIO_PIN_7; // 1 бит данных на 7 пин порта С if (dt & 0b00000001) maskA |= GPIO_PIN_9; // 0 бит данных на 9 пин порт А
Скорость немного подросла было 2.7 секунд стало 1.4 секунды....
Надо ещё както ускорить в 10 раз....
Добавлено after 14 minutes 44 seconds: Ещё вижу способ для ускорения это убрать HAL_Delay(1). В примере от AVR были микросекундные задержки, а у меня в 1000 раз больше.
На какой скорости работает процессор и какой уровень оптимизации?
Для начала вот так
Код:
GPIOA->BSRR = ((GPIO_PIN_8|GPIO_PIN_10|GPIO_PIN_9) << 16) | ((dt & 0b10000000) << 1) // 7 бит данных на 8 пин порт А | ((dt & 0b00000100) << 8) // 2 бит данных на 10 пин порт А | ((dt & 0b00000001) << 9); // 0 бит данных на 9 пин порт А
GPIOB->BSRR = ((GPIO_PIN_10|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_3) << 16) | ((dt & 0b01000000) << 4) // 6 бит данных на 10 пин порта В | ((dt & 0b00100000) >> 1) // 5 бит данных на 4 пин порта В | ((dt & 0b00010000) << 1) // 4 бит данных на 5 пин порта В | (dt & 0b00001000); // 3 бит данных на 3 пин порт В
GPIOC->BSRR = (GPIO_PIN_7 << 16 ) | ((dt & 0b00000010) << 6); // 1 бит данных на 7 пин порта С
Затем, сюда же вводите сигналы RS и RW, их можно/нужно устанавливать вместе с данными.
На маску B напрашивается таблица перекодировки на 16 элементов, из которой выбирается значение по индексу ((dt & 0b01111000)>>3).
Последний раз редактировалось VladislavS Пт мар 18, 2022 08:34:23, всего редактировалось 2 раз(а).
Скорость немного подросла было 2.7 секунд стало 1.4 секунды....
Надо ещё както ускорить в 10 раз....
А вы можете использовать пины более... компактно? Или так разведено на плате? Кстати, если контроллер изначально должен работать с экраном через параллельный порт и через FMC / FSMC шину, то ускорить вывод в него можно легко. Где-то, раз в 80.
Если же вы сами так раскидали пины... то всё очень грустно. Рекомендую скомпоновать их в восемь бит одного порта. Тогда писать можно будет всего за несколько тактов:
В случае же с записью через FSMC, будет ещё интереснее:
Код:
// Запись байта данных FSMC_REGION_DATA = (uint8_t)Next_Data_Byte; // Запись команды FSMC_REGION_CMD = (uint8_t)Command_Byte;
Но в этом случае нужно подключать дисплей в соответствии с распиновкой FSMC / FMC контроллера. Например, для STM32F7 сопоставление пинов выглядит так (взял из комментариев в своём коде):
А вы можете использовать пины более... компактно? Или так разведено на плате?
Там Nucleo с шилдом. Даже с такой разводкой можно что-то выжать. Просто надо поработать, чтобы всё нормально оптимизировалось и заинлайнилось по скорости.
Добавлено after 1 hour 2 minutes 35 seconds: С таблицей перекодировки как-то так
Код:
// В глобальной области #define MB(X) (((GPIO_PIN_10|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_3) << 16)\ | ((X&1)?(1<<3):0)\ | ((X&2)?(1<<5):0)\ | ((X&4)?(1<<4):0)\ | ((X&8)?(1<<10):0))
Добавлено after 1 hour 19 minutes 18 seconds: Ещё наблюдение. Вы много-много раз пишете TFT9488_Write8(hi); TFT9488_Write8(lo); с одним и тем же значением hi и lo. И при каждом вызове функции вычисляются маски портов A,B,C. Можно это сделать один раз и передавать в TFT9488_Write8 указатель на структуру из трёх масок.
На какой скорости работает процессор и какой уровень оптимизации?
Уровень оптимизации не знаю где смотреть, я пишу в Cube. Про оптимизатор слышал только в видео про keil.
Скорости стоят максимальные SYSCLK 64 MHz и по портам тоже все по максимуму
VladislavS писал(а):
Для начала вот так
Спасибо! Такое ещё 0.2 сек убрало с результата. Теперь экран перекрашивается не за 2.7с, а за 0.7с.
VladislavS писал(а):
С таблицей перекодировки как-то так
К сожалению, я вообще не понимаю что тут написано ( Буду разбираться. Спасибо!
AlanDrakes писал(а):
В случае же с записью через FSMC, будет ещё интереснее:
У меня 103RB, там вроде как нет FSMC...
AlanDrakes писал(а):
А вы можете использовать пины более... компактно? Или так разведено на плате?
У меня nucleo плата и туда через ардуино разъем вставлен ардуиношилд с TFT. Поэтому такая и фигня с портами, обязательно, для теста оптимизированного кода подключу правильно логично все на 1 порт, и замерю скорость. Но пока хочется выжать из этого максималку.... Ибо уже и так благодаря помощи удалось снизить с 2.7 до 0.7с. Причем самый огромный прирост это с 2.7 до 1.1 сек дал переход на BSRR
В порт B пишутся 4 бита одной группой, но они переставленны местами. 4 бита дают 16 разных значений для записи в BSRR. Их можно вычислить заранее, положить в массив и из него выбирать ставя в соответствие.
Цитата:
Вроде как у меня экран уже с похожей скоростью перекрашивается
Так вы ещё оптимизировать, по большому счёту, ещё не начали
Последний раз редактировалось VladislavS Пт мар 18, 2022 19:38:17, всего редактировалось 1 раз.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения