Итак, вчера я намудрил с порядком заполнения буферов для DMA, а сегодня этот косяк исправил:
Такой приличный шрифт я стащил отсюда. Сверху и снизу зачем-то оставлено по 2 пикселя пустого пространства. Для цифр я попробовал модифицировать этот шрифт. Но дизайнер из меня откровенно паршивый:
Как обычно, код лежит на гитхабе. Провозился достаточно долго еще и из-за кривого SPI у STM32F103: ну кто бы мог додуматься, что даже в режиме Tx-only мастера необходимо указывать, что нога SS (которой нет) управляется софтово! Хорошо, на "казусе" народ помог. Правда, насколько я понял, они тоже вообще не в состоянии объяснить, на кой черт так сделано и просто методом тыка нашли решение. Почему-то пауза в 10мс, которую я установил перед обновлением очередной четверти экрана, оказалась очень маленькой (хотя по моим рассчетам на полный цикл уходило бы порядка 40-45мс, т.е. получаться должно было бы 25Гц, но мерцало так, как будто бы герц 5..10). Снизил паузу до 3мс - полет нормальный. С другой стороны, можно вообще непрерывно передавать данные: ведь передача ведется по сути аппаратно: при помощи DMA. Частоту SPI установил как clk/16 (т.е. 4.5МГц). Фронты на осциллограмме были жутчайшие, но работает-таки! Выше поднимать частоту на работающем экране не пробовал. Без него, пока эмулировал без нагрузки, начал с clk/4 — осциллограммы были настолько страшными, что явно бы оно работать не стало! Хочется уже для дома осциллограф купить, да жаба жмет. Взял с жены обещание, что если будет шабашка на полмиллиона и больше, то обязательно хороший осциллограф тысяч за 100 себе прикуплю! Этот дешевенький с работы хорош лишь большим экраном, но глюков у него... Я измучился, пока нормально настроил синхронизацию. Да и входное сопротивление и емкость высоковаты (или щупы - дерьмо), возможно, у меня такие кривые осциллограммы и были лишь по вине осциллографа (хотя, китайцы - те еще рукожопы, может и "синяя таблетка" вносит-таки свое). Экран в полностью включенном состоянии (несмотря на ШИМ 1/4) потребляет очень прилично. Восстановленный компьютерный БП (на китайские 250Вт) без вентилятора (т.к. обычно я его от силы на 20-30Вт нагружаю) решил, что для него эти ~5А — слишком много! И буквально через 10..15 секунд после попыток зажечь весь экран напруга на выходе БП падает до 2..2.5В, а на выходе 12В вообще нуль появляется! Возможно, конечно, просто БП уже полумертвый.
Да, после всех игр с экраном мне стало интересно: а насколько часто я могу его содержимое обновлять, чтобы на видео не было "размазни"? Сделал дополнительный режим - отсчет долей секунд. С миллисекундами сразу стало понятно, что последние 2 цифры - какая-то мешанина. ОК, пробуем сотые доли секунды. Если нажимать периодически паузу, видно, что кривовато оно отображается. В принципе, это и логично: на 25..30Гц, что обеспечивает "видеокамера" лопаты, сотые очень тяжко зафиксировать... Ну, зато на десятых все ОК.
Бегущие строки не реализовывал: в данной шабашке это не нужно. Но в принципе, ничего там сложного нет: просто добавляем еще один КА, который каждые N миллисекунд будет заново перерисовывать сохраненный буфер с текстом в новую позицию: --X,Y. Паузу в конце можно реализовать достаточно просто: всего-то добавить к полной ширине строки десяток-другой пикселей, чтобы строчка после полного вывода еще немножко смещалась. На многих светодиодных панелях я видел именно такую реализацию. Ну либо в конечный автомат добавить еще одно состояние...
Автоматное программирование — это супер! Если вдруг возникнет момент, когда мне вообще будет нечего делать, можно попробовать для бесполезной 1-wire сделать полный цикл работы на чистом КА (понятно, что протокол - на DMA с таймером или UART'ом).