eddy_em: (Default)
[personal profile] eddy_em
Пару вечеров промучился с реализацией протокола WS2815 на STM32F103: все никак не получалось ШИМом с DMA выдавать нужное количество импульсов так, чтобы после последнего импульса линия устанавливалась в нуль. Пришлось в итоге использовать грязный хак. В комментариях я на этот счет высказался и добавил вариант для низких частот. Дело в том, что чтобы выйти в нуль, необходимо до генерации UEV установить регистр TIM1->CCR1 в нуль. На больших частотах накладные расходы на вход в прерывание таковы, что если это делать "как нужно" (в прерывании tim1_cc_isr), получается короткий лишний импульс. Поэтому на малых скоростях устанавливаем регистр в нуль внутри прерывания по переходу 1->0, а на больших — прямо внутри прерывания DMA. Попытки манипуляции с прелоадом этого регистра не увенчались успехом (либо появлялся ложный первый импульс - копия предыдущего, либо пропадал последний). Так что, оставлю такое рукожопие. Лента светится:

Простейший сниппет практически полностью реализует нужный функционал (обработка внутри прерываний HT и TC половинок буфера DMA, а также изменение его содержимого между передачами внутри основного цикла).
Короткий видеоролик с демонстрацией того, как это работает. Теперь можно допилить сам сниппет по работе с лентой. Я думал было тетрис для дочки сделать, но потом к ужасу своему осознал, что небольшое поле 15×30 точек потребует аж 450 светодиодов! А это — 7.5 метров ленты, почти на 4000 рублей… Так что, после экспериментов сверну этот метр ленты и спрячу с остальными железячками "на будущее".

April 2025

S M T W T F S
  1 23 45
67 89101112
13141516171819
20212223242526
27282930   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 22nd, 2025 06:48 am
Powered by Dreamwidth Studios