J'ai jeté un oeil à la librairie Arduino, et, comment dire...
Je ne parle pas couramment l'Arduino, mais j'ai trouvé cela un peu compliqué (tout en reconnaissant l'énorme travail qu'il y dedans pour s'adapter à plein de cas), et comme d'habitude sur ces librairies, les timings sont quasiment toujours contrôlés directement par le code, ce qui me gêne.
Dans mon cas, j'ai de l'USB qui tourne sur la carte, les fonctions ne doivent pas se perturber mutuellement, et je ne veux pas perdre de temps avec des boucles de délai, même si ici les transferts sont brefs jusqu'à un nombre confortable de leds.
J'étais d'abord parti sur l'utilisation d'un PWM et d'un timer, en jouant sur les paramètres pour chaque bit. Il fallait donc, en première approche, une interruption par bit. J'ai abandonné cette piste assez usine à gaz et qui ne fonctionnait pas encore, j'ai finalement utilisé un périphérique SPI tournant plus vite que le débit led, 4MHz dans mon cas. Il faut plusieurs bits d'un transfert spi pour coder un bit led, ou même plusieurs mots pour le reset, mais ce n'est pas un problème. Les timings sont directement obtenus et indépendants du code, et comme le spi fonctionne en DMA, il me suffit de préparer la table pour la bande complète de leds, ce qui ne prend que quelques dizaines de microsecondes, et je lance ensuite le DMA sur le spi. Le transfert complet se fait automatiquement sans aucune intervention du processeur, qui reste entièrement disponible.
A la réflexion, le DMA devrait aussi être applicable au PWM, mais il y a quelques points particuliers à vérifier et moins efficace que le spi.