ESP32-DevKitCをRGB LEDディスプレイに使ってみて,自作プログラムでももう少し高速にならないかと考えています。

せっかくなのでLEDディスプレイで使える中間色を増やしたいのが目的です。

HUB75規格のダイナミック点灯LEDディスプレイで128x32ドットマトリックスは何とかなりそうですが,HUB75E規格の128x64ドットともなるともっとチューンアップしないといけないですね。

という事で,描画速度アップに一番効きそうなRGBデータの転送のパラレル出力ができないかと試し中です。


まずはArduinoIDEESP32-DevKitC-V4を動かし,ロジアナで波形を観てみました。





1.digitalWriteによるデータ出力

 現行の方法はdigitalWriteでデータを出力しておき,出力値が揃ったところでクロックをかけています。

二つのPinに出力してみました。
HUB 規格への"R1G1B1R2G2B2"のbit出力っぽくはしています(^^;;;;;;;




このプログラムの出力波形です。



決してESP32のdigitalWriteが遅いわけではなく120nsぐらいのパルスは出るのです。問題は矢印のようなパルス間の遅れで,RGB 6bitのデータが出揃うまでに600nsぐらいはかかる事です。

128x64ドットのマトリックスなら1画面の描画に600nsX128X32で,ここだけで2.5msほどのロスになっています。

ここはチューンアップしたいところです。




2.ポートコントロールによるパラレル出力

 MCUの出力ポートに直接データを書き込むと,パラレルに複数のPinを同時にセッティングできるので,ESP32でも試してみました。

ポートコントロールの問題はMPUごとに出力や入力をコントロールするレジスタを調べないといけない事です。

先人のWeb記事などを参考にしながら,GPIOの2Pinと4Pinからパルスを出してみました。このプログラムもちょっとHUB規格のLEDへの出力を意識しています(^^;;;。

 



出力波形です。




データが出力レジスタにそのまま取り込まれて出力されていますV(^^)。

私にとっての難問は出力レジスタの物理アドレスは分かっても,そのアドレスに直接データを書き込む文法でした。

アセンブラならゴリゴリの物理アドレス先にも書き込めるのですが,,先人のサンプルを見回るとArduino言語では物理アドレスをポインタとして扱うようです。
というか,,アドレスってポインタですよね(^^)。

上のプログラムの定義部分がそれです。
#define  GPIO_OUT_W1TS   *(volatile unit32_t *)0x3FF44008

まず,”(volatile unit32_t *)”でレジスタの物理アドレス”0x3FF44008"を符号なし32bit整数値を格納するポインタ値として定義し,つぎにそのポインタが示す場所の値を"GPIO_OUT_W1TS"と定義する。という事ではないかと勝手に思っていますが,ほんとかな??(^^;;;;;;;

ま,これで動いてはいますので(^^)。



3.ESP32ーGPIOのレジスタとピンとの関係
ESP32-DEVKITの出力用レジスタとピンの関係をメモです。

このESP32-DEVKITなどのピンは役割をもつものが多く,また配置もきれいに並んでいないし,たくさんある機種によっても少しずつ違っているようで悩ましいです。ともかくボードに印刷されたピン名が頼りです(^^;;;;;。


 1) GPIO出力用レジスタ

プログラム例で使ったGPIO出力用レジスタの1つ"GPIO_OUT_W1TS_REG"です。

(以下,図表はEspressif Systems社のESP32 Technical Reference Manualからの転載・改編を含みます)



このレジスタは32bit長で0から31の各ビットに1をたてるとそのビットの桁に対応した番号のピンの出力がHIGHになる,セットレジスタです。

このレジスタと対の"GPIO_OUT_W1TC_REG"はビットに1をたてると対応したピンの出力がLOWになる,クリアレジスタですね。

それぞれのレジスタは物理的に決まったアドレスにあります。



プログラムではよくpinModeを使って出力ピンを設定していますが,設定するピン数が多い時は"GPIO_ENABLE_W1TS_REG"で設定すると1,2行ですみそうです(^^)。



2) ESP32-DeVKiTCのGPIOピン

 ESP32系のピンについては,今回使った私の手持ちのうちの一つでは,,,と言わなければいけないぐらい機種によると思います。

いくつか調べて手持ちのピンの役割と,出力に設定可能なピンを整理してみました。なお,上記サマリーのように32Pinから39Pinは別レジスタになっています。





今回の方針ではデータの書き込みに連続した6bitの場所が欲しいので,HSPIは諦めて,Pin12からPin17を使う事になりそうです。

ゆっくり,ぼちぼちと確かめながらです(^^)。



以下,参考にしたWebとピン配置図です。

ESP32 Pinout Reference: Which GPIO pins should you use?