Пару вечеров промучился с реализацией протокола WS2815 на STM32F103: все никак не получалось ШИМом с DMA выдавать нужное количество импульсов так, чтобы после последнего импульса линия устанавливалась в нуль. Пришлось в итоге использовать грязный хак. В комментариях я на этот счет высказался и добавил вариант для низких частот. Дело в том, что чтобы выйти в нуль, необходимо до генерации UEV установить регистр TIM1->CCR1 в нуль. На больших частотах накладные расходы на вход в прерывание таковы, что если это делать "как нужно" (в прерывании tim1_cc_isr), получается короткий лишний импульс. Поэтому на малых скоростях устанавливаем регистр в нуль внутри прерывания по переходу 1->0, а на больших — прямо внутри прерывания DMA. Попытки манипуляции с прелоадом этого регистра не увенчались успехом (либо появлялся ложный первый импульс - копия предыдущего, либо пропадал последний). Так что, оставлю такое рукожопие. Лента светится:
Простейший сниппет практически полностью реализует нужный функционал (обработка внутри прерываний HT и TC половинок буфера DMA, а также изменение его содержимого между передачами внутри основного цикла). Короткий видеоролик с демонстрацией того, как это работает. Теперь можно допилить сам сниппет по работе с лентой. Я думал было тетрис для дочки сделать, но потом к ужасу своему осознал, что небольшое поле 15×30 точек потребует аж 450 светодиодов! А это — 7.5 метров ленты, почти на 4000 рублей… Так что, после экспериментов сверну этот метр ленты и спрячу с остальными железячками "на будущее".