понедельник, 3 февраля 2014 г.

STM32 & ChibiOS/RT - Graphics

После того как мы запустили почти голую базовую конфигурацию ОС в предыдущей статье, можно пробовать подключить библиотеку. Так как подключать небольшие библиотеки по типу xprintf или FatFS не особо интересно в виду их небольшого размера и отлаженной работы (что не делает их менее полезными, скорее наоборот) то мы в нашем примере возьмём рыбу покрупней.
Как вы могли догадаться из заголовка это будет - графическая библиотека. А если быть совсем точнее то uGFX. Работы сразу предупреждаю сделано немало поэтому статья получилась большая, не в пример предыдущей.


Зачем это нужно?
Обычно, когда говорят про графику во встраиваемых решениях подразумевают сравнительно небольшое количество ч/б графики низкого разрешения с минимум (если не вообще без) анимации. Однако в виду того современные МК имеют достаточно мощности и дисплеи с большим разрешением как геометрическим так и цветовым стали обычным делом и с достаточно небольшой ценой, то вопрос графического интерфейса к современным встраиваемым системам стал очень острым.

Поэтому для решения этого вопроса иногда появляются либо велосипеды либо покупные решения. Причём как показывает практика в каждом конкретном случае то или иное решение имеет право на жизнь. Ваш покорный слуга, также не избежал попытки стать директором велосипедного завода:

Так вот, как я сам всегда говорил, что попытка делать всё самому - неблагодарное занятие, если конечно вы не автор FatFS. Но так как я среднестатистический обыватель то задумался, а нет ли открытого аналога больших систем, с возможностью быстрой интеграции в существующие системы.

Библиотека
И такой аналог нашёлся: во время изучения ChibiOS/RT, я наткнулся на пункт описания который говорил о загадочной библиотеке uGFX. Так как мне было интересно узнать, что это за библиотека, да и демонстрационная версия прошивки заработала на моей STM32F4-Discovery, то я решил изучить её подробнее.

uFGX, представляет собой высокомодульную библиотеку которая с одной стороны платформонезависима, а с другой стороны легко интегрируется с любой ОС РВ, в частности ChibiOS/RT. При этом представляет значительную абстракцию как для периферии (Экраны, устройства ввода, сенсорные панели), так и полный набор графических элементов для отображения.
Также библиотека содержит документацию из которой можно получить все необходимые знания для работы с ней.

Получение
Для того, чтобы работать с библиотекой как подсказывает КО нам нужна сама библиотека, а точнее её исходные коды. Которые можно получить пройдя по этой ссылке - http://ugfx.org/get-ugfx, т.к. библиотека у нас поставляется в виде гит архива то мы её устанавливаем в каталог расширений ChibiOS/RT - /ext:

git clone https://bitbucket.org/Tectu/ugfx ugfx

После этого у нас готовая к использованию библиотека.

Использование
Для того чтобы проверить собственно библиотеку, а точнее в основном её взаимодействие с дисплеем была выбрана демонстрационная программа neko.

За основу кода был взят демонстрационный проект /demos/ARMCM4-STM32F407-DISCOVERY, из которого был выкинут файл исходного кода (main.c), а также настройки для тестового потока.
Настройка для подключения uGFX полностью аналогична что описана по этой ссылке - http://ugfx.org/get-ugfx/11-documentation/37-get-ugfx-chibios
Однако есть и отличия, в частности драйвер дисплея о котором мы поговорим позднее.
Когда проект готов, осталось подключить вместо прежнего файла исходного кода аналогичный из http://kildall.apana.org.au/~cjb/stm32/chibios-neko.tar.bz2 - stmneko.c
Файл не подвергался изменениям, поэтому мы не будем его пока рассматривать. Также был взят файл содержащий битовые карты изображений - neko_bitmaps.h. Однако остальные части нашего проекта мы изучим подробней.

Конфигурация
Файлы конфигурации mcuconf.h, chconf.h и halconf.h остались без изменений. gfxconf.h был перенесён из того же проекта что и stmneko.c. На этом предварительная конфигурация была закончена, однако дисплей остался ещё не настроенным.

Дисплей
Основным отличием моего проекта от оригинального является дисплей, т.к. я не помнил где лежит у меня дисплей на аналогичном контроллере что и в оригинальном проекте, я решил действовать по обстоятельствам. Посмотрев в директории /ext/ugfx/drivers/gdisp/ я обнаружил знакомый контроллер дисплея - SSD1963 (я уже демонстрировал работу с ним в этой статье), однако изучение исходников дало то что драйвер под другой экран - 480х272, да и для другой ширины шины данных - 16 бит.
Поэтому было решено клонировать драйвер и адаптировать его для работы с нашей матрицей:
  1. в файле gdisp_lld_SSD1963.c изменена функция инициализации LLDSPEC bool_t gdisp_lld_init(GDisplay *g), была адаптирована к частотным характеристикам дисплеям, а также была выбран другой формат данных дисплея и ширины канала контроллера -
    write_reg(g, SSD1963_SET_PIXEL_DATA_INTERFACE, SSD1963_PDI_8BIT)
    write_reg(g, SSD1963_SET_PIXEL_FORMAT, 0x60);
  2. изменена функция вывода на дисплей слова данных цвета -

    LLDSPEC void gdisp_lld_write_color(GDisplay *g) {
                    color_t color = gdispColor2Native(g->p.color);
                    write_data(g, RED_OF(color));
                    write_data(g, GREEN_OF(color));
                    write_data(g, BLUE_OF(color));
    }

    Чтобы вывод соответствовал текущему режиму дисплея.
  3. шаблон настройки драйвера - board_SSD1963_template.h, был перенесён в рабочий каталог и переименован - board_SSD1963.h, в нём переделаны - функция инициализации, в частности ввод и вывод, инициализация вывода МК отвечающего за сброс. А также конфигурация дисплея - тактовые последовательности и длительность синхроимпульсов: static const LCD_Parameters DisplayTimings[].
После того как изменены файлы и добавлены драйвер и его конфигурация, самое время добавить их в Makefile. После чего можно приступать к сборке проекта.

Сборка
Сборка проекта происходит что называется в один клик, а точнее в одну команду:

nis@jane ~/stm32f407d_neko $ make
Compiler Options
....
Linking build/ch.elf
Creating build/ch.hex
Creating build/ch.bin
Creating build/ch.dmp
Done

После чего нам доступен для прошивки файл ch.bin. Как видно из вывода утилиты просмотра каталога видно что размер бинарного файла не такой уж и большой:

nis@jane ~/stm32f407d_neko $ ls -l build/
итого 568
-rwxr-xr-x 1 nis nis  15876 фев  3 22:17 ch.bin
-rw-r--r-- 1 nis nis  20886 фев  3 22:17 ch.dmp
-rwxr-xr-x 1 nis nis 340526 фев  3 22:17 ch.elf
-rw-r--r-- 1 nis nis  44688 фев  3 22:17 ch.hex
-rw-r--r-- 1 nis nis 184204 фев  3 22:17 ch.map
drwxr-xr-x 2 nis nis   4096 фев  3 22:17 lst
drwxr-xr-x 2 nis nis   4096 фев  3 22:17 obj

Прошивка
Прошивка выполняется ставшим уже для меня стандартом QSTLink2. Поэтому этот процесс я не буду описывать.

Выполнение
После прошивки, необходимо подключить питание и дисплей и можно наблюдать анимированного котёнка:





Для тех кому интересно прикладываю видео проекта:


Все исходные коды доступны в моём репозитории GitHubhttps://github.com/no111u3/stm32f4d_neko

Далее, скорей всего будут описаны и другие интересные проекты на базе данной связки - ChibiOS/RT + uFGX, а сейчас спешу откланяться.

Комментариев нет:

Отправить комментарий