Top.Mail.Ru

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

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

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

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

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

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

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

Давайте разбираться как с помощью этой программы конвертировать изображение в нужный нам вид. А довольно-таки просто. Заходим в меню 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)
	{
	}
}


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

И вот, в принципе, все готово. Заливаем программу в контроллер и получаем результат:

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

В дальнейшем думаю еще что-нибудь замутим с STM32 и дисплеем, что-то мне понравилось это дело )

Подписаться
Уведомить о
guest

21 комментариев
Старые
Новые
Межтекстовые Отзывы
Посмотреть все комментарии
Леван
Леван
10 лет назад

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

decoysmile
decoysmile
10 лет назад

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

Yura
Yura
10 лет назад

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

pooh
pooh
10 лет назад

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

pooh
pooh
Ответ на комментарий  Aveal
10 лет назад

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

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

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

Алексей
Алексей
Ответ на комментарий  Aveal
10 лет назад

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

ATH
ATH
10 лет назад

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

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

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

Ratar
Ratar
8 лет назад

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

Haamu
Haamu
8 лет назад

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

Haamu
Haamu
8 лет назад

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

Паринов
Паринов
1 год назад

Жду продолжения на stm32 black pill, желательно супер подробно

21
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x