電子工作
gdb
openocd
ESP32
ESP-IDF

ESP32 を FT232H でつないで OpenOCD+GDBでデバッグ

More than 1 year has passed since last update.


はじめに

ESP32 にデバッガを繋ぐ方法を書きます。

今時の統合開発環境に慣れてしまって、ブレイクポイントを仕掛けたり、変数の値を読み取ったりできない開発環境にはもう戻れない体になってしまったので、何とかしてみましたw

必要なものとしては、ハードウェアでは FT232H、ソフトウェアは OpenOCD と GDB です。GDB はESP-IDF(toolchainの方かも)の中に含まれてます。

新たに購入するものは秋月の AE-FT232HL ¥1,200- (と配線少々)のみです!

参考資料は Debugging — ESP-IDF Programming Guide 他、ググりながら書いております。


前提条件

ESP32(ESP-WROOM-32)でLチカ (WindowsでESP-IDF使用) の環境構築が終わっていること


ソフトウェアの準備


OpenOCD

OpenOCD は、On-Chip Debugger のオープンな奴だと思うのですが、詳しいことは分かりませんw

JTAG と GDB の間に必要なモノなんだと思います。。。

とにかく必要なのでインストールします。パッケージはないみたいなので、ソースを取得してビルドします。

以降、MSYSのシェルでの作業です。

まず、OpenOCDのビルドに必要なパッケージを次のコマンドで取得します。

pacman -S libtool pkg-config automake autoconf mingw-w64-i686-libusb

(Windows+MSYS環境で必要最小限のパッケージを調べるのに苦労しました。)

次に、OpenOCDをESP32対応させたもののソースを取得します。作業ディレクトリはMSYSのホームディレクトリでいいと思います。

git clone --recursive https://github.com/espressif/openocd-esp32.git

ビルド作業に必要な環境変数を設定します。

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/mingw32/lib/pkgconfig

ビルドします。

cd openocd-esp32

./bootstrap ←数秒

./configure ←数分

make ←10分以上

make install ←1分ぐらい

追記 2017/05/05

最新版(2017/04/24) のソースをmakeすると、esp108_apptrace.cの630行目で符号付きと符号なしの比較をしていると怒られてしまいます。

右辺の wr_chunk_len を int でキャストするとコンパイルが通ります。

公式文章では make install をしてないんですが、個人的にはインストールしたほうが好きなので、そうしたことを前提に話を進めていきます。

ちなみにバイナリ本体は /usr/bin/openocd に、設定ファイル類は /usr/share/openocd/ にインストールされてます。

ビルド・インストールが終わったので、openocd-esp32 フォルダは不要となります。

cd ..

rm -Rf openocd-esp32 ←やらなくてもいい

次に OpenOCDの設定ファイルを作ります。

元となる設定ファイルを次のURLから取得します。

https://raw.githubusercontent.com/espressif/esp-idf/master/docs/esp32.cfg

curl コマンドが使えるので、それで取得しましょう。(自分はwget派なんだけど入ってなかった)

curl -O https://raw.githubusercontent.com/espressif/esp-idf/master/docs/esp32.cfg

そして、取得した esp32.cfg を以下の通り書き換えます。

source [find interface/ftdi/tumpa.cfg]



source [find interface/ftdi/um232h.cfg]

adapter_khz 200



adapter_khz 2000

esp108 flashbootstrap 1.8 の先頭に#を付けてコメントアウト

#esp108 flashbootstrap 3.3 の # を削除

コメントを除いて必要な部分だけ抜き出すを以下のようになります。


esp32.cfg

source [find interface/ftdi/um232h.cfg]

transport select jtag
adapter_khz 2000
source [find target/esp32.cfg]
esp108 flashbootstrap 3.3

コピペして作る場合は改行コードに注意してください。(CR+LFでなく、LFだけにしましょう)


ハードウェアの準備

ESP32との接続には、秋月電子のFT232HL ハイスピードUSBシリアル変換モジュール [AE-FT232HL] を用います。

K-06503.jpg

MPSSE(JTAG)機能が使えることが条件なので、ESP32のプログラム書き込みによく用いられているFT232RLは使用できません。

プログラム書き込み自身にはFT232RLでも可です。

図で表すと、下図のようになります。

FT232HL.png

水色のところが既存配線で、今回新たにオレンジ色の部分の接続をします。(詳細は後で)

flash書き込みにFT232HLを用いることも可能ですが、コストメリットがありませんし、同じものが2つあると混乱すると思いますw

尚、2ch品1個でまとめることができるのかは、試してないのでわかりませんが、たぶんいけそうな気がしています。 追記→成功しました


ドライバインストール

FT232HL のドライバをインストールします。USBポートに挿すと最初は仮想COMポートとして認識されると思いますが、それでは JTAG の機能が使えないので、ドライバを置き換える必要があります。

ドライバの置き換えは手動でやると面倒なのですが、置き換え専用の便利なアプリが存在します。

http://zadig.akeo.ie/ から Zadig for Windows Vista or later をダウンロードしてそれを使います。

ダウンロードした Zadig を起動し、Options → List All Devices を ON にします。

Zadig1.png

USBデバイス一覧(一番上のドロップダウンリスト)から Single RS232-HS を選び、置き換え後のドライバに WinUSB を選択し、Replace Driver をクリックします。

Zadig2.png

置き換えると、デバイスマネージャーから見えていた仮想COMポートが消えて、ユニバーサル シリアル バス デバイス の下に、Single RS232-HS が現れます。

尚、FT_Prog で FT232HL の EEPROM を書き換える必要はありません。


配線

AE-FT232HL と ESP32 の配線は以下の5本をつなぐだけです。

AE-FT232HLピン名
信号名
ESP32ピン名

AD0
TCK
GPIO13

AD1
TDI
GPIO12

AD2
TDO
GPIO15

AD3
TMS
GPIO14

GND
GND
GND

もちろんこの他に、今までと同様の、書き込み用の配線も必要です。

DSC_0875.JPG

この写真の例では、書き込み用のシリアルに自作の自動書き込み回路を使っています。


使ってみる


OpenOCD起動

MSYSのシェルで

openocd -s /usr/share/openocd/scripts/ -f ./esp32.cfg

で起動します。最後の esp32.cfg は、先ほど作った esp32.cfg のことです。パスが合うように指定しましょう。

初回起動時は Windows ファイアウォールが反応します。許可してあげてください。OpenOCDはTCP:3333と3334を使用します。

正しく動作していれば、コンソールに以下の様に出力されます。

$ openocd -s /usr/share/openocd/scripts/ -f ./esp32.cfg

Open On-Chip Debugger 0.10.0-dev-g90071eb (2017-02-26-14:59)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
adapter speed: 2000 kHz
force hard breakpoints
Info : clock speed 2000 kHz
Info : JTAG tap: esp32.cpu0 tap/device found: 0x120034e5 (mfg: 0x272 (Tensilica), part: 0x2003, ver: 0x1)
Info : JTAG tap: esp32.cpu1 tap/device found: 0x120034e5 (mfg: 0x272 (Tensilica), part: 0x2003, ver: 0x1)
Info : esp32.cpu0: Debug controller was reset (pwrstat=0x5F, after clear 0x0F).
Info : esp32.cpu0: Core was reset (pwrstat=0x5F, after clear 0x0F).


GDB起動

デバッガのCUIフロントエンド、GDB を起動します。

MSYSのシェルをもうひとつ開いて、開発中のソースがあるプロジェクトフォルダに移動し、次のコマンドを打ちます。

xtensa-esp32-elf-gdb -ex 'target remote localhost:3333' ./build/app-template.elf

最後の elf ファイルが、ESP32に書き込んだバイナリと同じものになるようにしてください。

起動すると、メッセージが出力された後、GDBのプロンプト (gdb) が表示されます。

$ xtensa-esp32-elf-gdb -ex 'target remote localhost:3333' ./build/app-template.elf

GNU gdb (crosstool-NG crosstool-ng-1.22.0-61-gab8375a) 7.10
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i686-host_pc-mingw32 --target=xtensa-esp32-elf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./build/app-template.elf...done.
Remote debugging using localhost:3333
0x00000000 in ?? ()
(gdb)

さて、gdb を使っていきましょう! と言いたいところですが、私は使い方を知りませんw

OpenOCD が起動していると、ESP32をリセットしたあとOpenOCDでブレイクがかかってLチカしなくなることは確認できると思います。GDBで再開したいのですが再開コマンドが分かりませんでした!!

しかし、GDBの調査はしません (`・ω・´)キリッ

ESP32をEclipse上でデバッグする に続きます。