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させています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#define BLINK_GPIO CONFIG_BLINK_GPIO void app_main(void) { /* Configure the IOMUX register for pad BLINK_GPIO (some pads are muxed to GPIO on reset already, but some default to other functions and need to be switched to GPIO. Consult the Technical Reference for a list of pads and their default functions.) */ gpio_pad_select_gpio(BLINK_GPIO); /* Set the GPIO as a push/pull output */ gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT); while(1) { /* Blink off (output low) */ printf("Turning off the LED\n"); gpio_set_level(BLINK_GPIO, 0); vTaskDelay(1000 / portTICK_PERIOD_MS); /* Blink on (output high) */ printf("Turning on the LED\n"); gpio_set_level(BLINK_GPIO, 1); vTaskDelay(1000 / portTICK_PERIOD_MS); } } |
この「BLINK_GPIO」→「CONFIG_BLINK_GPIO」の上にマウスカーソルを持っていって右クリック→「Open Declaration」をクリックすると”5″、すなわちIO5だとわかります。
実際にIO5とGNDの間にLEDと抵抗(1kΩくらい)を入れてやるとLチカします。ここはハードコーディングで”0″などとしてIO0などにすることも当然できますので任意のIOポートを選択して下さい。
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 |
IO13 | TCK | AD0 |
IO12 | TDI | AD1 |
IO15 | TDO | AD2 |
IO14 | TMS | AD3 |
GND | GND | GND |
続いて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」のテキストボックスのところに
1 2 3 |
mon reset halt flushregs set remote hardware-watchpoint-limit 2 |
の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系も業務用マイコンとして使える目処が立ちますね。