ESP32のDebug機能を試す

過去記事でTTGO T-Camera(ESP32)を使ってカメラ、Wifi、BLEなどの機能を実装してきましたが、いずれもTemplate Projectから適当なProjectを選び、多少カスタマイズしてBuild、Flashして動作確認、という流れでやってきました。

しかし実際の業務ならDebug機能を使い、任意の場所でbreakしたりそのときの変数値を確認したり、step実行したりしたいところです。

ESP32にもそういったDebug機能があるようなので試してみました。

ただし今まで使っていたTTGO T-CameraではDebugで使うJTAG機能端子が既にカメラなどに使われているので使えません。

本家EspressifではESP-WROVER-KITが推奨されていて確かにJTAG機能が付いていて便利ですが少しお高い(\4,500~くらい)のといきなり完成品でやるのもつまらないので、ESP32-DevKitC + AE-FT232HL(FT=232Hが載った秋月電子製ボード)の組み合わせでやりました。両方とも私は秋月電子から購入しています。これとて両方合わせて購入すれば約\3,000なのでESP-WROVER-KITより格段に安いわけではないですが。

FT232HはMPSSE(Multi-Protocol Synchronous Serial Engine)機能を備えていてこの機能がないとJTAGとしては使えません。FTDIチップでは他にFT2232D、FT2232H、FT4232HがMPSSE機能を備えています。

ではESP32-DevKitCとAE-FT232HLがそろったところでESP32のDebug機能を試していってみましょう!!!

私の今回の環境は以下のとおりです(いつもですが)。

  • Windows10 Pro 20H2
  • ESP-IDF v4.0.1v4.1
  • Eclipse 2020-03(4.15.0)
  • そしてもちろんESP32-DevKitC + AE-FT232HL

また参考にしたサイトや雑誌は以下などです。

EclipseでLチカプロジェクト

まずはEclipseでDebug機能確認用のLチカプロジェクトを作ります。

Eclipseを立ち上げたあと「File」→「New」→「Espressif IDF Project」を選択するとウィザードが表示されます。

ここでProject nameに「blink」などと入れて「Next」(「Finish」ではなく)をクリックします。

「Create a project using one of the templates」にチェックを入れて「Available IDF Template」の中から”blink”を選択して「Finish」をクリックします。

できたblink project(Lチカ)の左上の緑丸に白三角ボタンをクリックしてbuild & flashします。

これでLチカprogramが書き込まれています。どこがLチカしているかというと「blinkプロジェクト」→「main」→「blink.c」を開くとBLINK_GPIOが1秒おきにOn/Offさせています。

この「BLINK_GPIO」→「CONFIG_BLINK_GPIO」の上にマウスカーソルを持っていって右クリック→「Open Declaration」をクリックすると”5″、すなわちIO5だとわかります。

実際にIO5とGNDの間にLEDと抵抗(1kΩくらい)を入れてやるとLチカします。ここはハードコーディングで”0″などとしてIO0などにすることも当然できますので任意のIOポートを選択して下さい。

ESP32-DevkitC & AE-FT232HL & LED 配線

ESP32-DevKitCとAE-FT232HLとLEDとをICクリップで接続しました。

デバッグ環境の構築

ではデバッグ環境を構築していきます。

まずAE-FT232HLのドライバー変更です。これをしないとJTAGアダプターとして使用できません。

ドライバーの書き換えにはZadigツールを使用します。Zadigツールはhttps://zadig.akeo.ie/からダウンロードして実行します。

「Options」→「List All Devices」を選択してチェックを入れます。

デバイスを「Sngle RS232-HS」を選択して変換後Driverに「WinUSB(v6xxxxx)」を選択後、「Reinstall Driver」ボタンをクリックしてドライバーを書き換えます。

次はESP32-DevKitCとAE-FT232HLの接続です。

ESP32-DevKitCとAE-FT232HLは以下の5本を接続します。

ESP32ピンJTAG信号AE-FT232HL
IO13TCKAD0
IO12TDIAD1
IO15TDOAD2
IO14TMSAD3
GNDGNDGND
配線表

続いてOpenOCDのインストール/実行をします。OpenOCDのインストールはEspressifサイトの「Get Started」ページに従ってESP-IDFをインストールしているとOpenOCDもインストールさます。私もインストールされていました。

OpenOCDの実行にはまずコマンドプロンプトを立ち上げます。メニューから「ESP-IDF」→「ESP-IDF command prompt」でもいいです。Change DirectoryでESP-IDFをインストールしたフォルダー(C:\users\xxx\ESP-IDFなど)に移動してexport.batを実行します。

これでOpenOCD関連フォルダーにpathが通ります。

openocd –versionでpathが通っていることが確認できます。

この状態で”openocd -s share/openocd/scripts -f interface/ftdi/um232h.cfg -f board/esp-wroom-32.cfg”と打つとエラーしなければOpenOCDは実行されます。

’esp-wroom-32.cfg’はdeprecated(非推奨)だったり、”Error:type ‘esp32’ is missing vit2phys”などと出ていますがとりあえずは私の環境では動きました。openocd -s 以降についてはEspressifサイトの「Configuration of OpenOCD for specific target(特定のターゲットに対する OpenOCD の構成)」ページに解説がありますが私はまだ(これからも?)よく見ていません。

OpenOCDが実行されたあとにEclipseからDebuggerを実行していきます。

私はこのまずOpenOCDを実行させてからEclipseのDebuggerを実行するとというのがわからなかったのでハマりました。わかってからも少し面倒だなとは思いましたがOpenOCDの実行はEclipseのDebuggerの起動とは関係なく最初の1回だけのようなのでそんなに面倒ではないのかなとも思います。

では続いてEclipseのDebuggerの設定と実行です。

EclipseのDebuggerの設定と実行

EclipseのDebuggerの設定と実行をしていきます。

さきほどの”blink”プロジェクトを開いた状態で「Run」→「Debug Configurations…」を選択します。

「GDB Hardware Debugging」をダブルクリックします(新規作成)。

「Main」タブで「C/C++ Application:」に”build/blink.elf”を「Browse…」ボタンから選択します。

「Apply」ボタンを押してから「Debugger」タブを選択します。

GDB Command:に”xtensa-esp32-elf-gdb”と入力します。

「Port Number」に”3333″と入力します。

「Apply」ボタンを押してから「Startup」タブを選択します。

「Initialization Commands」のテキストボックスのところに

の3行を入力します。

「Load image」チェックボックスのチェックを外します。

「Set breakpoint at」チェックボックスにチェックを入れて、その後ろのテキストボックスに”app_main”と入力します。

「Resume」チェックボックスにチェックを入れます。

「Apply」ボタンを押してから「Close」ボタンをクリックして「Debug Configurations」ウィザードを終了します。

左上の左から2番目のドロップボックスでさきほど設定した”blink Configuration”を選択して、左上の虫マークの”Debug”アイコンをクリックします。

”デバッグパースペクティブ”に切り替えますか?という問い合わせがあるので「switch」ボタンをクリックします。

毎回聞かれたくなければ「Remember my detection」チェックボックスにチェックを入れておきます。

“app_main”の先頭のところでbreakがかかった状態でDebug画面が開きます。

あとはおなじみのデバック作業ができるようになります。

Resume(F8)で再開、行番号の左側をダブルクリックするとbreak pointが設定されてそこでbreakがかかります。以降、”gpio_set_level(…)”のところをStep Over(F6)する度にLEDがOn/Offします。

Eclipseでデバック作業ができるとEclipseを使う意味がはっきり出てきますし(単にbuild & flashだけだと実はそんなにEclipseの必然性がない(;_;) )、ESP32系も業務用マイコンとして使える目処が立ちますね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ESP32

前の記事

モダンJavascript