Por retrasos de hardware me refiero a 'Temporizadores'.
La ventaja de usar temporizadores para realizar un retraso es que proporcionan una manera de permitir el conteo asíncrono. Al utilizar un "Retardo de software", obliga al controlador a poner todos sus recursos en el procesamiento de algún tipo de bucle (incrementando una variable hasta un valor determinado) y, por lo tanto, bloqueando el resto de la ruta de ejecución del código.
Si la demora de hardware es tan buena, ¿por qué se necesitan demoras de software?
Un retardo de software es más fácil de implementar y puede ser suficiente si es solo un retardo muy corto que no interrumpe significativamente ninguna otra tarea en la ruta principal de procesamiento de código secuencial. Además, los temporizadores pueden estar en uso para otras tareas relacionadas con el hardware como la generación de PWM y pueden no ser "libres" para configurarse de acuerdo con sus requisitos de demora.
Otro caso de uso sería un retraso inicial que se requiere antes de que se ejecute el bucle principal. No habría necesidad de usar un retraso de hardware en ese caso.
Una última cosa que me viene a la mente es que una demora de software no requiere que las interrupciones se habiliten globalmente, mientras que es un requisito para demoras basadas en temporizador (al menos para el caso de uso común).