Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Пт мар 18, 2022 19:45:05

Так на внешний кварц (он же есть на плате?) в настройках RCC переключите.

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Пт мар 18, 2022 20:10:31

Так на внешний кварц (он же есть на плате?) в настройках RCC переключите.


STM сэкономили и не распаяли там кварц)

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Сб мар 19, 2022 08:30:05

Ну хотя бы затактируйте PLL от HSI генератора.

Код:
   // 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МГц.

После этого можно вызвать SystemCoreClockUpdate() и убедиться в правильности считанной частоты в переменной SystemCoreClock.

И если я правильно понял, шильд типа такого?
СпойлерИзображение

С ним да, сложно. Пины развели так, что хочется им руки отбить за такое. Но на проводках работает. Либо на самодельной печатной плате, где шина разведена на FMC контроллер.

offtop: Это у меня глюки в браузера, что блок кода выгдлядит так, словно переносы строк пропали?

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Сб мар 19, 2022 12:13:14

Так 64 у ТС и так есть.

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Сб мар 19, 2022 13:05:18

Я бы понял медленный вывод картинки на 8МГц, но на 64...
Впрочем, да, HAL и оптимизация - разные стороны программирования.

Помнится, на чипе с тактированием на 50МГц (совместимость с MII интерфейсом) экран 320*240 в 16 битной палитре заполняется... наверное, за 0.1с, либо даже быстрее. Там всё через DMA крутится и поверх FSMC. Была бы 16 битная шина - было бы ещё быстрее.

При 200МГц можно было набить 30 кадров в секунду. Но зачем?

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Сб мар 19, 2022 15:59:51

Помнится, на чипе с тактированием на 50МГц (совместимость с MII интерфейсом) экран 320*240 в 16 битной палитре заполняется... наверное, за 0.1с, либо даже быстрее.

Да он даже через SPI заливается за 0.1 с, причем еще успевает этот кадр обсчитать по дороге. https://www.youtube.com/watch?v=afyTgpuA6sc
Теоретический предел для F103 через SPI это что-то около 30 кадров в секунду.
Просто надо для контроллера программу писать, а не для ST-HAL'а.

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Сб мар 19, 2022 20:50:38

COKPOWEHEU, видел ваше видео. Хочу такую же скорость, но увы, пока моих знаний не хватает чтобы так сделать...
Вы можете какой-то совет дать или дать посмотреть ваш код?

Я тут кстати, ещё до вашего видео, набросал вот такой код(уже понятно, что это далеко не максимум) . В котором думал померить максимальную скорость одображения, убрал расчеты, просто прогонка массива одного цвета сразу в порт и стробы. И не сказал бы что от этого чтото поменялось.

Я этот код понимаю так, он зацикливается на все разрешение экрана т.е. на 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();
}

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Сб мар 19, 2022 21:14:18

The Rock, вы упорно игнорируете советы.
1. WR=0 надо делать той же командой, которой вы данные устанавливаете в порт.
2. Маску для порта B вычислять табличным способом.
3. Включить оптимизацию.
4. Для теста скорости все маски вообще заранее один раз можно вычислить.

64М/153 600 = 416 тактов на пиксел для одного кадра в секунду. Это овердофига. 10 fps на изи должно получиться.

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Сб мар 19, 2022 21:57:47

VladislavS писал(а):The Rock, вы упорно игнорируете советы.

Не все...

VladislavS писал(а):1. WR=0 надо делать той же командой, которой вы данные устанавливаете в порт.

У меня в коде написан WR=0 ;
Код:
      GPIOA->BSRR = GPIO_BSRR_BR1;
      GPIOA->BSRR = GPIO_BSRR_BS1;

Попробую одной строчкой написать с одновременной записью в старшие 16 бит. Я думал что может так выйти, но не проверял.
Update: Попробовал так "GPIOA->BSRR = GPIO_BSRR_BR1|GPIO_BSRR_BS1;" работает, но на скорость не повлияло

VladislavS писал(а):3. Включить оптимизацию.

К сожалению, вообще не нашёл как это сделать (

VladislavS писал(а):2. Маску для порта B вычислять табличным способом.

Я пока ещё разбираюсь в том что там написано. Это пока вышка для меня, и я могу тот код взять только copy-paste и если не заработает, то я даже не смогу ничего сделать. Хочу писать то, в чем разбираюсь. Спасибо за название "табличный способ применения маски", хотя бы будет понятно что в гугле искать :)

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Сб мар 19, 2022 22:08:49

У меня в коде написан WR=0;
Я не знаю каким шрифтом уже наптсать, чтобы было понятно. Это надо сделать ТОЙ ЖЕ КОМАНДОЙ ЧТО И ЗАПИСЬ БАЙТА ДАННЫХ. У вас на каждый байт 5 записей в порт (3 на данные и 2 на строб). Можно сброс строба объединить с записью данных. Получите 4 записи в порт вместо 5 или -20%.

СпойлерИзображение
wr.png
(23.55 KiB) Скачиваний: 50
Последний раз редактировалось VladislavS Вс мар 20, 2022 08:23:17, всего редактировалось 1 раз.

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Сб мар 19, 2022 22:18:36

COKPOWEHEU, видел ваше видео. Хочу такую же скорость, но увы, пока моих знаний не хватает чтобы так сделать...

Да ладно, неужели я забыл исходник приложить! https://github.com/COKPOWEHEU/stm32f103 ... 1_models3D

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Вс мар 20, 2022 12:52:11

Это надо сделать ТОЙ ЖЕ КОМАНДОЙ ЧТО И ЗАПИСЬ БАЙТА ДАННЫХ. У вас на каждый байт 5 записей в порт (3 на данные и 2 на строб). Можно сброс строба объединить с записью данных. Получите 4 записи в порт вместо 5 или -20%.
Предварительно человеку нужно объяснить, что такое "листинг" и где его включить/смотреть. :)
Без этого он не поймёт о каких "командах" речь. :dont_know:

Добавлено after 3 minutes 14 seconds:
VladislavS писал(а):3. Включить оптимизацию.

К сожалению, вообще не нашёл как это сделать (
Включается в свойствах проекта вашего (неизвестного) компилятора. Результат смотрится в листинге. Код оптимизируется по результатам просмотра листинга.

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Вс мар 20, 2022 13:07:43

Там 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 битной шины (дисплей)

Вс мар 20, 2022 19:56:55

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;
   }
Подскажите пожалуйста ещё, правильно ли я считаю. Что целый кадр не влезет в моих 128Кб памяти процессора ? Так как мой кадр весит аж 320 * 480 * 2 (байта) = 307 кБайт?

COKPOWEHEU, я у вас в проекте увидел вот эти строчки
Спойлер
Код:
#if LCD_ORIENT_V
  #define LCD_MAXX 239
  #define LCD_MAXY 319
У вас на видео 320*240 крутится ?

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Вс мар 20, 2022 20:33:11

COKPOWEHEU, я у вас в проекте увидел вот эти строчки
У вас на видео 320*240 крутится

У меня дисплей на ili9341 - не тот, что у вас. Плюс подключен по SPI, а не по параллельной шине.
Если же вопрос в том почему цифры на 1 меньше, то нумерация начинается с 0, а 319 и 239 это именно максимальные допустимые значения координат. Но на самом деле это оказалось неудобно, в другом проекте я, кажется, прописал именно 320 и 240.
Подскажите пожалуйста ещё, правильно ли я считаю. Что целый кадр не влезет в моих 128Кб памяти процессора ? Так как мой кадр весит аж 320 * 480 * 2 (байта) = 307 кБайт?
Да. Но вы можете, например, сжать изображение. Скажем, кодировать 1 пиксель одним битом. Я так шрифт кодировал. Или использовать виртуальные пиксели по 2х2 или 3х3 реальных. Или рисовать векторную графику, то есть не по точкам, а по фигурам. Ну и естественно никто не отменял внешнюю память.
Можно ли сказать, что то что я получил на дисплее это максимальный результат обновления доступный в моей конфигурации когда дисплей подключен на 3х портах ?
Думаю, нет. У вас во время обновления экрана контроллер только обновляет экран. Но вы, наверное, могли бы использовать DMA чтобы во время обновления экрана он делал что-то полезное - считал следующий кадр, например. Сама по себе скорость вывода от этого упадет, но в целом частота обновления увеличится.

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Вс мар 20, 2022 20:43:57

The Rock писал(а):Если же вопрос в том почему цифры на 1 меньше
Нет, мой вопрос связан с тем, что у вас все очень быстро обновляется. Но если там 320*240, то у меня экран 320*480 и у меня будет обновлять подольше чем ваш по SPI... и такой красоты я не получу.
The Rock писал(а):Да. Но вы можете, например, сжать изображение.
Понял, спасибо. А я то думал почему у меня МК рушится когда я создавал массив на полный кадр)
The Rock писал(а):Думаю, нет. У вас во время обновления экрана контроллер только обновляет экран.
Просто если у меня уже максимальный теоретический , то я бы относительно этой максималки сделал бы основную функцию вывода цвета. И пошел бы уже дальше узнавать новое и пилить свой проект )

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Вс мар 20, 2022 21:38:14

Ещё оптимизация -O3 и кварц запаять, чтобы 72 МГц получить.

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Вс мар 20, 2022 21:39:29

кварц на работе завтра запаяю.
Оптимизация -О3 , по гуглу искал и примерно в том месте где должен быть выбор или вбивания этого параметра у меня отсутствует возможность редактирования (

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Вс мар 20, 2022 21:49:40

Сколько кадров, кстати, сейчас получается?

Re: Медленный вывод на STM32 8 битной шины (дисплей)

Вс мар 20, 2022 22:02:19

у меня экран 320*480 и у меня будет обновлять подольше чем ваш по SPI... и такой красоты я не получу.
Да нет, запас по скорости там есть. Я намерил что-то около 11 кадров в секунду (там ведь еще математика), у вас площадь экрана ровно вдвое больше, значит 5 кадров в секунду получить можно. А теоретический предел 15 кадров в секунду. Для такого дисплея вполне приемлемо. Он ведь и сам не слишком быстрый.
С таким же дисплеем (320х240) я работал и на stm32l151 на частоте 32 МГц, заливка происходит незаметно для глаза. Заполнение текстом (с учетом декодирования) уже с "волнообразным" обновлением. https://youtu.be/QAGFZ8X6X8U
Оптимизация -О3 , по гуглу искал и примерно в том месте где должен быть выбор или вбивания этого параметра у меня отсутствует возможность редактирования (

Значит, оно редактируется в другом месте. Пошарьте по интерфейсу настройки компилятора / линкера на тему оптимизации
Ответить