Как всегда, дело было вечером, делать было нечего. А тут ещё и настойчивые утверждения, что широко распространённые восьмибитки списывать рано. Типа им ещё жить и жить. Вот и захотелось посмотреть, какое у них там житие-бытие.
А тут ещё и ссыль на глаза попалась, про шилды для ардуинщиков. И называется это скромно так "графический акселератор".
http://andybrown.me.uk/2015/02/02/awcopper/
Жесть, для унылой ардуины прицепили ТФТ 640х360 который обслуживает... STM32F0! Вот это поворот! Это при том, что упомянутый на сайте STM32F030 дешевле чипа на ардуине. Ну да бог с ним. Ардуинисто жить не запретишь. Привлекло внимание другое. Чел, чтобы обслужить этот сравнительно жирный ТФТ, опустился до АСМа и оверклокинга. Сильно не вдавался в подробности этой лепнины, но из прочитанного по кривой диагонали понял, что АСМ и оверклокинг нужен для суперногодрыга.
Ну если оверклокинг и даёт прирост производительности, что благоприятно сказывается на всём, то увязание в болоте АСМа меня как-то совсем не прикололо.
Ну что же, попробуем сотворить что либо скромное и скоромное. И не будем, конечно, его называть "графический акселератор", из-за самой восьмибитной скромности. Скромным будет всё, абсолютно, даже желания. Мега девайсы на мега чипах решил не трогать. Там и так всё ясно и уныло. Пусть покоятся себе с миром. Из распространённых и по адекватной цене рассмотрим СТМ8 серии S и L. И попробуем подключить дешёвый ТФТ от мобилы, типа 240х320х16 бит цвета с восьмиразрядной шиной, типа Nokia N82.
Начнём с STM8L. Почему? Да на столе просто валялась. Ничем особо не примечательный восьмибитник. Ну там таймера которые вяжутся между собой, чуть-чуть ДМА, с одним полным каналом. STM8L151K6 с 32-я пинами, по цене дешевле Меги в местном ларе. Но можно взять и STM8L051F3 в 20-и ногом корпусе, для совсем уж мелких и дешёвых поделок. Там цена вообще супер гуманная, правда и ресурсов поскромнее.
Возьмём самую простую задачу, прицепить ТФТ по восьмибитной шине для вывода цифробуквенной информации. Цепляние ТФТ к МК обычное, без CS (CS тупо на земле), RD не юзаем, но TE (tearing) заводим, а вдруг пригодится.
Пишем простую функцию очистки экрана ногодрыгом, получаем время закраски ~200мС. Да, при такой скорости юзать ТЕ явно не понадобится.
Снижаем уровень хотелок до минимума и оптимизируем код не опускаясь до АСМа. Теперь у нас цвет хоть и остаётся номинально 16-и битным, но передаётся одним байтом с двойным дёрганьем WR, типа RED 0xE0E0. Получаем время закраски ~42мС. Уже лучше, но тиринг всё равно наблюдается, даже при задействованом TE.
Начинаем ковыряться в кишках STM8L. ДМА. Один канал позволяет связать GPIO с памятью через таймер. Учитывая латентность ДМА (три такта) при таком трансфере получим 5,333333 мегасемплов, что, в общем, уже неплохо.
Считаем. 5333333 / 153600 = 34,72 кадра/сек. Или 28,8мС по времени закраски экрана. Уже не плохо. Итого - один канал (полный, единственный, к сожалению) ДМА и пара таймеров. Расточительно немного, особенно для STM8L051F3, но в принципе можно.
Ещё WR можно просто дёргать таймером. Максимальная частота - 8МГц при 16МГц тактовой. Считаем. 8000000 / 153600 = 52,08 кадра/сек. Или - 19,2мС на закраску. Итого - два таймера, и всё! Пнули один таймер, он задаёт фактически количество импульсов WR, он запустил второй таймер, который и дёргает WR. Всё крутится и всё чудесно! Можем 19,2мС, при желании, заниматься своими делами. Задействуем ТЕ, тиринг не наблюдается, всё чудесно!
Возьмём пару штифтов, один 16X24, другой 32Х50 (типа CRYSTAL). Шаманим функции с увеличением по горизонтали и вертикали. С двойным ногодрыгом на 32Х50 и увеличением по вертикали Х2 при выводе строки типа "0234567" (практически на всю ширину) получаем время вывода ~60мС. На двух таймерах - ~51мС. Что и понятно, здесь уже больше вычислений, чем работы с портом (вот здесь оверклокинг уже бы помог). Но если 17% таки важны, то вариант на два таймера выручит. Визуально в обоих случаях тиринг не наблюдается, а скорость вывода вполне приемлема и на глаз отрисовка практически не заметна. Т.е. для простых и дешёвых применений без вывода графики вполне себе даже ничего.
Для STM8L051F3 - вполне годится, с учётом малого размера флэша, которого может не хватить на шрифты-хотелки, и меньшего количества таймеров изначально.
Для STM8S003F3/103F3/903F3 - не взлетит, порты растянуты угрёбищно.
Для STM8S903K3 - с учётом малого размера флэша и малого количества таймеров, ограниченно, но пойдёт.
Для STM8S103K3/105 и др. - в принципе пойдёт, с различными ограничениями. Основное - у них таймера не вяжутся как у STM8L и STM8S903. Придётся пару пинов таймеров соединить вручную.
Для STM32F - без проблем, только от хотелок и желаемой скорости, в пределах разумного (не каждый ТФТ одолеет 24МГц тактовой).
Для ТФТ с 16-и битной шиной всё аналогично. Главное чтобы хватило свободных портов и нашлось пару таймеров.
Вывод: при ограничениях и напрягах юзать восьмибитки типа СТМ8 в связке с простыми ТФТ ещё как-то можно, если не предъявлять особых требований. Но ИМХО всё уже это на грани фола.
С мегами и и младшими пиками всё намного хуже и юзать их с ТФТ разве что только от полной безнадёги.