All streams
Search
Write a publication
Pull to refresh

Comments 16

появилась шальная мысль, установить кварц на 24 МГц разогнать SYSCLK до 96 МГц (очень близко к пределу в 100 МГц).

Вероятно, вполне годное решение. Я когда-то пробовал разгонять пожилые(~2012 года) stm32f407 - для на коленке сбацанного рефлектометра. Разгон (при питании 3.3v) с 168 до ~210 два имевшихся экземпляра переживали абсолютно безболезненно, при разгоне >~230 начинала забавно отваливаться периферия - таймеры, FSMC, DMA с их логикой и триггерами.

Вероятно, вполне годное решение

На подобные слова я и рассчитывал, когда писал это).

Я слышал о проблемах с таймингами при доступе к памяти (как RAM, так и Flash) и видел на работе как периферия начинает чудить при повышении частот (но один опытный человек быстро привел всё в норму), а могла даже не запускаться. Это настораживает, но я попробую разогнаться когда у меня появится кварц в 24 МГц (текущие 8 считаю не очень надёжными).
Где-то в районе написания части 0, я, интереса ради, пробовал установить SYSCLK в 96 МГц, но они выводились из максимально неудобных 25 МГц или от внутреннего источника. В итоге контроллер не всегда проходил инициализацию :D

Если полученные тайминги действительно следствие оверхеда прерываний (а не, например, приоритета), то надо повышать производительность в 1.5-2 раза, т.к. оптимизировать бесконечно у меня не выйдет, единственным выходом остаётся повышение частот. Где-то в даташите должны быть описаны тонкости при повышении частот.

на коленке сбацанного рефлектометра

Это та штука, которая подключается к спутниковой тарелке чтобы найти спутник?

Это та штука, которая подключается к спутниковой тарелке чтобы найти спутник?

Не. это та штука, которая измеряет длину, например, витой пары и показывает неоднородности (скрутки, повреждения), если они есть.

Не знал что они так называются, я перепутал с простым спектроанализатором. Слышал о таких в контексте оптоволокна, в основном.

Не проще просто взять H7 на 480мгц и не мучаться? По человеко часам это будет точно дешевле

Не то что бы я мучался, проект идёт не торопясь, в свободное от работы время, и в своё удовольствие)
Причина, по которой я взял F411RE проста - она лежала у меня в ящике. Не было уверенности что получится продвинуться хоть сколько-нибудь, поэтому покупать навороченную плату было бы пустой тратой денег. Я думаю, что если единственной задачей будет только то что описано в статье (без RTOS, без остальной логики), то даже F103 может оказаться достаточно (в теории), а они стоят дешевле пачки семечек на Aliexpress и, тем более, Arduino Nano (до сих пор удивляет что они не вытеснили их).

Не проще просто взять H7 на 480мгц и не мучаться?

Взять более мощный процессор проще и я согласен что это упростит работу, но не факт что это целесообразно по финансовым затратам. Да, для более-менее человеческой разработки надо брать Nucleo-H753ZI/Nucleo-H563ZI или что-то около: на борту будет ETH (который в будущем может пригодиться), да и возможностей для подключения периферии раза в 2 больше (наделаем модулей расширения, работающих по CAN). Во всех отношениях лучше чем моя Nulcleo-411RE.
Мне ещё понравилась плата на H750: сразу есть слот для SD карты (скорее всего SDIO, что большой плюс) и небольшой дисплей (как подключён - неизвестно), но, по беглому взгляду, часть контактов не вывели на плате.

Пока программа умещается в ресурсы F411, разработке логики это не мешает. Есть нюансы, но их тоже можно попытаться преодолеть с помощью оптимизации и более разумных решений (пока что всё тяп-ляп, но и это прототип) - дабы не спрятать за производительным железом плохо написанный софт. Однако, если то, что показывает анализатор, действительно предел F411, а не недочёты софта (всё таки маленький тестовый паттерн давал ожидаемые тайминги, а значит дело может быть в подготовке паттерна), то очень скоро я перейду на что-то посерьёзнее (H5 или H7), тем более что проект набирает обороты и теперь уже начинает казаться возможным к завершению.

Если F4 окажется хотя бы минимально жизнеспособна для запуска релизного проекта, то это окажется не таким уж высоким требованием, а лишние деньги можно будет вложить в хорошие шаговые двигатели и драйверы к ним.

Интересная статья, жду продолжения!

По скорости F103-то может и справится. Но вам в перспективе желательно иметь объëм ОЗУ, достаточный для хранения хотя-бы одной страницы, пока она печатается. А 128кБ у F411 - это всего лишь 1024х1024 бит.

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

Если я собираюсь рендерить картинку на контроллере (например, печатать с флешки), то в RAM должна поместится картинка + рендер. Можно схитрить и использовать дополнительную внешнюю память (даже не обязательно RAM), но работать это будет медленнее.

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

Можно и меньше. Думаю, для непрерывной печати, лучше иметь одну строку в работе и одну строку в запасе. В теории, можно даже дробить одну строку. Если картинку рендерит ПК, то, как показал опыт предыдущей части, при подключении по USB, МК может получать буфер такого размера, какого ему удобно:

Хотя RxBuffer имеет размер PRNT_RX_DATA_SIZE = 512, я использовал PRNT_DATA_FS_OUT_PACKET_SIZE = 64

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

И есть нюанс у USB. Вроде, он работает на прерываниях - без DMA и интеграции модулем в RTOS. Боюсь может получится так, что запрос следующей порции данных может повлиять на процесс печати.

F411, кажется, уже подошла к своему пределу и не может выдать требуемых таймингов на GPIO, до упора в RAM или Flash ещё далеко. Нужно иметь порядка 100 нс (на это рассчитана библиотека для формирования сигналов), а сейчас, в лучшем случае, получается выдать 250-275 нс даже при увеличении частоты татирования до 72 и 96 МГц. Так что переезд на H753 уже выглядит не как не далёкая перспектива, а необходимость для продолжения развития проекта

Мне просто показалось, что желательно двигать головой без остановок, пока печатается строка. Так точнее. А когда строка напечаталась, можно и подождать следующую порцию растра от драйвера.

Кроме GPIO ещё интерфейсы QSPI, SDIO и LCD могут достаточно чёткие тайминги выдать, кстати.

Могут, но для одного картриджа надо контролировать 12 ног одновременно, мне не хватит интерфейсов :D поэтому я остановился на связку GPIO->BSRR + TIM + DMA. Насколько понял, Spritetm использовал I2S, но я не разбирался подробно с его кодом

У LCD ног достаточно. Причём можно воспользоваться его штатными сигналами синхронизации.

Я сам пробовал работать с такой связкой, только через GPIO->ODR - для текстового ЖК аппаратный экранный буфер, например, делал. Но с такими жёсткими таймингами не встречался. И, кстати, не во всех STM эта связка у меня заработала, до конца не разобрался.

Про DMA можно ещё углубиться в описание, и разобраться с настройкой приоритета и буферизации. Это может улучшить тайминги. Ещё не забыть, что DCLK - это сам таймер, его паттерн не нужно в DMA пихать. И таймеры в STM32 умеют синхронизироваться по-разному для генерации паттернов. Ну и при преобразовании уровней к 9-16 В вполне можно какую-то дискретную логику прикрутить, чтобы где-то паттерн упростить.

Так потихоньку программно и FPGAшку можно во многих задачах заменить)))

У LCD ног достаточно. Причём можно воспользоваться его штатными сигналами синхронизации

С LCD я пока не знаком так близко (как, в принципе, с большей частью embedded). У STM32H7 есть аппаратный LСD контроллер. Если действительно завязаться на него, то 24-битной версии хватит на два картриджа сразу)

Так потихоньку программно и FPGAшку можно во многих задачах заменить)))

Никогда не cвязывался c FPGA и ПЛИС в целом. Но мне приходилось слышать как программную логику переносили на ПЛИС, так что было бы круто запрограммировать какую-нибудь ту же FPGA на управление принтером) или хотя бы картриджем) передавая ему RGB пиксель, который сразу преобразуется в необходимую последовательность сигналов).

GPIO->ODR - для текстового ЖК аппаратный экранный буфер, например, делал

Насколько я знаю, BSRR работает быстрее и атомарен, в отличие от ODR.

С ODR работать проще - в него сразу помещается нужное значение для всего порта. Мне кажется, я когда-то использовал ODR для управления матрицей на адресных светодиодах

Я пока всё таки на стороне BSSR с синхронизацией по таймеру. Он более гибок и даёт возможность "прямой" реализации любого интерфейса.

Про DMA можно ещё углубиться в описание, и разобраться с настройкой приоритета и буферизации

Даже выдавая высший приоритет DMA и устанавливая самую высокую скорость на GPIO - анализатор не отображает никакого влияния. В данный момент упор, видимо в таймер - его тактирование очень близко к шине APB и SYSCLK, а значит callback таймера вызывается довольно часто и, вероятно, его количество тактов > количества тактов, необходимых таймеру.

Ещё не забыть, что DCLK - это сам таймер, его паттерн не нужно в DMA пихать

Не могу полностью согласиться. В диаграмме из статьи на Hackaday с реального принтера можно увидеть смещение S1-S5 относительно DCLK, так что нет полной уверенности он эквивалентен таймеру. Возможно это артефакты в работе принтера или анализатора - нет уверенности. И библиотека от Spritem и PrintSpider_Arduino генерирует с дублированием 0 и 1 (надо анализировать зачем, для меня это немного странно), поэтому пока что таймер должен быть в 2 раза быстрее DCLK.

Тут в новостях проскочило https://www.crowdsupply.com/open-tools/open-printer

В принтере могут использоваться картриджи HP 63 (US) и HP 302 (Europe), без DRM, привязок к производителю и ограничений на перезаправку. Допускается установка одного чёрно-белого или одного цветного картриджа, а также обоих картриджей (чёрно-белый + цветной). Поддерживается печать как на 27-миллимертровой рулонной бумаге, так и на отдельных листах A4 и A3. В черно-белом режиме обеспечивается печать с разрешением 600 dpi, а в цветном - 1200 dpi.

Для управления работой устройства задействована плата Raspberry Pi Zero W c выводом на 1.47-дюймовый TFT-экран (172 x 320) и переключением режимов при помощи вращающегося регулятора. Для управления картриджем применяется микроконтроллер STM32. Для взаимодействия с внешними устройствами заявлена поддержка USB Type-C (для подключения к компьютеру), USB Type-A (для устройств хранения), Wi-Fi 802.11ac и Bluetooth 4.1.

Интересно, на фотографиях выглядит вполне неплохо (правда вид на стене заставляет задуматься повесить это в туалете). Классно что, по сути, они делают компактный плоттер. Хорошая идея разделить коммуникацию и контроль печати по двум контроллерам. В своей первой статье я тоже рассматривал такую возможность как способ не упираться в производительность STM32.

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

Sign up to leave a comment.

Articles