ESP32をPlatformIO上でJTAG(FT232H)デバッグする

環境

OS:Windows10

MacでもLinuxでも動くと思います。

エディター:Visual Studio Code

無料版を利用。

開発環境:PlatformIO

Microsoft純正のArduino開発用プラグインはArduino IDEをコマンドラインで呼び出しているだけですが、PlatformIOは内部にコンパイラからデバッガーまで内包しています。Windows上でOpenOCDを利用したデバッグ環境を構築するのはかなり大変なので助かります。

ESP32がなにもしなくてもすぐに開発出来る点が非常に便利!

JTAG:CJMCU-232H

「Adafruit FT232H Breakout」あたりがたぶんベースで、ちょびっとピン配置が違います。外国サイトで買うと1000円以下で手に入ると思います。

ESP32:ESP32 devkit

技適マーク付きのESP32ボードであれば大抵大丈夫だと思いますが、ENピンが出ている必要があります。

上記みたいにたまーに、ENピンがないボードがあるので注意しましょう。

事前準備(自動書き込み)

私のESP32ボードはWindows上だと自動書き込みができないので、ENとGNDの間に適当なサイズのコンデンサを追加します。

自動書き込みができる環境の人は必要ありません。ターゲットのプログラムを転送して実行できることを確認してください。

ドライバ更新

Zadigを利用してドライバをWinUSBに更新します。更新したあとにUSBを抜き出しして新しいドライバを読み込ませます。

結線

FT232HESP32
AD0GPIO13
AD1GPIO12
AD2GPIO15
AD3GPIO14
AC1EN

必要な結線は上記5本です。ENは結線なしで、リセットのタイミングで自分で押しても動きましたが、結線をおすすめします。

platformio.iniの更新

[env:esp32doit-devkit-v1]
platform = espressif32
board = esp32doit-devkit-v1
framework = arduino
debug_tool = minimodule

最後の行に「debug_tool = minimodule」を追記します。だた、minimoduleはFT2232Hを搭載しており、今回使うのはもう少し安いFT232Hですので、修正が必要です。

機能的にはほとんど同じチップですが、FT2232HはシリアルやJTAGが2chあるのに対してFT232Hは1chしか利用できません。

FT2232Hだと1chをJTAGにして、2chをシリアルに設定してプログラム転送とJTAGデバッグを同時に実施することが可能です。

USBでプログラムを転送できるESP32 devkitを使う限りはFT232Hでもいいですが、思ったより値段差はありません。FT2232Hの方が2列ピンヘッダーなのでブレッドボードだと使いにくいですが、メスケーブルとかで引き回せば大丈夫かな?

minimoduleの設定変更

デフォルトだと「FT2232H MiniModule」という名前のデバイスをデバッグで利用しようとします。なので今回利用するボードに書き換える必要があります。

%HOMEPATH%.platformio\packages\tool-openocd-esp32\share\openocd\scripts\interface\ftdi\minimodule.cfg

上記が設定ファイルなので、内部を書き換えます。

#
# FTDI MiniModule
#
# http://www.ftdichip.com/Support/Documents/DataSheets/Modules/DS_FT2232H_Mini_Module.pdf
#

interface ftdi
ftdi_device_desc "FT2232H MiniModule"
ftdi_vid_pid 0x0403 0x6010

# Every pin set as high impedance except TCK, TDI, TDO and TMS
ftdi_layout_init 0x0008 0x000b

# nSRST defined on pin CN2-13 of the MiniModule (pin ADBUS5 [AD5] on the FT2232H chip)
# This choice is arbitrary. Use other GPIO pin if desired.
ftdi_layout_signal nSRST -data 0x0020 -oe 0x0020

デフォルトがこんな感じです。書き換える場所はデバイスの名前とvid、pidです。

Zadigの画面を参考にしてデバイス名を「Single RS232-HS」にして、pidを6014に変更します。

#
# FTDI MiniModule
#
# http://www.ftdichip.com/Support/Documents/DataSheets/Modules/DS_FT2232H_Mini_Module.pdf
#

interface ftdi
#ftdi_device_desc "FT2232H MiniModule"
ftdi_device_desc "Single RS232-HS"
#ftdi_vid_pid 0x0403 0x6010
ftdi_vid_pid 0x0403 0x6014

# Every pin set as high impedance except TCK, TDI, TDO and TMS
ftdi_layout_init 0x0008 0x000b

# nSRST defined on pin CN2-13 of the MiniModule (pin ADBUS5 [AD5] on the FT2232H chip)
# This choice is arbitrary. Use other GPIO pin if desired.
ftdi_layout_signal nSRST -data 0x0020 -oe 0x0020

変更後のファイルが上記です。変更したらVisual Studio Codeを再起動して、設定をリロードしてください。

デバッグ(F5)

止まりました! そして変数が見えます。ただ最初にアカウント作って、PlatformIOにログインしていないとデバッグ機能が利用できません!

あと、きれいにソースコードの場所で停止しなかったり、不安定です。ブレークポイントを消したり追加したりすると止まってくれる率があがります。

個人的には使わないかな。。。シリアルコンソールに出力とかしたほうが楽な気がします。

その他のJTAGボード

FT2232H

FT232HよりはFT2232Hの方がメジャーなので情報がある気がします。パソコンでI2CとかSPI通信をする際にも利用できるはずです。

Olimex ARM-USB-TINY-H

Amazonには高いものしかないですが、5000円前後で購入できるJTAGです。中身は
FTD2232みたいなので、箱とケーブルが付属している感じでしょうか?

参考ページ

VSCode+PlatformIOを使ったESP32のデバッグ開発環境

https://qiita.com/nishinohi/items/d1c1a517f26394c492c3

上記に大体くわしく書いてあります! FT2232H MiniModuleを利用する場合にはこのページを見たほうが適していると思います。

オフィシャルのデバッグ方法解説ページ

Get started with Arduino and ESP32-DevKitC: debugging and unit testing

使い方はこちらがわかりやすかったです。

オフィシャルのMini-Module解説ページ

Mini-Module FT2232H

ドライバーの入れ方へのリンクや、ピンアサイン、対応しているボードなどの情報があります。

ESP32とFT232H配線

First dabblings with ESP32 FT232H JTAG and VisualGDB

わかりやすい図がありました。

コメントする

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

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)