STM32 и FSMC. Часть 2. Вывод изображения на дисплей.

Совсем недавно мы познакомились с работой FSMC в STM32, подключили дисплей и раскрасили его разными цветами (вот). И пока еще не забыли все, что обсуждали в прошлой статье, давайте выведем на дисплей, что-нибудь поинтереснее, а именно какую-нибудь картинку.

Что же нам для этого понадобится?

Ну во-первых сама картинка. Находим какое-нибудь изображение размером 320*240. Я секунд за 20 нагуглил подходящую картинку — кадр из фильма Железный Человек, реклама которого, кстати, последние пару недель находится абсолютно везде что в интернете, что на улице 🙂

Итак, мы подготовили то, что надо загрузить в память дисплея. Необходимо как-то преобразовать готовую картинку в массив чисел, соответствующих каждому отдельному пикселю. Но для начала конвертируем наш файл в формат bmp, это нам понадобится для дальнейших махинаций. Для того, чтобы получить необходимые данные из bmp файла воспользуемся отличнейшей утилитой от Segger под названием Segger Bitmap Converter. Дружно скачиваем ее, устанавливаем и запускаем.

Запуск программы

Давайте разбираться как с помощью этой программы конвертировать изображение в RGB формат (назовем его так). А довольно-таки просто. Заходим в меню File->Open и первым делом загрузим нашу картинку. Кстати, ее необходимо еще повернуть на 90 градусов, чтобы она легла на дисплей как надо. Получаем вот что:

Изображение для конвертирования

В меню Image видим интересный пункт Convert To… Но я, честно говоря, не понял практического смысла этой кнопки, поскольку даже при адском тыкании на разные выходные форматы ничего так и не произошло 🙂 Поэтому идем снова в меню File и жмем на Save As. В появившемся диалоговом окне задаем имя файла, а в поле тип файла выбираем ”C” bitmap file:

Сохраняем результат

Появляется еще одно окно и вот тут то уже мы можем выбрать требуемый формат. Выбираем High Color (565), red and blue swapped и, нажав ОК, получаем готовый .с файл с сохраненным массивом данных для нашего изображения.

Формат файла в Segger Bitmap Converter

Далее я последовал следующий путем. В проект из предыдущей статьи (ссылка была в начале) я добавил еще один файл fsmc.h, в котором объявил массив и просто скопировал в него значения, которые выдала утилита Segger Bitmap Converter. Получилось вот что:

/***************************************************************************************/
const unsigned short picture[] = 
{
	0x0021, 0x0021, 0x0021, 0x0021, 0x0042, 0x0042, 0x0042, 0x0042, 0x0063, 0x0063, 0x0063, 0x0063,
	0x0084, 0x0084, 0x0084, 0x0084, 0x0085, 0x00A5, 0x00A5, 0x00C5, 0x00C6, 0x00C6, 0x00E6, 0x00E7,
	0x00E7, 0x0107, 0x0108, 0x0108, 0x0128, 0x0128, 0x0129, 0x0129, 0x0149, 0x0149, 0x0149, 0x0149,
	0x014A, 0x014A, 0x014A, 0x014A, 0x014A, 0x014A, 0x014A, 0x014A, 0x014B, 0x016B, 0x014B, 0x014B,
	0x014B, 0x014B, 0x012B, 0x010A, 0x00E9, 0x00E9, 0x00C9, 0x00A8, 0x00A9, 0x00A8, 0x00A8, 0x00A8,
	0x00A8, 0x00A8, 0x00C9, 0x00C9, 0x00EA, 0x00EA, 0x012B, 0x014B, 0x014C, 0x016C, 0x016C, 0x014B,
	0x012B, 0x010B, 0x010A, 0x010A, 0x010A, 0x010B, 0x014B, 0x016C, 0x018C, 0x016C, 0x016C, 0x018C,
	0x018C, 0x018C, 0x016B, 0x016B, 0x016B, 0x016C, 0x018C, 0x016C, 0x014B, 0x010B, 0x010B, 0x010B,
	0x012B, 0x012B, 0x012B, 0x012B, 0x012B, 0x010A, 0x010A, 0x012B, 0x00EA, 0x010A, 0x00C8, 0x00A8,
	0x0108, 0x00E8, 0x0149, 0x224D, 0x094A, 0x0108, 0x096A, 0x098A, 0x0129, 0x0129, 0x0109, 0x0129,
	0x0108, 0x00E8, 0x00E8, 0x00E8, 0x00E8, 0x0108, 0x0109, 0x0108, 0x0108, 0x00E8, 0x00E7, 0x00E8,
	0x00E8, 0x0108, 0x00E8, 0x00C7, 0x00E8, 0x00E8, 0x00E8, 0x00E8, 0x00E8, 0x00E8, 0x00E8, 0x00E8,
	0x0108, 0x0108, 0x0108, 0x0108, 0x0129, 0x0129, 0x0149, 0x0149, 0x0149, 0x0149, 0x016A, 0x016A,
	0x016A, 0x016A, 0x016A, 0x016A, 0x018A, 0x018A, 0x018A, 0x018B, 0x018B, 0x01AB, 0x01AB, 0x01AB,
	0x01AB, 0x01AB, 0x01CB, 0x01CB, 0x01CB, 0x01CB, 0x01CB, 0x01EC, 0x01CC, 0x01CC, 0x01EC, 0x01EC,
	0x01EC, 0x01EC, 0x01EC, 0x01EC, 0x01EC, 0x01EC, 0x01EC, 0x01EC, 0x01EC, 0x01EC, 0x01EC, 0x01EC,
	0x01ED, 0x01ED, 0x01ED, 0x01ED, 0x01ED, 0x020D, 0x020D, 0x020D, 0x020D, 0x020D, 0x020D, 0x020D,
	0x020D, 0x022D, 0x022D, 0x022D, 0x022D, 0x022D, 0x022D
	...и дальше еще море различных значений...
	
	
/***************************************************************************************/

Теперь еще пара небольших правок в функции main():

/***************************************************************************************/
int main()
{
	int i;

	initAll();
	initLCD();

	// Начальный и конечный адреса по горизонтали
	writeLCDCommand(0x0050, 0);
	writeLCDCommand(0x0051, 239);
	
	// Начальный и конечный адреса по вертикали
	writeLCDCommand(0x0052, 0);
	writeLCDCommand(0x0053, 319);

	writeLCDCommand(32, 0);
	writeLCDCommand(33, 0);
	*(uint16_t *) (LCD_REG) = 34;

	for (i = 0; i < 76800; i++)
	{
		writeLCDData(picture[i]);
	}
	delay(0x0FFFFF); 

	while(1)
	{
		__NOP();
	}
}


/***************************************************************************************/

И вот, в принципе, все готово! Мучительно ожидаем, пока программа наконец-то зальется в микроконтроллер, и на дисплее появится картинка!

Вывод изображения на дисплей при помощи STM32.

Вот таким образом мы сумели залить в память дисплея обычное изображение. В дальнейшем думаю еще что-нибудь замутим с STM32 и дисплеем, что-то мне понравилось это дело 🙂

Поделиться!

Подписаться
Уведомление о
guest
20 Комментарий
старее
новее большинство голосов
Inline Feedbacks
View all comments
Леван
Леван
7 лет назад

Интересно было бы сделать что то вроде работы с сенсорным экраном, сделать такую же картинку, только с цифрами и снимать по АЦП значения… Я хочу так сделать, только ко мне еще идет из Китая посылка с таким же контроллером.

decoysmile
decoysmile
7 лет назад

Здраствуйте
на вашей отладочной плате вижу выход VGA..?
ничего не пробовали мутить с ним..
мне нужна помощь
делаю проект на STM32f100vldiscovery
проект скопирован с http://www.artekit.eu/vga-output-using-a-36-pin-stm32/
делаю все как там написано!!
но вот подключаю к монитору а он ничего не выводит..
в чем может быть проблема??

Yura
Yura
7 лет назад

А если менять картинки, даже к примеру просто цвета. насколько скорость высока?Не раздражает ли и не приходится ли ждать как одна картинка менят другую?

pooh
pooh
7 лет назад

А почему массив объявляете в заголовочном файле? Вроде это не есть гуд?

pooh
pooh
Reply to  Aveal
7 лет назад

Заголовочный файл подразумевает использование его в разных модулях/программах. Объявление или определение массива в нём часто приводит к излишнему расходу памяти.

Алексей
Алексей
7 лет назад

Скажите пожалуйста, а что за контроллер в вашем дисплее? Просто у меня отладочная плата с дисплеем на контроллере SSD1289, и я никак не могу вывести на него картинку.

Алексей
Алексей
Reply to  Aveal
7 лет назад

Ясно, спасибо.

ATH
ATH
6 лет назад

У вас кеил какой? У меня ограничение на 30 кб и не получается выводить картинку польностью((

Евгений
Евгений
6 лет назад

Добрый вечер. Вопрос немного не в тему, но близко. У меня stm32f429discovery. Надо выводить текст на экран. Возникла проблема с размером шрифта. Максимальный – 16х24. Нужно высотой 80. Есть ли информация где можно скачать или преобразовать. У segger есть конвертер шрифтов, но сюда он не подходит. И еще вопрос как развернуть экран на 90 градусов

Ratar
Ratar
5 лет назад

А есть возможность сохранять картинку на карту?
Я не нашел библиотеки для того чтобы преобразовать изображения с камеры в JPEG

Haamu
Haamu
4 лет назад

А обязательно данные только в один регистр писать надо или может возможно указать начальный адрес в памяти дисплея и скопировать туда данные через memcpy()?

Haamu
Haamu
4 лет назад

Так в том то и прелесть FSMC, что память устройства, подключенного к нему, интегрируется в адресное пространство контроллера. По крайней мере с внешней SRAM так, с другими устройствами по FSMC небыло случая поработать. Вопрос в том, куда именно в памяти дисплея данные надо писать, в определенный регистр или какой-то буфер есть, куда можно сразу много данных залить?

Присоединяйтесь!

Profile Profile Profile Profile Profile
Vkontakte
Twitter

Язык сайта

Октябрь 2020
Пн Вт Ср Чт Пт Сб Вс
 1234
567891011
12131415161718
19202122232425
262728293031  

© 2013-2020 MicroTechnics.ru