That’s a good point, I was also wondering about that a while ago. After conducting a small research, I found out that there are some more sophisticated controllers with SPI/UART interfaces, such as the L6470 and the TMC2130/TMC2208. They can be programmed to send pulses in a specific rate, and if I am not mistake, also to accelerate/decelerate.
However, they are significantly more expensive (5 to 6 times comparing with the DRV8825), and writing drivers for them requires digging into the datasheet and learning the specific protocol of the chip you are working with. For instance, here is a basic program I wrote for controlling a TMC2130 driver in Espruino:
As you can see, even if we want to step up this driver to work in the usual DIR/STEP pin configuration, it takes a whole bunch of code just to set this up.
So you can offload some of the work from the main processor, but you pay with a more expensive chip, added complexity, and code that is specific to the stepper drive you go with and can’t be easily reused with other drivers.
By the way, if you are interested, here is the stepper driver comparison table I made a while ago: