Медленный вывод на STM32 8 битной шины (дисплей)
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Медленный вывод на STM32 8 битной шины (дисплей)
Так на внешний кварц (он же есть на плате?) в настройках RCC переключите.
- Реклама
Re: Медленный вывод на STM32 8 битной шины (дисплей)
[uquote="VladislavS",url="/forum/viewtopic.php?p=4200510#p4200510"]Так на внешний кварц (он же есть на плате?) в настройках RCC переключите.[/uquote]
STM сэкономили и не распаяли там кварц)
STM сэкономили и не распаяли там кварц)
- AlanDrakes
- Прорезались зубы
- Сообщения: 236
- Зарегистрирован: Пн июл 04, 2016 16:51:22
- Откуда: Россия, Омск
Re: Медленный вывод на STM32 8 битной шины (дисплей)
Ну хотя бы затактируйте PLL от HSI генератора.
После этого можно вызвать SystemCoreClockUpdate() и убедиться в правильности считанной частоты в переменной SystemCoreClock.
И если я правильно понял, шильд типа такого?
С ним да, сложно. Пины развели так, что хочется им руки отбить за такое. Но на проводках работает. Либо на самодельной печатной плате, где шина разведена на FMC контроллер.
offtop: Это у меня глюки в браузера, что блок кода выгдлядит так, словно переносы строк пропали?
Код: Выделить всё
// HSI / 2 -> PLL = 8/2 = 4 * 16 = 64MHz [15]
// APB low speed = HCLK /2 (32MHz) [4]
RCC->CFGR = (15 << 18) | (4 << 8);
// Включаем PLL
RCC->CR |= RCC_CR_PLLON;
// Ждём готовности PLL
while (!(RCC->CR & RCC_CR_PLLRDY)) {};
// Увеличиваем латентность flash памяти до 2 циклов. Иначе будут очень интересные косяки.
FLASH->ACR = 0x12;
// Переключаемся на PLL
RCC->CFGR |= 2;
// Ждём, пока не переключимся на PLL
while ((RCC->CFGR & 0x0C) != 0x08) {};
// ГотовЕнько! Ядро тикает на частоте в 64МГц.
И если я правильно понял, шильд типа такого?
Спойлер

offtop: Это у меня глюки в браузера, что блок кода выгдлядит так, словно переносы строк пропали?
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Медленный вывод на STM32 8 битной шины (дисплей)
Так 64 у ТС и так есть.
- AlanDrakes
- Прорезались зубы
- Сообщения: 236
- Зарегистрирован: Пн июл 04, 2016 16:51:22
- Откуда: Россия, Омск
Re: Медленный вывод на STM32 8 битной шины (дисплей)
Я бы понял медленный вывод картинки на 8МГц, но на 64...
Впрочем, да, HAL и оптимизация - разные стороны программирования.
Помнится, на чипе с тактированием на 50МГц (совместимость с MII интерфейсом) экран 320*240 в 16 битной палитре заполняется... наверное, за 0.1с, либо даже быстрее. Там всё через DMA крутится и поверх FSMC. Была бы 16 битная шина - было бы ещё быстрее.
При 200МГц можно было набить 30 кадров в секунду. Но зачем?
Впрочем, да, HAL и оптимизация - разные стороны программирования.
Помнится, на чипе с тактированием на 50МГц (совместимость с MII интерфейсом) экран 320*240 в 16 битной палитре заполняется... наверное, за 0.1с, либо даже быстрее. Там всё через DMA крутится и поверх FSMC. Была бы 16 битная шина - было бы ещё быстрее.
При 200МГц можно было набить 30 кадров в секунду. Но зачем?
- Реклама
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Медленный вывод на STM32 8 битной шины (дисплей)
Да он даже через SPI заливается за 0.1 с, причем еще успевает этот кадр обсчитать по дороге. https://www.youtube.com/watch?v=afyTgpuA6scПомнится, на чипе с тактированием на 50МГц (совместимость с MII интерфейсом) экран 320*240 в 16 битной палитре заполняется... наверное, за 0.1с, либо даже быстрее.
Теоретический предел для F103 через SPI это что-то около 30 кадров в секунду.
Просто надо для контроллера программу писать, а не для ST-HAL'а.
Re: Медленный вывод на STM32 8 битной шины (дисплей)
COKPOWEHEU, видел ваше видео. Хочу такую же скорость, но увы, пока моих знаний не хватает чтобы так сделать...
Вы можете какой-то совет дать или дать посмотреть ваш код?
Я тут кстати, ещё до вашего видео, набросал вот такой код(уже понятно, что это далеко не максимум) . В котором думал померить максимальную скорость одображения, убрал расчеты, просто прогонка массива одного цвета сразу в порт и стробы. И не сказал бы что от этого чтото поменялось.
Я этот код понимаю так, он зацикливается на все разрешение экрана т.е. на 153 600 итераций, где с минимальными телодвижениями отправляет все в порт и стробит.
Вы можете какой-то совет дать или дать посмотреть ваш код?
Я тут кстати, ещё до вашего видео, набросал вот такой код(уже понятно, что это далеко не максимум) . В котором думал померить максимальную скорость одображения, убрал расчеты, просто прогонка массива одного цвета сразу в порт и стробы. И не сказал бы что от этого чтото поменялось.
Я этот код понимаю так, он зацикливается на все разрешение экрана т.е. на 153 600 итераций, где с минимальными телодвижениями отправляет все в порт и стробит.
Спойлер
Код: Выделить всё
// функция заливки экрана без вычислений, прямая передача данных из массива в дисплей
void TFT9488_FloodMassive(uint16_t *data, uint32_t lenght) {
uint16_t i, color;
uint8_t hi, lo;
TFT9488_CS_Active();
TFT9488_RS_Command();
TFT9488_Write8(0x2C);
TFT9488_RS_Data();
// Данные не берутся из переданных данных, то 2 строчки ниже это для отладки
lenght = 480 * 320;
color = YELLOW;
for (i = 0; i <= lenght; i++) {
// color = data[i];
hi = color >> 8;
lo = color;
//TFT9488_Port_Write(hi);
//Отправка первого бита
GPIOA->BSRR = ((GPIO_PIN_8 | GPIO_PIN_10 | GPIO_PIN_9) << 16)
| ((hi & 0b10000000) << 1) // 7 бит данных на 8 пин порт А
| ((hi & 0b00000100) << 8) // 2 бит данных на 10 пин порт А
| ((hi & 0b00000001) << 9); // 0 бит данных на 9 пин порт А
GPIOB->BSRR = ((GPIO_PIN_10 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_3)
<< 16) | ((hi & 0b01000000) << 4) // 6 бит данных на 10 пин порта В
| ((hi & 0b00100000) >> 1) // 5 бит данных на 4 пин порта В
| ((hi & 0b00010000) << 1) // 4 бит данных на 5 пин порта В
| (hi & 0b00001000); // 3 бит данных на 3 пин порт В
GPIOC->BSRR = (GPIO_PIN_7 << 16) | ((hi & 0b00000010) << 6); // 1 бит данных на 7 пин порта С
// СТРОБ НА порту WR
GPIOA->BSRR = GPIO_BSRR_BR1;
GPIOA->BSRR = GPIO_BSRR_BS1;
// TFT9488_Port_Write(lo);
// Отправка второго байта
GPIOA->BSRR = ((GPIO_PIN_8 | GPIO_PIN_10 | GPIO_PIN_9) << 16)
| ((lo & 0b10000000) << 1) // 7 бит данных на 8 пин порт А
| ((lo & 0b00000100) << 8) // 2 бит данных на 10 пин порт А
| ((lo & 0b00000001) << 9); // 0 бит данных на 9 пин порт А
GPIOB->BSRR = ((GPIO_PIN_10 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_3)
<< 16) | ((lo & 0b01000000) << 4) // 6 бит данных на 10 пин порта В
| ((lo & 0b00100000) >> 1) // 5 бит данных на 4 пин порта В
| ((lo & 0b00010000) << 1) // 4 бит данных на 5 пин порта В
| (lo & 0b00001000); // 3 бит данных на 3 пин порт В
GPIOC->BSRR = (GPIO_PIN_7 << 16) | ((lo & 0b00000010) << 6); // 1 бит данных на 7 пин порта С
// СТРОБ НА порту WR
GPIOA->BSRR = GPIO_BSRR_BR1;
GPIOA->BSRR = GPIO_BSRR_BS1;
}
TFT9488_CS_Idle();
}- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Медленный вывод на STM32 8 битной шины (дисплей)
The Rock, вы упорно игнорируете советы.
1. WR=0 надо делать той же командой, которой вы данные устанавливаете в порт.
2. Маску для порта B вычислять табличным способом.
3. Включить оптимизацию.
4. Для теста скорости все маски вообще заранее один раз можно вычислить.
64М/153 600 = 416 тактов на пиксел для одного кадра в секунду. Это овердофига. 10 fps на изи должно получиться.
1. WR=0 надо делать той же командой, которой вы данные устанавливаете в порт.
2. Маску для порта B вычислять табличным способом.
3. Включить оптимизацию.
4. Для теста скорости все маски вообще заранее один раз можно вычислить.
64М/153 600 = 416 тактов на пиксел для одного кадра в секунду. Это овердофига. 10 fps на изи должно получиться.
Re: Медленный вывод на STM32 8 битной шины (дисплей)
Не все...VladislavS писал(а):The Rock, вы упорно игнорируете советы.
У меня в коде написан WR=0 ;VladislavS писал(а):1. WR=0 надо делать той же командой, которой вы данные устанавливаете в порт.
Код: Выделить всё
GPIOA->BSRR = GPIO_BSRR_BR1;
GPIOA->BSRR = GPIO_BSRR_BS1;Update: Попробовал так "GPIOA->BSRR = GPIO_BSRR_BR1|GPIO_BSRR_BS1;" работает, но на скорость не повлияло
К сожалению, вообще не нашёл как это сделать (VladislavS писал(а):3. Включить оптимизацию.
Я пока ещё разбираюсь в том что там написано. Это пока вышка для меня, и я могу тот код взять только copy-paste и если не заработает, то я даже не смогу ничего сделать. Хочу писать то, в чем разбираюсь. Спасибо за название "табличный способ применения маски", хотя бы будет понятно что в гугле искатьVladislavS писал(а):2. Маску для порта B вычислять табличным способом.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Медленный вывод на STM32 8 битной шины (дисплей)
Я не знаю каким шрифтом уже наптсать, чтобы было понятно. Это надо сделать ТОЙ ЖЕ КОМАНДОЙ ЧТО И ЗАПИСЬ БАЙТА ДАННЫХ. У вас на каждый байт 5 записей в порт (3 на данные и 2 на строб). Можно сброс строба объединить с записью данных. Получите 4 записи в порт вместо 5 или -20%.У меня в коде написан WR=0;
Спойлер
Последний раз редактировалось VladislavS Вс мар 20, 2022 08:23:17, всего редактировалось 1 раз.
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Медленный вывод на STM32 8 битной шины (дисплей)
Да ладно, неужели я забыл исходник приложить! https://github.com/COKPOWEHEU/stm32f103 ... 1_models3DCOKPOWEHEU, видел ваше видео. Хочу такую же скорость, но увы, пока моих знаний не хватает чтобы так сделать...
Re: Медленный вывод на STM32 8 битной шины (дисплей)
[uquote="VladislavS",url="/forum/viewtopic.php?p=4200962#p4200962"]Это надо сделать ТОЙ ЖЕ КОМАНДОЙ ЧТО И ЗАПИСЬ БАЙТА ДАННЫХ. У вас на каждый байт 5 записей в порт (3 на данные и 2 на строб). Можно сброс строба объединить с записью данных. Получите 4 записи в порт вместо 5 или -20%.[/uquote]Предварительно человеку нужно объяснить, что такое "листинг" и где его включить/смотреть.
Без этого он не поймёт о каких "командах" речь.
Добавлено after 3 minutes 14 seconds:
[uquote="The Rock",url="/forum/viewtopic.php?p=4200959#p4200959"]
Без этого он не поймёт о каких "командах" речь.
Добавлено after 3 minutes 14 seconds:
[uquote="The Rock",url="/forum/viewtopic.php?p=4200959#p4200959"]
К сожалению, вообще не нашёл как это сделать ([/uquote]Включается в свойствах проекта вашего (неизвестного) компилятора. Результат смотрится в листинге. Код оптимизируется по результатам просмотра листинга.VladislavS писал(а):3. Включить оптимизацию.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Медленный вывод на STM32 8 битной шины (дисплей)
Там CubeIDE с GCC вестимо. У него с листингами неважно, мягко говоря.
А ведь я таблицу перекодировки даже без плюсов написал, а так руки чесались
А ведь я таблицу перекодировки даже без плюсов написал, а так руки чесались
Спойлер
Код: Выделить всё
template <typename T, size_t SIZE>
class ENCODE_TABLE
{
T table[SIZE]{};
public:
template <typename F>
constexpr ENCODE_TABLE(F f) { size_t i{}; for(auto& x:table) x=f(i++); }
constexpr auto operator()(const size_t n) const { return table[n]; }
constexpr auto& operator[](const size_t n) const { return table[n]; }
};Код: Выделить всё
constexpr ENCODE_TABLE<uint32_t,16> MaskB(
[](auto x)
{
return GPIO_BSRR_BR10
| GPIO_BSRR_BR5
| GPIO_BSRR_BR4
| GPIO_BSRR_BR3
| ((x&1)?GPIO_BSRR_BS3:0)
| ((x&2)?GPIO_BSRR_BS5:0)
| ((x&4)?GPIO_BSRR_BS4:0)
| ((x&8)?GPIO_BSRR_BS10:0);
});
Re: Медленный вывод на STM32 8 битной шины (дисплей)
Для теста скорости посчитал маски и перенес строб, согласно красной стрелочки) Спасибо вам, на самом деле в упор этого варианта не видел.VladislavS писал(а):4. Для теста скорости все маски вообще заранее один раз можно вычислить.
Можно ли сказать, что то что я получил на дисплее это максимальный результат обновления доступный в моей конфигурации когда дисплей подключен на 3х портах ?
Спойлер
Код: Выделить всё
for (i = 0; i <= lenght; i++) {
// Запись первого байта
GPIOA->BSRR = 0x700 << 16 | 0x20700 ;
GPIOB->BSRR = 0x438 << 16 | 0x438;
GPIOC->BSRR = 0x80 << 16 | 0x80;
GPIOA->BSRR = GPIO_BSRR_BS1;
//Запись второго байта
GPIOA->BSRR = 0x700 << 16 | 0x20100 ;
GPIOB->BSRR = 0x438 << 16 | 0x410;
GPIOC->BSRR = 0x80 << 16 | 0x0;
GPIOA->BSRR = GPIO_BSRR_BS1;
}COKPOWEHEU, я у вас в проекте увидел вот эти строчки
Спойлер
Код: Выделить всё
#if LCD_ORIENT_V
#define LCD_MAXX 239
#define LCD_MAXY 319- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Медленный вывод на STM32 8 битной шины (дисплей)
У меня дисплей на ili9341 - не тот, что у вас. Плюс подключен по SPI, а не по параллельной шине.COKPOWEHEU, я у вас в проекте увидел вот эти строчки
У вас на видео 320*240 крутится
Если же вопрос в том почему цифры на 1 меньше, то нумерация начинается с 0, а 319 и 239 это именно максимальные допустимые значения координат. Но на самом деле это оказалось неудобно, в другом проекте я, кажется, прописал именно 320 и 240.
Да. Но вы можете, например, сжать изображение. Скажем, кодировать 1 пиксель одним битом. Я так шрифт кодировал. Или использовать виртуальные пиксели по 2х2 или 3х3 реальных. Или рисовать векторную графику, то есть не по точкам, а по фигурам. Ну и естественно никто не отменял внешнюю память.Подскажите пожалуйста ещё, правильно ли я считаю. Что целый кадр не влезет в моих 128Кб памяти процессора ? Так как мой кадр весит аж 320 * 480 * 2 (байта) = 307 кБайт?
Думаю, нет. У вас во время обновления экрана контроллер только обновляет экран. Но вы, наверное, могли бы использовать DMA чтобы во время обновления экрана он делал что-то полезное - считал следующий кадр, например. Сама по себе скорость вывода от этого упадет, но в целом частота обновления увеличится.Можно ли сказать, что то что я получил на дисплее это максимальный результат обновления доступный в моей конфигурации когда дисплей подключен на 3х портах ?
Re: Медленный вывод на STM32 8 битной шины (дисплей)
Нет, мой вопрос связан с тем, что у вас все очень быстро обновляется. Но если там 320*240, то у меня экран 320*480 и у меня будет обновлять подольше чем ваш по SPI... и такой красоты я не получу.The Rock писал(а):Если же вопрос в том почему цифры на 1 меньше
Понял, спасибо. А я то думал почему у меня МК рушится когда я создавал массив на полный кадр)The Rock писал(а):Да. Но вы можете, например, сжать изображение.
Просто если у меня уже максимальный теоретический , то я бы относительно этой максималки сделал бы основную функцию вывода цвета. И пошел бы уже дальше узнавать новое и пилить свой проект )The Rock писал(а):Думаю, нет. У вас во время обновления экрана контроллер только обновляет экран.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Медленный вывод на STM32 8 битной шины (дисплей)
Ещё оптимизация -O3 и кварц запаять, чтобы 72 МГц получить.
Re: Медленный вывод на STM32 8 битной шины (дисплей)
кварц на работе завтра запаяю.
Оптимизация -О3 , по гуглу искал и примерно в том месте где должен быть выбор или вбивания этого параметра у меня отсутствует возможность редактирования (
Оптимизация -О3 , по гуглу искал и примерно в том месте где должен быть выбор или вбивания этого параметра у меня отсутствует возможность редактирования (
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Медленный вывод на STM32 8 битной шины (дисплей)
Сколько кадров, кстати, сейчас получается?
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Медленный вывод на STM32 8 битной шины (дисплей)
Да нет, запас по скорости там есть. Я намерил что-то около 11 кадров в секунду (там ведь еще математика), у вас площадь экрана ровно вдвое больше, значит 5 кадров в секунду получить можно. А теоретический предел 15 кадров в секунду. Для такого дисплея вполне приемлемо. Он ведь и сам не слишком быстрый.у меня экран 320*480 и у меня будет обновлять подольше чем ваш по SPI... и такой красоты я не получу.
С таким же дисплеем (320х240) я работал и на stm32l151 на частоте 32 МГц, заливка происходит незаметно для глаза. Заполнение текстом (с учетом декодирования) уже с "волнообразным" обновлением. https://youtu.be/QAGFZ8X6X8U
Значит, оно редактируется в другом месте. Пошарьте по интерфейсу настройки компилятора / линкера на тему оптимизацииОптимизация -О3 , по гуглу искал и примерно в том месте где должен быть выбор или вбивания этого параметра у меня отсутствует возможность редактирования (


