Timers por interrupciones. Están para eso.
Retardos me parece que nunca he usado de mas de 50µs, y pocas veces, cuando necesito esperar ese tiempo pienso a ver que puedo hacer de utilidad que tarde mas o menos ese retardo.
Por ejemplo en su día esperar la respuesta del conversor AD tardaba 14µs, busqué unas cuantas instrucciones útiles que tardaban mas o menos eso y las intercalé entre la instrucción que lanzaba el conversor y la que usaba el resultado.