先日実装したマイコン内蔵フルカラーLEDのOSTW3535C1Aを、STM32から制御する。CubeMXとHALを使用するが、今回はCubeMXの設定までを示す。

NeoPixel系のLEDであれば大体同じ制御になっているはずで、必要に応じてタイミングを調整すれば、同じように制御ができると思う。

制御方法について

NeoPixel系のLED制御では、1本の信号線で制御データを送信する。パルス幅の違いによって各ビットの0と1を送信し、各LEDのRGB値を設定する。

必要なことは、図のようなパルスを、制御するLEDの数×24ビット分、連続で送信することである。データシートには各期間の許容範囲が記載されているが、中央値辺りをとると

  • 1つのパルス当たりの周期 1.25us
  • 0のパルス幅 0.3us
  • 1のバルス幅 1us

といったところになる。

これはタイミングとしてはかなり速いので、ソフト的に処理していくのはなかなか厳しい。そこで、PWMとDMAを使用していく。

また、最後のRETというのは、1回分のすべてのLEDのパルスを送信した後、次のパルス送信を開始する前に、Loを継続しておかなくてはいけない期間である。

PWMとDMAの設定

1ビット分、つまり1つのパルスをPWMの一周期として、PWMでパルスを生成する。デューティー比を適切に変えていくことで、上記のようなパルスを生成することができる。以下に、実際のCubeMXの設定を示す。

 

TIM1のCH1をPWM用として使用している。Clock SourceにInternal Clockを選択。今回はシステムクロックを48MHzとしているが、プリスケーラに3を設定することでTIM1のクロックを12MHzとする。ピリオドに14を設定すると、1周期が15クロック分、1.25usとなる。

この設定で、パルス値として12を入れるとパルス幅1usとなり、1を表すパルスを生成できる。同様にパルス幅で4を入れるとパルス幅0.33usとなり、0を表すパルスを生成できる。

次はDMAの設定。ModeはNormalとし、自動的に繰り返さずに一回で終わる形としている。LEDの表示を更新する度に、新しいデータをセットしてDMAを開始するようにしているためである。Peripheralは16ビットのHalf Word単位、MemoryはByte単位に設定する。インクリメントはMemory側だけである。

以上の設定で、DMAにデータ列を読ませることで自動的に制御信号を送信することができる。