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

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Так на внешний кварц (он же есть на плате?) в настройках RCC переключите.
Реклама
The Rock
Открыл глаза
Сообщения: 46
Зарегистрирован: Вт июн 05, 2012 23:32:13

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

Сообщение The Rock »

[uquote="VladislavS",url="/forum/viewtopic.php?p=4200510#p4200510"]Так на внешний кварц (он же есть на плате?) в настройках RCC переключите.[/uquote]

STM сэкономили и не распаяли там кварц)
Реклама
Аватара пользователя
AlanDrakes
Прорезались зубы
Сообщения: 236
Зарегистрирован: Пн июл 04, 2016 16:51:22
Откуда: Россия, Омск

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

Сообщение AlanDrakes »

Ну хотя бы затактируйте 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: Это у меня глюки в браузера, что блок кода выгдлядит так, словно переносы строк пропали?
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Так 64 у ТС и так есть.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
AlanDrakes
Прорезались зубы
Сообщения: 236
Зарегистрирован: Пн июл 04, 2016 16:51:22
Откуда: Россия, Омск

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

Сообщение AlanDrakes »

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

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

При 200МГц можно было набить 30 кадров в секунду. Но зачем?
Реклама
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Помнится, на чипе с тактированием на 50МГц (совместимость с MII интерфейсом) экран 320*240 в 16 битной палитре заполняется... наверное, за 0.1с, либо даже быстрее.
Да он даже через SPI заливается за 0.1 с, причем еще успевает этот кадр обсчитать по дороге. https://www.youtube.com/watch?v=afyTgpuA6sc
Теоретический предел для F103 через SPI это что-то около 30 кадров в секунду.
Просто надо для контроллера программу писать, а не для ST-HAL'а.
Реклама
The Rock
Открыл глаза
Сообщения: 46
Зарегистрирован: Вт июн 05, 2012 23:32:13

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

Сообщение The Rock »

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();
}
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

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

64М/153 600 = 416 тактов на пиксел для одного кадра в секунду. Это овердофига. 10 fps на изи должно получиться.
The Rock
Открыл глаза
Сообщения: 46
Зарегистрирован: Вт июн 05, 2012 23:32:13

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

Сообщение The Rock »

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 и если не заработает, то я даже не смогу ничего сделать. Хочу писать то, в чем разбираюсь. Спасибо за название "табличный способ применения маски", хотя бы будет понятно что в гугле искать :)
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

У меня в коде написан WR=0;
Я не знаю каким шрифтом уже наптсать, чтобы было понятно. Это надо сделать ТОЙ ЖЕ КОМАНДОЙ ЧТО И ЗАПИСЬ БАЙТА ДАННЫХ. У вас на каждый байт 5 записей в порт (3 на данные и 2 на строб). Можно сброс строба объединить с записью данных. Получите 4 записи в порт вместо 5 или -20%.
СпойлерИзображение
wr.png
(23.55 КБ) 171 скачивание
Последний раз редактировалось VladislavS Вс мар 20, 2022 08:23:17, всего редактировалось 1 раз.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

COKPOWEHEU, видел ваше видео. Хочу такую же скорость, но увы, пока моих знаний не хватает чтобы так сделать...
Да ладно, неужели я забыл исходник приложить! https://github.com/COKPOWEHEU/stm32f103 ... 1_models3D
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

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

Добавлено after 3 minutes 14 seconds:
[uquote="The Rock",url="/forum/viewtopic.php?p=4200959#p4200959"]
VladislavS писал(а):3. Включить оптимизацию.
К сожалению, вообще не нашёл как это сделать ([/uquote]Включается в свойствах проекта вашего (неизвестного) компилятора. Результат смотрится в листинге. Код оптимизируется по результатам просмотра листинга.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Там 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);
  });
The Rock
Открыл глаза
Сообщения: 46
Зарегистрирован: Вт июн 05, 2012 23:32:13

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

Сообщение The Rock »

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 крутится ?
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

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

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

Сообщение The Rock »

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

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

Сообщение VladislavS »

Ещё оптимизация -O3 и кварц запаять, чтобы 72 МГц получить.
The Rock
Открыл глаза
Сообщения: 46
Зарегистрирован: Вт июн 05, 2012 23:32:13

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

Сообщение The Rock »

кварц на работе завтра запаяю.
Оптимизация -О3 , по гуглу искал и примерно в том месте где должен быть выбор или вбивания этого параметра у меня отсутствует возможность редактирования (
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Сколько кадров, кстати, сейчас получается?
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

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

Вернуться в «ARM»