Top.Mail.Ru

Часть 8. STM32 и С++. Библиотеки Print и GFX_TFT.

Данная статья немного выбивается из темы, но я опишу немного эти библиотеки. Это один из моих первых опытов переделки Ардуиновских библиотек. Всё будет кратенько, так как описывать, что я сделал, ресурсов не хватит. Да и не нужно это.

Если кто-то пробовал писать для Ардуино, могли заметить, что в программном ядре существует класс Print. Этот класс используется как в каждой дырке затычка. Нужно в UART вывести информацию, пишем Serial.print("Hello word"). Нужно на дисплей вывести информацию, пишем tft.print("Hello Word"). По-моему удобно. И я решил, что было бы неплохо тоже иметь такую же возможность. И поэтому я взялся за этот класс - там было довольно всё просто. Убрал упоминание про AVR, поставил упоминание про STM. Убрал классы работающие со строками, посчитал их лишними и не пожалел ни разу. Так как переделки незначительны, приводить их примеры не имеет смысла. Можете сами взять исходный класс от AVR в каталоге WorkDevel\Developer\Source и сравнить с тем, что лежит в библиотеке для STM.

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

Библиотека Adafruit_GFX. Эта библиотека является основной библиотекой для работы с графическими примитивами, она обеспечивает все основные потребности в них. Она не является панацеей абсолютно для всех типов дисплеев, но работает со многими. Правда библиотека не содержит кода инициализации конкретных дисплеев. Это нужно делать уже самому, что будет позже показано на нескольких дисплеях.

Библиотека построена так, что часть её функций можно перекрыть (извините за терминологию, я в этом плохо ориентируюсь) из своего драйвера графического дисплея. Самыми критичными функциями для любого дисплея являются:

  • Способ вывода и интерфейс дисплея.
  • Рисование одной точки.
  • Поддержка дисплеем вывода в заранее заданное окно.
  • Способ поворота экрана.

Например, для контроллера дисплея ILI9341 необходимо самому написать функции:

virtual void fillScreen(uint16_t Color);
void setWindow(uint16_t sx,uint16_t sy,uint16_t width,uint16_t height);
virtual void  drawPixel(uint16_t x, uint16_t y, uint16_t color);
virtual void  setRotation(uint8_t x);

Ну и соответственно инициализация дисплея и протокол обмена с дисплеем. Протокол может быть любой - SPI, FSMC, I2C, 8bit параллельный, 16bit параллельный и так далее. Это всё зависит от типа дисплея и контроллера, который на нём стоит.

Что сделано мной, в этой библиотеке? Ну, во-первых, я её переименовал в GFX_TFT. Убрал некоторые упоминания об AVR и иже с ними. Добавил кириллицу в файл основного фонта. Добавил перекодировку UTF-8 в ASCII, и вот с этим есть проблемы. Если вы не знаете как CubeIDE переключить с UTF-8 на Win1251, всё, что вы попытаетесь вывести на экран на кириллице, будет иметь два знакоместа. Код, добавленный мною, правит эту ситуацию, но перестаёт правильно работать функция strlen() и sizeof(), они начинают давать удвоенный результат. Например strlen("Привет мир") вернёт размер равный 19, что неверно. Пока не придумал как с этим бороться...

Я думаю далее самое простое будет показать, как UART работает с классом Print. Пока всё. Как всегда каталог с проектом на Яндекс диске и WorkDevel. Примеров пока не будет, не на чем показывать.

Подписаться
Уведомление о
guest
0 комментариев
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x