NeoPixel
シリアル通信で発光制御可能なLED全般として呼ぶ。
stm32の場合、タイマーを使う方法、シリアル通信(UART,SPI等)を使う方法がある。
タイマーでの実装
0、1の信号をPWMタイマーのDutyで再現し、DMAを用いて周期毎にDutyを更新する。
この場合、一回につき24つのDutyの設定が必要になる。シリアルでつなぐLEDの数が増えるとそれに合わせて設定用配列がどんどん大きくなることには注意する。
周期の計算をしてみる。

マイコン内蔵RGBLED WS2812C-2020より引用(2025年11月1日閲覧)
それぞれのCode(0,1)を満たすようにPWMの周期を決定したい。
$$
\rm{T0L}+\rm{T0H}=\rm{T1L}+\rm{T1H}=\rm{PWM\_Period}
$$
の関係を満たすように値を選択したい。すべての要素が等しくマージンを取れるような値としては、$\rm{PWM\_{Period}}=\rm{1270ns}$として、
| 時間(ns) | |
|---|---|
| T0H | 325 |
| T1H | 635 |
| T0L | 945 |
| T1L | 635 |
とすれば良い。この組み合わせではすべての要素が等しく55nsのマージンを有する。
しかし、タイマーでの実装の容易さを考えると、$\rm{PWM\_{Period}}=\rm{1200ns}$として、
| 時間(ns) | |
|---|---|
| T0H | 300 |
| T1H | 600 |
| T0L | 900 |
| T1L | 600 |
とするほうが良さそう。T1H,T1Lのマージンが20nsに減ってしまうが、タイマーでの実装の際は最大300nsが作れれば組み合わせはどうとでもなる。上の方法だと5nsを作れないといけない。