При беглом анализе сложилось впечатление что состояние пинов Marlin
генерирует программно, получая прерывание от таймера. Более высокую
частоту чем таймер получает просто в программном цикле внутри
прерывания, несколько раз программно дрюкая ножку. И похоже что
система не работает в мультитаске, на генерирование STEP скорее
всего тратится 100% времени, прерываясь на задачи опроса в тот
момент когда один из движков доезжает до конца. Прерываний
несколько, но они все вспомогательные, см. code_structure.html
https://marlinfw.org/docs/development/code_structure.html